From b16bdf5e8f4e2ac63fad969dc2f1a9aa12a3bf08 Mon Sep 17 00:00:00 2001 From: Eduard Gert Date: Tue, 16 Jun 2026 13:30:17 +0200 Subject: [PATCH] refetch restrictions on window visibility change --- .../src/contexts/RestrictionsContext.tsx | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/client/ui/frontend/src/contexts/RestrictionsContext.tsx b/client/ui/frontend/src/contexts/RestrictionsContext.tsx index a88b55440..9a6bbb7e8 100644 --- a/client/ui/frontend/src/contexts/RestrictionsContext.tsx +++ b/client/ui/frontend/src/contexts/RestrictionsContext.tsx @@ -1,4 +1,12 @@ -import { createContext, useContext, useEffect, useState, type ReactNode } from "react"; +import { + createContext, + useCallback, + useContext, + useEffect, + useRef, + useState, + type ReactNode, +} from "react"; import { Events } from "@wailsio/runtime"; import { Settings as SettingsSvc } from "@bindings/services"; import { Restrictions } from "@bindings/services/models.js"; @@ -12,19 +20,19 @@ export const useRestrictions = () => useContext(RestrictionsContext); export const RestrictionsProvider = ({ children }: { children: ReactNode }) => { const [restrictions, setRestrictions] = useState(EMPTY); + const mounted = useRef(true); + + const refresh = useCallback(async () => { + try { + const r = await SettingsSvc.GetRestrictions(); + if (mounted.current) setRestrictions(r); + } catch (e) { + console.error("[RestrictionsContext] refresh failed", e); + } + }, []); useEffect(() => { - let cancelled = false; - - const refresh = async () => { - try { - const r = await SettingsSvc.GetRestrictions(); - if (!cancelled) setRestrictions(r); - } catch (e) { - console.error("[RestrictionsContext] refresh failed", e); - } - }; - + mounted.current = true; refresh(); const off = Events.On( @@ -33,11 +41,18 @@ export const RestrictionsProvider = ({ children }: { children: ReactNode }) => { if (e.data?.metadata?.type === "config_changed") refresh(); }, ); - return () => { - cancelled = true; - off(); + + const onVisible = () => { + if (document.visibilityState === "visible") refresh(); }; - }, []); + document.addEventListener("visibilitychange", onVisible); + + return () => { + mounted.current = false; + off(); + document.removeEventListener("visibilitychange", onVisible); + }; + }, [refresh]); return ( {children}