53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import {
|
|
createDefaultCVData,
|
|
type CVCareerData,
|
|
} from "@/lib/types/cv";
|
|
|
|
export const STORAGE_KEY = "cv-maker:v1";
|
|
|
|
export interface CVStorageAdapter {
|
|
load(): CVCareerData | null;
|
|
save(data: CVCareerData): void;
|
|
clear(): void;
|
|
}
|
|
|
|
export function isCVCareerData(value: unknown): value is CVCareerData {
|
|
if (typeof value !== "object" || value === null) return false;
|
|
const data = value as Record<string, unknown>;
|
|
if (data.version !== 1) return false;
|
|
if (!Array.isArray(data.experiences)) return false;
|
|
return true;
|
|
}
|
|
|
|
export function normalizeCVCareerData(value: unknown): CVCareerData | null {
|
|
if (!isCVCareerData(value)) return null;
|
|
return { ...createDefaultCVData(), ...value, experiences: value.experiences };
|
|
}
|
|
|
|
export function createLocalStorageAdapter(): CVStorageAdapter {
|
|
return {
|
|
load() {
|
|
try {
|
|
const raw = window.localStorage.getItem(STORAGE_KEY);
|
|
if (raw === null) return null;
|
|
const parsed: unknown = JSON.parse(raw);
|
|
return normalizeCVCareerData(parsed);
|
|
} catch {
|
|
return null;
|
|
}
|
|
},
|
|
save(data) {
|
|
try {
|
|
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
|
|
} catch (error) {
|
|
console.warn("Échec de la sauvegarde localStorage", error);
|
|
throw error;
|
|
}
|
|
},
|
|
clear() {
|
|
window.localStorage.removeItem(STORAGE_KEY);
|
|
},
|
|
};
|
|
}
|
|
|
|
export const localStorageAdapter = createLocalStorageAdapter(); |