import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { BleList, PeripheralStatus, SyncItemFinish, SyncProgress, } from '../../services/mobileWsType'; import Bridge from '../../utils/bridge'; interface ContextState { device: PeripheralStatus['data']; currRailTypeId: number; // 当前选择的轨型 currOrgCode: string; // 铁路局 currGWDCode: string; // 工务段 currXMCode: string; // 线名 bleList: BleList['data']; syncProgress: SyncProgress['data']; syncItems: Array; setting: { server: string; }; } const orgGwdXmStr = localStorage.getItem('org_gwd_xm'); let orgGwdXm: string[] | undefined; if (orgGwdXmStr) { orgGwdXm = orgGwdXmStr.split(','); } const initialState: ContextState = { device: { connected: true, //是否已连接蓝牙 power: 60, //电量 inclinatorX: 0.276, //x轴倾斜 inclinatorY: 3.019, //y轴倾斜 temperature: 32.026, //温度 }, currRailTypeId: 1, currOrgCode: orgGwdXm ? orgGwdXm[0] : '', currGWDCode: orgGwdXm ? orgGwdXm[1] : '', currXMCode: orgGwdXm ? orgGwdXm[2] : '', bleList: [], syncProgress: { remaining: 0, fail: 0, total: 0, finish: true, }, syncItems: [], setting: { server: '', }, }; export const fetchConfig = createAsyncThunk('context/fetchConfig', async () => { const conf = await Bridge.getConfig(); return conf.success ? conf.data : null; }); export const saveConfig = createAsyncThunk( 'context/saveConfig', async (param: { server: string }, thunkAPI) => { const res = await Bridge.saveConfig(param); res.success && thunkAPI.dispatch(fetchConfig()); return res } ); export const contextSlice = createSlice({ name: 'context', initialState, reducers: { updateOrg: (state, action: PayloadAction) => { state.currOrgCode = action.payload[0]; state.currGWDCode = action.payload[1]; state.currXMCode = action.payload[2]; localStorage.setItem('org_gwd_xm', action.payload.join(',')); }, updateDevice: (state, action: PayloadAction) => { state.device = action.payload; }, updateRailTypeId: (state, action: PayloadAction) => { state.currRailTypeId = action.payload; }, updateBleList: (state, action: PayloadAction) => { state.bleList = action.payload; }, updateSyncProgress: (state, action: PayloadAction) => { state.syncProgress = action.payload; }, }, extraReducers: (builder) => { builder.addCase(fetchConfig.fulfilled, (state, action) => { if (action.payload) { state.setting = action.payload; } }); }, }); export const { updateOrg, updateDevice, updateRailTypeId, updateBleList, updateSyncProgress } = contextSlice.actions; export default contextSlice.reducer;