bodyPositionListSlice.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { createSlice, PayloadAction } from '@reduxjs/toolkit';
  2. import { View as BodyPosition } from '../../API/patient/viewActions';
  3. import { Work } from './examWorksCacheSlice';
  4. import { dview } from '@/domain/dview';
  5. export interface ExtendedBodyPosition extends BodyPosition {
  6. patient_name: string;
  7. patient_id: string;
  8. registration_number: string;
  9. study_description: string;
  10. body_position_image: string;
  11. collimator_length: number | string;
  12. collimator_width: number | string;
  13. sid: string;
  14. work: Work;
  15. sop_instance_uid: string;
  16. series_instance_uid?: string;
  17. study_instance_uid?: string;
  18. secondary_sop_uid?: string;
  19. study_id?: string;
  20. dview: dview;
  21. }
  22. interface BodyPositionListState {
  23. bodyPositions: ExtendedBodyPosition[];
  24. selectedBodyPosition: ExtendedBodyPosition | null;
  25. }
  26. const initialState: BodyPositionListState = {
  27. bodyPositions: [],
  28. selectedBodyPosition: null,
  29. };
  30. const bodyPositionListSlice = createSlice({
  31. name: 'bodyPositionList',
  32. initialState,
  33. reducers: {
  34. addBodyPosition: (state, action: PayloadAction<ExtendedBodyPosition>) => {
  35. state.bodyPositions.push(action.payload);
  36. },
  37. setBodyPositions: (
  38. state,
  39. action: PayloadAction<ExtendedBodyPosition[]>
  40. ) => {
  41. state.bodyPositions = action.payload;
  42. },
  43. setSelectedBodyPosition: (
  44. state,
  45. action: PayloadAction<ExtendedBodyPosition | null>
  46. ) => {
  47. state.selectedBodyPosition = action.payload;
  48. },
  49. setByIndex: (state, action: PayloadAction<number>) => {
  50. if (action.payload >= 0 && action.payload < state.bodyPositions.length) {
  51. state.selectedBodyPosition = state.bodyPositions[action.payload];
  52. }
  53. },
  54. addViewsToBodyPosition: (
  55. state,
  56. action: PayloadAction<{ instanceUid: string; dviews: dview[] }>
  57. ) => {
  58. const [dview] = action.payload.dviews;
  59. if (dview && state.selectedBodyPosition) {
  60. const newBodyPosition: ExtendedBodyPosition = {
  61. ...state.selectedBodyPosition,
  62. work: {
  63. ...state.selectedBodyPosition.work,
  64. Views: [...state.selectedBodyPosition.work.Views, dview],
  65. },
  66. sop_instance_uid: action.payload.instanceUid,
  67. };
  68. state.bodyPositions.push(newBodyPosition);
  69. }
  70. },
  71. removeBodyPositionBySopInstanceUid: (
  72. state,
  73. action: PayloadAction<string>
  74. ) => {
  75. state.bodyPositions = state.bodyPositions.filter(
  76. (bodyPosition) => bodyPosition.sop_instance_uid !== action.payload
  77. );
  78. },
  79. },
  80. });
  81. export const {
  82. addBodyPosition,
  83. setBodyPositions,
  84. setSelectedBodyPosition,
  85. setByIndex,
  86. addViewsToBodyPosition,
  87. removeBodyPositionBySopInstanceUid,
  88. } = bodyPositionListSlice.actions;
  89. export default bodyPositionListSlice.reducer;