productSlice.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. }
  9. const initialState: ProductState = {
  10. productName: 'DROS',
  11. language: 'en',
  12. source: 'Browser',
  13. guest: '',
  14. };
  15. export const initializeProductState = createAsyncThunk(
  16. 'product/initializeProductState',
  17. async () => {
  18. const softwareInfo = await fetchSoftwareInfo();
  19. console.log(`加载软件系统信息:${JSON.stringify(softwareInfo)}`);
  20. return {
  21. productName: softwareInfo.product as 'DROS' | 'VETDROS',
  22. language: softwareInfo.language[0],
  23. source: 'Browser' as const,
  24. guest: softwareInfo.guest,
  25. };
  26. }
  27. );
  28. const productSlice = createSlice({
  29. name: 'product',
  30. initialState,
  31. reducers: {
  32. setProduct: (state, action: PayloadAction<ProductState>) => {
  33. state.productName = action.payload.productName;
  34. state.language = action.payload.language;
  35. state.source = action.payload.source;
  36. },
  37. },
  38. extraReducers: (builder) => {
  39. builder
  40. .addCase(initializeProductState.fulfilled, (state, action) => {
  41. state.productName = action.payload.productName;
  42. state.language = action.payload.language;
  43. state.source = action.payload.source;
  44. })
  45. .addCase(initializeProductState.rejected, (state, action) => {
  46. console.error(
  47. 'Failed to initialize product state:',
  48. action.error,
  49. state
  50. );
  51. });
  52. },
  53. });
  54. export const { setProduct } = productSlice.actions;
  55. export default productSlice.reducer;