52 lines
1.2 KiB
TypeScript
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];
|
|
} |