From 1f45ef6dcd0840aa67bc42d578013b1dd086c54d Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Mon, 6 Apr 2026 00:54:41 +0200 Subject: Display all Xunta routes in route list --- src/frontend/app/hooks/useSessionState.ts | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/frontend/app/hooks/useSessionState.ts (limited to 'src/frontend/app/hooks/useSessionState.ts') diff --git a/src/frontend/app/hooks/useSessionState.ts b/src/frontend/app/hooks/useSessionState.ts new file mode 100644 index 0000000..f5a9b4e --- /dev/null +++ b/src/frontend/app/hooks/useSessionState.ts @@ -0,0 +1,39 @@ +import { useCallback, useState } from "react"; + +/** + * Like useState, but backed by sessionStorage so state survives back-navigation + * within the same browser tab. Cleared when the tab is closed. + */ +export function useSessionState( + key: string, + defaultValue: T +): [T, (updater: T | ((prev: T) => T)) => void] { + const [state, setStateRaw] = useState(() => { + try { + const stored = sessionStorage.getItem(key); + return stored !== null ? (JSON.parse(stored) as T) : defaultValue; + } catch { + return defaultValue; + } + }); + + const setState = useCallback( + (updater: T | ((prev: T) => T)) => { + setStateRaw((prev) => { + const next = + typeof updater === "function" + ? (updater as (prev: T) => T)(prev) + : updater; + try { + sessionStorage.setItem(key, JSON.stringify(next)); + } catch { + // sessionStorage may be unavailable (private browsing quota, etc.) + } + return next; + }); + }, + [key] + ); + + return [state, setState]; +} -- cgit v1.3