You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.7 KiB

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { generateFuturesOverview, generateFutureData, riskAlerts, aiMarketAnalysis } from '../utils/mockData';
// 模拟异步获取期货概览数据
export const fetchFuturesOverview = createAsyncThunk(
'futures/fetchOverview',
async () => {
// 模拟API请求延迟
await new Promise(resolve => setTimeout(resolve, 500));
return generateFuturesOverview();
}
);
// 模拟异步获取单个期货详情
export const fetchFutureDetail = createAsyncThunk(
'futures/fetchDetail',
async ({ code, name }) => {
// 模拟API请求延迟
await new Promise(resolve => setTimeout(resolve, 500));
return generateFutureData(code, name);
}
);
// 模拟异步获取风险预警
export const fetchRiskAlerts = createAsyncThunk(
'futures/fetchRiskAlerts',
async () => {
// 模拟API请求延迟
await new Promise(resolve => setTimeout(resolve, 300));
return riskAlerts;
}
);
// 模拟异步获取AI市场分析
export const fetchAIMarketAnalysis = createAsyncThunk(
'futures/fetchAIMarketAnalysis',
async () => {
// 模拟API请求延迟
await new Promise(resolve => setTimeout(resolve, 400));
return aiMarketAnalysis;
}
);
const futuresSlice = createSlice({
name: 'futures',
initialState: {
overview: [],
selectedFuture: null,
riskAlerts: [],
aiAnalysis: null,
loading: false,
error: null
},
reducers: {
selectFuture: (state, action) => {
state.selectedFuture = action.payload;
},
clearSelectedFuture: (state) => {
state.selectedFuture = null;
}
},
extraReducers: (builder) => {
builder
// 处理fetchFuturesOverview
.addCase(fetchFuturesOverview.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchFuturesOverview.fulfilled, (state, action) => {
state.loading = false;
state.overview = action.payload;
})
.addCase(fetchFuturesOverview.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
})
// 处理fetchFutureDetail
.addCase(fetchFutureDetail.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchFutureDetail.fulfilled, (state, action) => {
state.loading = false;
state.selectedFuture = action.payload;
console.log('fetchFutureDetail fulfilled with:', action.payload);
})
.addCase(fetchFutureDetail.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
console.log('fetchFutureDetail rejected with error:', action.error.message);
})
// 处理fetchRiskAlerts
.addCase(fetchRiskAlerts.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchRiskAlerts.fulfilled, (state, action) => {
state.loading = false;
state.riskAlerts = action.payload;
})
.addCase(fetchRiskAlerts.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
})
// 处理fetchAIMarketAnalysis
.addCase(fetchAIMarketAnalysis.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchAIMarketAnalysis.fulfilled, (state, action) => {
state.loading = false;
state.aiAnalysis = action.payload;
})
.addCase(fetchAIMarketAnalysis.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
});
}
});
export const { selectFuture, clearSelectedFuture } = futuresSlice.actions;
export default futuresSlice.reducer;