productSlice.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. sn: string;
  11. }
  12. const initialState: ProductState = {
  13. productName: 'DROS',
  14. language: 'en_US',
  15. source: 'Browser',
  16. guest: '',
  17. fpd: '',
  18. gen: '',
  19. sn: '',
  20. };
  21. export const initializeProductState = createAsyncThunk(
  22. 'product/initializeProductState',
  23. async () => {
  24. const softwareInfo = await fetchSoftwareInfo();
  25. console.log(`加载软件系统信息:${JSON.stringify(softwareInfo)}`);
  26. return {
  27. productName: softwareInfo.product as 'DROS' | 'VETDROS',
  28. language: softwareInfo.current_locale,
  29. source: 'Browser' as const,
  30. guest: softwareInfo.guest,
  31. fpd: softwareInfo.FPD,
  32. gen: softwareInfo.GEN,
  33. sn: softwareInfo.sn,
  34. };
  35. }
  36. );
  37. const productSlice = createSlice({
  38. name: 'product',
  39. initialState,
  40. reducers: {
  41. setProduct: (state, action: PayloadAction<ProductState>) => {
  42. state.productName = action.payload.productName;
  43. state.language = action.payload.language;
  44. state.source = action.payload.source;
  45. state.guest = action.payload.guest;
  46. state.fpd = action.payload.fpd;
  47. state.gen = action.payload.gen;
  48. state.sn = action.payload.sn;
  49. },
  50. },
  51. extraReducers: (builder) => {
  52. builder
  53. .addCase(initializeProductState.fulfilled, (state, action) => {
  54. state.productName = action.payload.productName;
  55. state.language = action.payload.language;
  56. state.source = action.payload.source;
  57. state.guest = action.payload.guest;
  58. state.fpd = action.payload.fpd;
  59. state.gen = action.payload.gen;
  60. state.sn = action.payload.sn;
  61. })
  62. .addCase(initializeProductState.rejected, (state, action) => {
  63. console.error(
  64. 'Failed to initialize product state:',
  65. action.error,
  66. state
  67. );
  68. });
  69. },
  70. });
  71. export const { setProduct } = productSlice.actions;
  72. export default productSlice.reducer;