Skip to content

Commit 4c19b8b

Browse files
committed
feat: Refactor education data structure and update input handling in CVBuilder and EducationStep components
1 parent 4288eb8 commit 4c19b8b

File tree

2 files changed

+211
-93
lines changed

2 files changed

+211
-93
lines changed

frontend/src/pages/Dashboard/CVBuilder/CVBuilder.jsx

Lines changed: 154 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,53 @@ const initialCVData = {
1616
city: ''
1717
},
1818
education: {
19-
medicalSchoolName: '',
20-
country: '',
21-
joiningDate: '',
22-
completionDate: '',
23-
firstYearPercentage: '',
24-
secondYearPercentage: '',
25-
preFinalYearPercentage: '',
26-
finalYearPercentage: '',
27-
hasResidency: false
19+
schooling: {
20+
schoolName: '',
21+
board: '',
22+
city: '',
23+
state: '',
24+
startYear: '',
25+
endYear: '',
26+
grade: ''
27+
},
28+
college: {
29+
collegeName: '',
30+
stream: '',
31+
city: '',
32+
state: '',
33+
startYear: '',
34+
endYear: '',
35+
eleventhGrade: '',
36+
twelfthGrade: ''
37+
},
38+
graduation: {
39+
universityName: '',
40+
degree: '',
41+
specialization: '',
42+
city: '',
43+
state: '',
44+
country: '',
45+
startDate: '',
46+
endDate: '',
47+
firstYearPercentage: '',
48+
secondYearPercentage: '',
49+
thirdYearPercentage: '',
50+
finalYearPercentage: '',
51+
overallGrade: '',
52+
classType: ''
53+
},
54+
postGraduation: {
55+
universityName: '',
56+
degree: '',
57+
specialization: '',
58+
city: '',
59+
state: '',
60+
country: '',
61+
startDate: '',
62+
endDate: '',
63+
status: '',
64+
overallGrade: ''
65+
}
2866
},
2967
usmleScores: {
3068
step1Status: 'not-taken',
@@ -60,7 +98,7 @@ const CVBuilder = ({ onPreview, user, onStepChange, currentStep, onStepComplete
6098
const completed = [];
6199
const checks = [
62100
{ condition: data.basicDetails?.fullName && data.basicDetails?.email, step: 1 },
63-
{ condition: data.education?.medicalSchoolName && data.education?.country, step: 2 },
101+
{ condition: data.education?.graduation?.universityName && data.education?.graduation?.country, step: 2 },
64102
{ condition: data.usmleScores?.step1Status, step: 3 },
65103
{ condition: data.clinicalExperiences?.length > 0, step: 4 },
66104
{ condition: data.skills?.trim(), step: 5 },
@@ -116,36 +154,61 @@ const CVBuilder = ({ onPreview, user, onStepChange, currentStep, onStepComplete
116154
}, [currentStep, internalCurrentStep]);
117155

118156
const handleInputChange = useCallback((section, field, value) => {
119-
const newData = section === 'skills' || section === 'significantAchievements'
120-
? { ...formData, [section]: value }
121-
: { ...formData, [section]: { ...formData[section], [field]: value } };
122-
123-
setFormData(newData);
124-
setTimeout(() => updateCompletedSteps(newData), 100);
125-
}, [formData, updateCompletedSteps]);
157+
setFormData(prevData => {
158+
let newData;
159+
if (section === 'skills' || section === 'significantAchievements') {
160+
newData = { ...prevData, [section]: value };
161+
} else if (section === 'education') {
162+
newData = {
163+
...prevData,
164+
education: {
165+
...prevData.education,
166+
[field]: value
167+
}
168+
};
169+
} else {
170+
newData = {
171+
...prevData,
172+
[section]: {
173+
...prevData[section],
174+
[field]: value
175+
}
176+
};
177+
}
178+
179+
setTimeout(() => updateCompletedSteps(newData), 100);
180+
return newData;
181+
});
182+
}, [updateCompletedSteps]);
126183

127184
const handleArrayAdd = useCallback((section, newItem) => {
128-
const newData = { ...formData, [section]: [...(formData[section] || []), newItem] };
129-
setFormData(newData);
130-
setTimeout(() => updateCompletedSteps(newData), 100);
131-
}, [formData, updateCompletedSteps]);
185+
setFormData(prevData => {
186+
const newData = { ...prevData, [section]: [...(prevData[section] || []), newItem] };
187+
setTimeout(() => updateCompletedSteps(newData), 100);
188+
return newData;
189+
});
190+
}, [updateCompletedSteps]);
132191

