From 53d55448e6da331c96970d1c6baaf58b5f2d26fa Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 6 Feb 2025 09:01:11 +0100 Subject: [PATCH] fix clearing schema on unauthorized secrets fetching --- app/src/ui/client/BkndProvider.tsx | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/app/src/ui/client/BkndProvider.tsx b/app/src/ui/client/BkndProvider.tsx index 1209c0e..813fd4d 100644 --- a/app/src/ui/client/BkndProvider.tsx +++ b/app/src/ui/client/BkndProvider.tsx @@ -23,6 +23,12 @@ type BkndContext = { const BkndContext = createContext(undefined!); export type { TSchemaActions }; +enum Fetching { + None = 0, + Schema = 1, + Secrets = 2 +} + export function BkndProvider({ includeSecrets = false, adminOverride, @@ -38,6 +44,7 @@ export function BkndProvider({ const [fetched, setFetched] = useState(false); const [error, setError] = useState(); const errorShown = useRef(); + const fetching = useRef(Fetching.None); const [local_version, set_local_version] = useState(0); const api = useApi(); @@ -46,7 +53,12 @@ export function BkndProvider({ } async function fetchSchema(_includeSecrets: boolean = false, force?: boolean) { + const requesting = withSecrets ? Fetching.Secrets : Fetching.Schema; + if (fetching.current === requesting) return; + if (withSecrets && !force) return; + fetching.current = requesting; + const res = await api.system.readSchema({ config: true, secrets: _includeSecrets @@ -57,12 +69,13 @@ export function BkndProvider({ errorShown.current = true; setError(true); - //return; + // if already has schema, don't overwrite + if (fetched && schema?.schema) return; } else if (error) { setError(false); } - const schema = res.ok + const newSchema = res.ok ? res.body : ({ version: 0, @@ -72,17 +85,18 @@ export function BkndProvider({ } as any); if (adminOverride) { - schema.config.server.admin = { - ...schema.config.server.admin, + newSchema.config.server.admin = { + ...newSchema.config.server.admin, ...adminOverride }; } startTransition(() => { - setSchema(schema); + setSchema(newSchema); setWithSecrets(_includeSecrets); setFetched(true); set_local_version((v) => v + 1); + fetching.current = Fetching.None; }); }