101 lines
2.4 KiB
TypeScript
101 lines
2.4 KiB
TypeScript
"use client";
|
|
|
|
import { useCallback } from "react";
|
|
import {
|
|
createDefaultCVData,
|
|
type CVCareerData,
|
|
type CVTabId,
|
|
type Experience,
|
|
} from "@/lib/types/cv";
|
|
import { localStorageAdapter } from "@/lib/storage";
|
|
import { useLocalStorage } from "@/lib/hooks/useLocalStorage";
|
|
|
|
export interface UseCVDataReturn {
|
|
data: CVCareerData;
|
|
setText: (tab: CVTabId, value: string) => void;
|
|
addExperience: (titre: string, contenu: string) => void;
|
|
updateExperience: (id: string, titre: string, contenu: string) => void;
|
|
removeExperience: (id: string) => void;
|
|
resetCV: () => void;
|
|
importCV: (value: CVCareerData) => void;
|
|
}
|
|
|
|
const DEFAULT_TITLE = "Expérience";
|
|
|
|
export function useCVData(): UseCVDataReturn {
|
|
const [data, setData] = useLocalStorage<CVCareerData>(
|
|
localStorageAdapter,
|
|
createDefaultCVData(),
|
|
);
|
|
|
|
const setText = useCallback(
|
|
(tab: CVTabId, value: string) => {
|
|
setData((prev) => ({ ...prev, [tab]: value }));
|
|
},
|
|
[setData],
|
|
);
|
|
|
|
const addExperience = useCallback(
|
|
(titre: string, contenu: string) => {
|
|
setData((prev) => {
|
|
const now = Date.now();
|
|
const experience: Experience = {
|
|
id: crypto.randomUUID(),
|
|
titre: titre.trim() || DEFAULT_TITLE,
|
|
contenu,
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
};
|
|
return { ...prev, experiences: [...prev.experiences, experience] };
|
|
});
|
|
},
|
|
[setData],
|
|
);
|
|
|
|
const updateExperience = useCallback(
|
|
(id: string, titre: string, contenu: string) => {
|
|
setData((prev) => ({
|
|
...prev,
|
|
experiences: prev.experiences.map((exp) =>
|
|
exp.id === id
|
|
? {
|
|
...exp,
|
|
titre: titre.trim() || DEFAULT_TITLE,
|
|
contenu,
|
|
updatedAt: Date.now(),
|
|
}
|
|
: exp,
|
|
),
|
|
}));
|
|
},
|
|
[setData],
|
|
);
|
|
|
|
const removeExperience = useCallback(
|
|
(id: string) => {
|
|
setData((prev) => ({
|
|
...prev,
|
|
experiences: prev.experiences.filter((exp) => exp.id !== id),
|
|
}));
|
|
},
|
|
[setData],
|
|
);
|
|
|
|
const resetCV = useCallback(() => {
|
|
setData(createDefaultCVData());
|
|
}, [setData]);
|
|
|
|
const importCV = useCallback((value: CVCareerData) => {
|
|
setData(value);
|
|
}, [setData]);
|
|
|
|
return {
|
|
data,
|
|
setText,
|
|
addExperience,
|
|
updateExperience,
|
|
removeExperience,
|
|
resetCV,
|
|
importCV,
|
|
};
|
|
} |