61 lines
1.5 KiB
JavaScript
61 lines
1.5 KiB
JavaScript
import { useState, useCallback } from 'react';
|
|
import { cvData as initialData } from '../../data/cv';
|
|
|
|
export function useCVData() {
|
|
const [data, setData] = useState(initialData);
|
|
|
|
const updatePersonal = useCallback((personal) => {
|
|
setData(prev => ({ ...prev, personal }));
|
|
}, []);
|
|
|
|
const updateExperience = useCallback((experience) => {
|
|
setData(prev => ({ ...prev, experience }));
|
|
}, []);
|
|
|
|
const updateSkills = useCallback((skills) => {
|
|
setData(prev => ({ ...prev, skills }));
|
|
}, []);
|
|
|
|
const updateEducation = useCallback((education) => {
|
|
setData(prev => ({ ...prev, education }));
|
|
}, []);
|
|
|
|
const updateProjects = useCallback((projects) => {
|
|
setData(prev => ({ ...prev, projects }));
|
|
}, []);
|
|
|
|
const exportJSON = useCallback(() => {
|
|
const json = JSON.stringify(data, null, 2);
|
|
const blob = new Blob([json], { type: 'application/json' });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = 'cv.json';
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
URL.revokeObjectURL(url);
|
|
}, [data]);
|
|
|
|
const importJSON = useCallback((jsonString) => {
|
|
try {
|
|
const parsed = JSON.parse(jsonString);
|
|
setData(parsed);
|
|
return { success: true };
|
|
} catch (e) {
|
|
return { success: false, error: e.message };
|
|
}
|
|
}, []);
|
|
|
|
return {
|
|
data,
|
|
updatePersonal,
|
|
updateExperience,
|
|
updateSkills,
|
|
updateEducation,
|
|
updateProjects,
|
|
exportJSON,
|
|
importJSON
|
|
};
|
|
}
|