From cb1b56f5a0eddbf77446f415f2beda57c8305f85 Mon Sep 17 00:00:00 2001 From: polwex Date: Sun, 23 Nov 2025 01:12:53 +0700 Subject: wut --- packages/tweetdeck/src/hooks/usePersistentState.ts | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 packages/tweetdeck/src/hooks/usePersistentState.ts (limited to 'packages/tweetdeck/src/hooks/usePersistentState.ts') diff --git a/packages/tweetdeck/src/hooks/usePersistentState.ts b/packages/tweetdeck/src/hooks/usePersistentState.ts new file mode 100644 index 0000000..7465f53 --- /dev/null +++ b/packages/tweetdeck/src/hooks/usePersistentState.ts @@ -0,0 +1,39 @@ +import { useEffect, useRef, useState } from "react"; + +type Initializer = T | (() => T); + +const isBrowser = typeof window !== "undefined"; + +function readFromStorage(key: string, fallback: Initializer): T { + if (!isBrowser) { + return typeof fallback === "function" ? (fallback as () => T)() : fallback; + } + try { + const raw = window.localStorage.getItem(key); + if (raw) { + return JSON.parse(raw) as T; + } + } catch (error) { + console.warn("Failed to parse localStorage value", { key, error }); + } + return typeof fallback === "function" ? (fallback as () => T)() : fallback; +} + +export function usePersistentState(key: string, initial: Initializer) { + const initialRef = useRef(null); + if (initialRef.current === null) { + initialRef.current = readFromStorage(key, initial); + } + const [value, setValue] = useState(() => initialRef.current as T); + + useEffect(() => { + if (!isBrowser) return; + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.warn("Failed to write localStorage value", { key, error }); + } + }, [key, value]); + + return [value, setValue] as const; +} -- cgit v1.2.3