diff --git a/packages/web_ui/src/components/InstanceViewPage.tsx b/packages/web_ui/src/components/InstanceViewPage.tsx index 6bfa9759..e83e206d 100644 --- a/packages/web_ui/src/components/InstanceViewPage.tsx +++ b/packages/web_ui/src/components/InstanceViewPage.tsx @@ -25,6 +25,7 @@ import { useHost } from "../model/host"; import InstanceStatusTag from "./InstanceStatusTag"; import Link from "./Link"; import { instancePublicAddress } from "../util/instance"; +import useLocalStorage from "../util/useLocalStorage"; import { MetricRelativeDate } from "./system_metrics"; type MenuItem = Required["items"][number]; @@ -180,9 +181,7 @@ export default function InstanceViewPage() { let params = useParams(); let instanceId = Number(params.id); const [maxLevel, setMaxLevel] = useState("server"); - const [actionsOnly, setActionsOnly] = useState( - () => localStorage.getItem(consoleActionsOnlyKey) !== "false" - ); + const [actionsOnly, setActionsOnly] = useLocalStorage(consoleActionsOnlyKey, true); let navigate = useNavigate(); @@ -239,10 +238,7 @@ export default function InstanceViewPage() { checkedChildren="Chat" unCheckedChildren="Log" checked={actionsOnly} - onChange={value => { - setActionsOnly(value); - localStorage.setItem(consoleActionsOnlyKey, String(value)); - }} + onChange={setActionsOnly} /> (key: string, defaultValue: T): [T, (value: T) => void] { + const [value, setValue] = useState(() => { + const stored = localStorage.getItem(key); + if (stored === null) { + return defaultValue; + } + try { + return JSON.parse(stored) as T; + } catch { + return defaultValue; + } + }); + + function set(next: T) { + setValue(next); + setTimeout(() => { + try { + localStorage.setItem(key, JSON.stringify(next)); + } catch { + // Ignore storage errors (e.g. quota exceeded or storage disabled). + } + }, 0); + } + + return [value, set]; +}