chore init
This commit is contained in:
1 parent
1b7406b1d3
commit
a0d312a884
60 files changed
+5046
-125
No files matched your search
@@ -0,0 +1,101 @@
|
||||
"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,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user