Skip to content

Commit b33d8ca

Browse files
authored
Merge pull request #373 from NUS-Project-SaBai/2024trip/241213
Hooks: Save On Write
2 parents bd17eb2 + 54f34fd commit b33d8ca

File tree

4 files changed

+64
-53
lines changed

4 files changed

+64
-53
lines changed

components/SideMenu.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { VillageContext } from '@/context/VillageContext';
1515
import axiosInstance from '@/pages/api/_axiosInstance';
1616

1717
// Version number here
18-
const version = 'v2024.12.12 11AM';
18+
const version = 'v2024.12.13 1PM';
1919

2020
const navigation = [
2121
{

hooks/useSaveOnWrite.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { useState, useEffect } from 'react';
2+
3+
export default function useSaveOnWrite(
4+
name,
5+
initialFormDetails,
6+
dependencies = []
7+
) {
8+
const [formDetails, setFormDetails] = useState(initialFormDetails);
9+
10+
// Generate the storage key dynamically based on dependencies
11+
const generateStorageKey = () => {
12+
const dependencyKey = dependencies
13+
.map((dep, index) => `dep${index + 1}=${dep}`)
14+
.join('_');
15+
return `current_${name}_form_details_${dependencyKey}`;
16+
};
17+
18+
const storageKey = generateStorageKey();
19+
20+
// Load saved data from localStorage when the component mounts
21+
useEffect(() => {
22+
const savedData = localStorage.getItem(storageKey);
23+
if (savedData) {
24+
console.log(savedData);
25+
setFormDetails(JSON.parse(savedData));
26+
}
27+
}, dependencies);
28+
29+
// Save registration form data to localStorage whenever it changes
30+
useEffect(() => {
31+
const timeout = setTimeout(() => {
32+
localStorage.setItem(storageKey, JSON.stringify(formDetails));
33+
}, 500);
34+
return () => clearTimeout(timeout);
35+
}, [...dependencies, formDetails]);
36+
37+
// Purge data from localStorage on successful submit
38+
const clearLocalStorageData = () => {
39+
localStorage.removeItem(storageKey);
40+
setFormDetails(initialFormDetails);
41+
};
42+
43+
return [formDetails, setFormDetails, clearLocalStorageData];
44+
}

pages/records/patient-consultation/index.js

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import axiosInstance from '@/pages/api/_axiosInstance';
1717
import CustomModal from '@/components/CustomModal';
1818
import useWithLoading from '@/utils/loading';
1919
import NoVisitPlaceholder from '@/components/records/NoVisitPlaceholder';
20+
import useSaveOnWrite from '@/hooks/useSaveOnWrite';
2021

2122
const PatientConsultation = () => {
2223
const [mounted, setMounted] = useState(false);
@@ -37,7 +38,11 @@ const PatientConsultation = () => {
3738
const [consultationModalOpen, setConsultationModalOpen] = useState(false);
3839

3940
// Order Form Modal hooks
40-
const [orders, setOrders] = useState([]);
41+
const [orders, setOrders, clearOrdersStorageData] = useSaveOnWrite(
42+
'orders',
43+
[],
44+
[selectedVisitID]
45+
);
4146
const blankOrderFormDetails = {
4247
quantity: '',
4348
medicine: 0, // refers to the medcine id
@@ -49,59 +54,16 @@ const PatientConsultation = () => {
4954
const [orderFormModalOpen, setOrderFormModalOpen] = useState(false);
5055

5156
// Consultation Form hooks
52-
const [consultationFormDetails, setConsultationFormDetails] = useState({
53-
diagnoses: [],
54-
});
57+
const [
58+
consultationFormDetails,
59+
setConsultationFormDetails,
60+
clearConsultStorageData,
61+
] = useSaveOnWrite('consult', { diagnoses: [] }, [selectedVisitID]);
5562

5663
useEffect(() => {
5764
onRefresh();
5865
}, []);
5966

60-
// Load saved data from localStorage when the component mounts
61-
useEffect(() => {
62-
const savedConsultData = localStorage.getItem(
63-
`consultationFormDetails_visit${selectedVisitID}`
64-
);
65-
if (savedConsultData) {
66-
setConsultationFormDetails(JSON.parse(savedConsultData));
67-
}
68-
const savedOrderData = localStorage.getItem(
69-
`orders_visit${selectedVisitID}`
70-
);
71-
if (savedOrderData) {
72-
setOrders(JSON.parse(savedOrderData));
73-
}
74-
}, [selectedVisitID]);
75-
// Save consultation form data to localStorage whenever it changes
76-
useEffect(() => {
77-
const timeout = setTimeout(() => {
78-
localStorage.setItem(
79-
`consultationFormDetails_visit${selectedVisitID}`,
80-
JSON.stringify(consultationFormDetails)
81-
);
82-
}, 500);
83-
return () => clearTimeout(timeout);
84-
}, [selectedVisitID, consultationFormDetails]);
85-
// Save orders form data to localStorage whenever it changes
86-
useEffect(() => {
87-
const timeout = setTimeout(() => {
88-
localStorage.setItem(
89-
`orders_visit${selectedVisitID}`,
90-
JSON.stringify(orders)
91-
);
92-
}, 500);
93-
return () => clearTimeout(timeout);
94-
}, [selectedVisitID, orders]);
95-
// Purge data from localStorage on successful submit
96-
const clearLocalStorageData = () => {
97-
localStorage.removeItem(`consultationFormDetails_visit${selectedVisitID}`);
98-
localStorage.removeItem(`orders_visit${selectedVisitID}`);
99-
setConsultationFormDetails({
100-
diagnoses: [],
101-
});
102-
setOrders([]);
103-
};
104-
10567
const onRefresh = useWithLoading(async () => {
10668
const patientID = Router.query.id;
10769
try {
@@ -223,7 +185,8 @@ const PatientConsultation = () => {
223185
};
224186

225187
await axiosInstance.post('/consults', combinedPayload);
226-
clearLocalStorageData();
188+
clearOrdersStorageData();
189+
clearConsultStorageData();
227190

228191
toast.success('Medical Consult Completed!');
229192
Router.push('/records');

pages/registration/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import CustomModal from '@/components/CustomModal';
1717
import { PageTitle } from '@/components/TextComponents';
1818
import { REGISTRATION_FORM_FIELDS } from '@/utils/constants';
1919
import { VillageContext } from '@/context/VillageContext';
20+
import useSaveOnWrite from '@/hooks/useSaveOnWrite';
2021

2122
export const submitNewVisit = async patient => {
2223
try {
@@ -40,13 +41,15 @@ const Registration = () => {
4041

4142
const [patientModalOpen, setPatientModalOpen] = useState(false);
4243

43-
const [imageDetails, setImageDetails] = useState(null);
44+
const [imageDetails, setImageDetails, clearImageDetailsLocalStorage] =
45+
useSaveOnWrite('image', null);
4446

4547
const [scanModalOpen, setScanModalOpen] = useState(false);
4648

4749
const [scanSuggestionsList, setScanSuggestionsList] = useState([]);
4850

49-
const [formDetails, setFormDetails] = useState(REGISTRATION_FORM_FIELDS);
51+
const [formDetails, setFormDetails, clearFormDetailsLocalStorage] =
52+
useSaveOnWrite('registration', REGISTRATION_FORM_FIELDS);
5053

5154
const { village } = useContext(VillageContext);
5255

@@ -161,6 +164,7 @@ const Registration = () => {
161164
village_prefix: 'SV',
162165
}));
163166
setImageDetails(null);
167+
clearFormDetailsLocalStorage();
164168
toast.success('New patient created!');
165169
onRefresh();
166170

0 commit comments

Comments
 (0)