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
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;
|