@@ -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