Files
cv-maker/lib/hooks/useLocalStorage.ts
2026-09-16 21:34:09 +02:00

52 lines
1.2 KiB
TypeScript

"use client";
import { useEffect, useState } from "react";
export interface StorageLike<T> {
load(): T | null;
save(value: T): void;
}
const SAVE_DELAY_MS = 60;
export function useLocalStorage<T>(
storage: StorageLike<T>,
initialValue: T,
enable = true,
): [T, (value: T | ((prev: T) => T)) => void] {
const [value, setValue] = useState<T>(initialValue);
useEffect(() => {
if (!enable) return;
let disposed = false;
const timer = window.setTimeout(() => {
try {
const stored = storage.load();
if (disposed || stored === null || stored === undefined) return;
setValue(stored);
} catch (error) {
console.warn("Échec du chargement localStorage", error);
}
}, 0);
return () => {
disposed = true;
window.clearTimeout(timer);
};
}, [storage, enable]);
useEffect(() => {
if (!enable) return;
const timer = window.setTimeout(() => {
try {
storage.save(value);
} catch (error) {
console.warn("Échec de la sauvegarde localStorage", error);
}
}, SAVE_DELAY_MS);
return () => {
window.clearTimeout(timer);
};
}, [storage, value, enable]);
return [value, setValue];
}