slice.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { createSlice, PayloadAction } from '@reduxjs/toolkit';
  2. import { saveReportThunk } from './saveReportThunk';
  3. import { previewReportThunk } from './previewReportThunk';
  4. import { Task } from '@/domain/work';
  5. import { ReportContent, ReportContentValue } from '@/API/report/ReportActions';
  6. import { set } from 'lodash';
  7. interface DiagnosticReportState {
  8. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  9. report: ReportContent | null;
  10. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  11. previewResponse: any;
  12. isPreviewing: boolean;
  13. isSaving: boolean;
  14. isFinished: boolean;
  15. visible: boolean;
  16. needsPreview: boolean;
  17. currentWork: Task | null; // 当前选中的工作
  18. }
  19. const initialState: DiagnosticReportState = {
  20. report: null,
  21. previewResponse: null,
  22. isPreviewing: false,
  23. isSaving: false,
  24. isFinished: false,
  25. visible: false,
  26. needsPreview: false,
  27. currentWork: null,
  28. };
  29. const diagnosticReportSlice = createSlice({
  30. name: 'diagnosticReport',
  31. initialState,
  32. reducers: {
  33. finishReport(state) {
  34. state.isFinished = true;
  35. },
  36. setVisible(
  37. state,
  38. action: PayloadAction<boolean | { visible: boolean; work?: Task }>
  39. ) {
  40. if (typeof action.payload === 'boolean') {
  41. state.visible = action.payload;
  42. } else {
  43. state.visible = action.payload.visible;
  44. if (action.payload.work) {
  45. state.currentWork = action.payload.work;
  46. }
  47. }
  48. },
  49. toggleVisible(state) {
  50. state.visible = !state.visible;
  51. },
  52. setNeedsPreview(state, action: PayloadAction<boolean>) {
  53. state.needsPreview = action.payload;
  54. },
  55. setReport(state, action: PayloadAction<ReportContent>) {
  56. state.report = action.payload;
  57. },
  58. resetReport(state) {
  59. state.report = initialState.report;
  60. },
  61. updateReportField(
  62. state,
  63. action: PayloadAction<{
  64. path: keyof ReportContent | string;
  65. value: ReportContentValue;
  66. }>
  67. ) {
  68. const { path, value } = action.payload;
  69. set(state, path, value);
  70. },
  71. },
  72. extraReducers: (builder) => {
  73. builder
  74. .addCase(saveReportThunk.pending, (state) => {
  75. state.isSaving = true;
  76. })
  77. .addCase(saveReportThunk.fulfilled, (state) => {
  78. state.isSaving = false;
  79. state.isFinished = true;
  80. })
  81. .addCase(saveReportThunk.rejected, (state) => {
  82. state.isSaving = false;
  83. })
  84. .addCase(previewReportThunk.pending, (state) => {
  85. state.isPreviewing = true;
  86. })
  87. .addCase(previewReportThunk.fulfilled, (state, action) => {
  88. state.isPreviewing = false;
  89. state.needsPreview = true;
  90. state.previewResponse = action.payload; // Store the response in the new field
  91. })
  92. .addCase(previewReportThunk.rejected, (state) => {
  93. state.isPreviewing = false;
  94. });
  95. },
  96. });
  97. export const {
  98. finishReport,
  99. setVisible,
  100. toggleVisible,
  101. setNeedsPreview,
  102. setReport,
  103. resetReport,
  104. updateReportField,
  105. } = diagnosticReportSlice.actions;
  106. export default diagnosticReportSlice.reducer;