This repository has been archived by the owner on Jan 9, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
appointment-slice.ts
112 lines (99 loc) · 3.12 KB
/
appointment-slice.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import Appointment from 'model/Appointment'
import { AppThunk } from 'store'
import { Toast } from '@hospitalrun/components'
import AppointmentRepository from 'clients/db/AppointmentRepository'
import Patient from 'model/Patient'
import PatientRepository from 'clients/db/PatientRepository'
import il8n from '../../i18n'
interface AppointmentState {
appointment: Appointment
patient: Patient
isLoading: boolean
}
const initialAppointmentState = {
appointment: {} as Appointment,
patient: {} as Patient,
isLoading: false,
}
function startLoading(state: AppointmentState) {
state.isLoading = true
}
const appointmentSlice = createSlice({
name: 'appointment',
initialState: initialAppointmentState,
reducers: {
fetchAppointmentStart: startLoading,
createAppointmentStart: startLoading,
updateAppointmentStart: startLoading,
deleteAppointmentStart: startLoading,
deleteAppointmentSuccess: (state: AppointmentState) => {
state.isLoading = false
},
fetchAppointmentSuccess: (
state,
{ payload }: PayloadAction<{ appointment: Appointment; patient: Patient }>,
) => {
state.isLoading = false
state.appointment = payload.appointment
state.patient = payload.patient
},
createAppointmentSuccess(state) {
state.isLoading = false
},
updateAppointmentSuccess(state, { payload }: PayloadAction<Appointment>) {
state.isLoading = false
state.appointment = payload
},
},
})
export const {
createAppointmentStart,
createAppointmentSuccess,
updateAppointmentStart,
updateAppointmentSuccess,
fetchAppointmentStart,
fetchAppointmentSuccess,
deleteAppointmentStart,
deleteAppointmentSuccess,
} = appointmentSlice.actions
export const fetchAppointment = (id: string): AppThunk => async (dispatch) => {
dispatch(fetchAppointmentStart())
const appointment = await AppointmentRepository.find(id)
const patient = await PatientRepository.find(appointment.patientId)
dispatch(fetchAppointmentSuccess({ appointment, patient }))
}
export const createAppointment = (
appointment: Appointment,
onSuccess?: (appointment: Appointment) => void,
): AppThunk => async (dispatch) => {
dispatch(createAppointmentStart())
const newAppointment = await AppointmentRepository.save(appointment)
dispatch(createAppointmentSuccess())
if (onSuccess) {
onSuccess(newAppointment)
}
}
export const updateAppointment = (
appointment: Appointment,
onSuccess?: (appointment: Appointment) => void,
): AppThunk => async (dispatch) => {
dispatch(updateAppointmentStart())
const updatedAppointment = await AppointmentRepository.saveOrUpdate(appointment)
dispatch(updateAppointmentSuccess(updatedAppointment))
if (onSuccess) {
onSuccess(updatedAppointment)
}
}
export const deleteAppointment = (
appointment: Appointment,
onSuccess?: () => void,
): AppThunk => async (dispatch) => {
dispatch(deleteAppointmentStart())
await AppointmentRepository.delete(appointment)
dispatch(deleteAppointmentSuccess())
if (onSuccess) {
onSuccess()
}
}
export default appointmentSlice.reducer