feat(ui): add cv application frontend and configuration

This commit is contained in:
Tuan-Dat Tran
2026-02-23 13:47:08 +01:00
parent cbf40908a6
commit 7f06ee7f53
43 changed files with 2849 additions and 0 deletions

View 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
};
}