133192
const handleArrayRemove = useCallback((section, index) => {
134-
const newData = { ...formData, [section]: (formData[section] || []).filter((_, i) => i !== index) };
135-
setFormData(newData);
136-
setTimeout(() => updateCompletedSteps(newData), 100);
137-
}, [formData, updateCompletedSteps]);
193+
setFormData(prevData => {
194+
const newData = { ...prevData, [section]: (prevData[section] || []).filter((_, i) => i !== index) };
195+
setTimeout(() => updateCompletedSteps(newData), 100);
196+
return newData;
197+
});
198+
}, [updateCompletedSteps]);
138199

139200
const handleArrayUpdate = useCallback((section, index, field, value) => {
140-
const newData = {
141-
...formData,
142-
[section]: formData[section].map((item, i) =>
143-
i === index ? { ...item, [field]: value } : item
144-
)
145-
};
146-
setFormData(newData);
147-
setTimeout(() => updateCompletedSteps(newData), 100);
148-
}, [formData, updateCompletedSteps]);
201+
setFormData(prevData => {
202+
const newData = {
203+
...prevData,
204+
[section]: prevData[section].map((item, i) =>
205+
i === index ? { ...item, [field]: value } : item
206+
)
207+
};
208+
setTimeout(() => updateCompletedSteps(newData), 100);
209+
return newData;
210+
});
211+
}, [updateCompletedSteps]);
149212

150213
const handleStepChange = useCallback((step) => {
151214
setInternalCurrentStep(step);
@@ -163,14 +226,63 @@ const CVBuilder = ({ onPreview, user, onStepChange, currentStep, onStepComplete
163226
}, [activeStep, handleStepChange]);
164227

165228
const handleSave = useCallback(async () => {
166-
try {
167-
await api.post('/cv/save', formData);
168-
toast.success("CV Saved Successfully");
169-
} catch (error) {
170-
const errorMessage = error.response?.data?.message || 'Failed to save CV';
171-
toast.error(errorMessage);
172-
}
173-
}, [formData]);
229+
setFormData(prevData => {
230+
if (!prevData.basicDetails.graduationYear || prevData.basicDetails.graduationYear.trim() === '') {
231+
toast.error('Please enter your graduation year in Basic Details (Step 1)');
232+
handleStepChange(1);
233+
return prevData;
234+
}
235+
236+
if (!prevData.basicDetails.medicalSchool || prevData.basicDetails.medicalSchool.trim() === '') {
237+
toast.error('Please enter your medical school in Basic Details (Step 1)');
238+
handleStepChange(1);
239+
return prevData;
240+
}
241+
242+
if (!prevData.basicDetails.fullName || prevData.basicDetails.fullName.trim() === '') {
243+
toast.error('Please enter your full name in Basic Details (Step 1)');
244+
handleStepChange(1);
245+
return prevData;
246+
}
247+
248+
if (!prevData.basicDetails.email || prevData.basicDetails.email.trim() === '') {
249+
toast.error('Please enter your email in Basic Details (Step 1)');
250+
handleStepChange(1);
251+
return prevData;
252+
}
253+
254+
if (!prevData.basicDetails.phone || prevData.basicDetails.phone.trim() === '') {
255+
toast.error('Please enter your phone number in Basic Details (Step 1)');
256+
handleStepChange(1);
257+
return prevData;
258+
}
259+
260+
if (!prevData.basicDetails.city || prevData.basicDetails.city.trim() === '') {
261+
toast.error('Please enter your city in Basic Details (Step 1)');
262+
handleStepChange(1);
263+
return prevData;
264+
}
265+
266+
if (!user?._id) {
267+
toast.error('User not authenticated. Please login again.');
268+
return prevData;
269+
}
270+
271+
const dataToSave = {
272+
...prevData,
273+
userId: user._id
274+
};
275+
276+
api.post('/cv/save', dataToSave)
277+
.then(() => toast.success("CV Saved Successfully"))
278+
.catch(error => {
279+
const errorMessage = error.response?.data?.message || 'Failed to save CV';
280+
toast.error(errorMessage);
281+
});
282+
283+
return prevData;
284+
});
285+
}, [user?._id, handleStepChange]);
174286

175287
const handlePreview = useCallback(() => setShowPreview(true), []);
176288
const handleBackFromPreview = useCallback(() => setShowPreview(false), []);

0 commit comments

Comments
 (0)