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,52 @@
|
||||
"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];
|
||||
}
|
||||
Reference in new issue
Block a user