slice.ts 2.6 KB

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