productSlice.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';
  2. import { fetchSoftwareInfo } from '../API/softwareInfo';
  3. interface ProductState {
  4. productName: 'DROS' | 'VETDROS';
  5. language: string;
  6. source: 'Electron' | 'Browser' | 'Android';
  7. guest: string; //本质是token,只用于急诊情况
  8. fpd: string; // 平板探测器类型: "Simulator" 或 "Physics"
  9. gen: string; // 发生器类型: "Simulator" 或 "Physics"
  10. }
  11. const initialState: ProductState = {
  12. productName: 'DROS',
  13. language: 'en_US',
  14. source: 'Browser',
  15. guest: '',
  16. fpd: '',
  17. gen: '',
  18. };
  19. export const initializeProductState = createAsyncThunk(
  20. 'product/initializeProductState',
  21. async () => {
  22. const softwareInfo = await fetchSoftwareInfo();
  23. console.log(`加载软件系统信息:${JSON.stringify(softwareInfo)}`);
  24. return {
  25. productName: softwareInfo.product as 'DROS' | 'VETDROS',
  26. language: softwareInfo.current_locale,
  27. source: 'Browser' as const,
  28. guest: softwareInfo.guest,
  29. fpd: softwareInfo.FPD,
  30. gen: softwareInfo.GEN,
  31. };
  32. }
  33. );
  34. const productSlice = createSlice({
  35. name: 'product',
  36. initialState,
  37. reducers: {
  38. setProduct: (state, action: PayloadAction<ProductState>) => {
  39. state.productName = action.payload.productName;
  40. state.language = action.payload.language;
  41. state.source = action.payload.source;
  42. state.guest = action.payload.guest;
  43. state.fpd = action.payload.fpd;
  44. state.gen = action.payload.gen;
  45. },
  46. },
  47. extraReducers: (builder) => {
  48. builder
  49. .addCase(initializeProductState.fulfilled, (state, action) => {
  50. state.productName = action.payload.productName;
  51. state.language = action.payload.language;
  52. state.source = action.payload.source;
  53. state.guest = action.payload.guest;
  54. state.fpd = action.payload.fpd;
  55. state.gen = action.payload.gen;
  56. })
  57. .addCase(initializeProductState.rejected, (state, action) => {
  58. console.error(
  59. 'Failed to initialize product state:',
  60. action.error,
  61. state
  62. );
  63. });
  64. },
  65. });
  66. export const { setProduct } = productSlice.actions;
  67. export default productSlice.reducer;