|
|
import { createAsyncThunk, createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { KTJOrg, RailType } from '../../services/apiTypes'; import { labeledKtjOrgs } from '../../utils/helper';
import { ktjOrgs } from '../../utils/constant'; import Bridge from '../../utils/bridge'; import { RootState } from '..';
interface BaseDataState { ktjOrgs: KTJOrg[]; railTypes: RailType[]; syncingBaseData: boolean; }
const initialState: BaseDataState = { ktjOrgs: ktjOrgs as KTJOrg[], railTypes: [], syncingBaseData: false, };
export const fetchRailTypes = createAsyncThunk('base/fetchRailTypes', async (_, thunkAPI) => { const res = await Bridge.getBasicTrackList(); return res.success ? res.data : null; });
export const syncBaseData = createAsyncThunk('base/syncBaseData', async () => { return await Bridge.syncBaseData(); });
export const fetchOrgTree = createAsyncThunk('base/fetchOrgTree', async () => { return await Bridge.getOrgTree(); });
export const baseDataSlice = createSlice({ name: 'baseData', initialState, reducers: { updateRailTypes: (state, action: PayloadAction<RailType[]>) => { state.railTypes = action.payload; }, updateRailPoints: (state, action: PayloadAction<RailType>) => { const r = state.railTypes.find((r) => r.code === action.payload.code); if (r) { r.points = action.payload.points; r.calPoints = action.payload.calPoints; } }, }, extraReducers: (builder) => { builder.addCase(fetchRailTypes.fulfilled, (state, action) => { state.railTypes = action.payload || []; }); builder.addCase(syncBaseData.pending, (state) => { state.syncingBaseData = true; }); builder.addCase(syncBaseData.fulfilled, (state) => { state.syncingBaseData = false; }); builder.addCase(fetchOrgTree.fulfilled, (state, action) => { if (action.payload.success) { state.ktjOrgs = action.payload.data; } }); }, });
export const { updateRailPoints } = baseDataSlice.actions; export default baseDataSlice.reducer;
export const selectKtjOrgs = (state: RootState) => state.baseData.ktjOrgs; export const selectLabeledKtjOrgs = createSelector(selectKtjOrgs, (orgs) => { return labeledKtjOrgs(orgs); });
|