feat(ui): add cv application frontend and configuration
This commit is contained in:
60
src/admin/hooks/useCVData.js
Normal file
60
src/admin/hooks/useCVData.js
Normal file
@@ -0,0 +1,60 @@
|
||||
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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user