@parcae/sdk 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -149,7 +149,7 @@ function doFetch(key, entry, chain) {
149
149
  });
150
150
  }
151
151
  function useQuery(chain, options = {}) {
152
- useParcae();
152
+ const client = useParcae();
153
153
  const waitForAuth = options.waitForAuth ?? true;
154
154
  const { status: authStatus, version: authVersion } = useAuthStatus();
155
155
  const authReady = !waitForAuth || authStatus !== "pending";
@@ -194,6 +194,13 @@ function useQuery(chain, options = {}) {
194
194
  if (entry2.items === EMPTY) {
195
195
  doFetch(key, entry2, chain);
196
196
  }
197
+ if (chain.__modelType) {
198
+ const unsub = client.subscribe(
199
+ `model:${chain.__modelType}:changed`,
200
+ () => doFetch(key, getOrCreate(key), chain)
201
+ );
202
+ return unsub;
203
+ }
197
204
  }, [key]);
198
205
  const refetch = () => {
199
206
  if (!key || !chain) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/context.ts","../../src/react/Provider.tsx","../../src/react/useAuth.ts","../../src/react/useQuery.ts","../../src/react/useApi.ts","../../src/react/useSetting.ts","../../src/react/gates.tsx"],"names":["useEffect","useRef","entry","useMemo","useState","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ParcaeClient } from \"../client\";\n\n// Use globalThis to ensure all copies of @parcae/sdk share the same context\n// (pnpm can install multiple copies — they all need the same React context)\nconst KEY = \"__parcae_context\";\nif (!(globalThis as any)[KEY]) {\n (globalThis as any)[KEY] = createContext<ParcaeClient | null>(null);\n}\n\nexport const ParcaeContext: React.Context<ParcaeClient | null> = (\n globalThis as any\n)[KEY];\n\nexport function useParcae(): ParcaeClient {\n const client = useContext(ParcaeContext);\n if (!client)\n throw new Error(\"useParcae must be used within a <ParcaeProvider>\");\n return client;\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport { createClient } from \"../client\";\nimport type { ParcaeClient, ClientConfig } from \"../client\";\nimport type { AuthClientAdapter } from \"../auth-adapter\";\nimport { ParcaeContext } from \"./context\";\nimport { log } from \"../log\";\n\nexport interface ParcaeProviderProps {\n /** Pre-created client instance. */\n client?: ParcaeClient;\n /** Backend URL. */\n url?: string;\n /** Auth adapter — handles session resolution internally. */\n auth?: AuthClientAdapter;\n version?: string;\n transport?: ClientConfig[\"transport\"];\n children: React.ReactNode;\n onReady?: (client: ParcaeClient) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ParcaeProvider: React.FC<ParcaeProviderProps> = ({\n client: externalClient,\n url,\n auth,\n version = \"v1\",\n transport = \"socket\",\n children,\n onReady,\n onError,\n}) => {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n if (!url)\n throw new Error(\n \"ParcaeProvider requires either a `client` or `url` prop\",\n );\n // Don't pass token — auth adapter handles it\n return createClient({ url, version, transport });\n }, [externalClient, url, version, transport]);\n\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n // Initialize auth adapter and resolve session\n useEffect(() => {\n if (!auth) {\n // No auth adapter — resolve as unauthenticated immediately\n client.authenticate(null).catch(() => {});\n return;\n }\n\n // Init adapter with the backend URL\n auth.init(url || \"\");\n\n // Resolve session and authenticate\n const doAuth = async () => {\n try {\n const token = await auth.getToken();\n await client.authenticate(token);\n onReadyRef.current?.(client);\n } catch (err: any) {\n log.warn(\"auth failed:\", err?.message);\n await client.authenticate(null);\n onErrorRef.current?.(err);\n }\n };\n\n doAuth();\n\n // Subscribe to session changes (login/logout)\n const unsub = auth.onChange((token) => {\n client.authenticate(token).catch(() => {});\n });\n\n return unsub;\n }, [auth, client, url]);\n\n // On socket reconnect, re-resolve session via auth adapter\n useEffect(() => {\n if (!auth) return;\n\n const onReconnect = async () => {\n log.debug(\"reconnected — re-resolving session\");\n try {\n const token = await auth.getToken();\n await client.authenticate(token);\n } catch {\n await client.authenticate(null);\n }\n };\n\n client.on(\"connected\", onReconnect);\n return () => {\n client.off(\"connected\", onReconnect);\n };\n }, [auth, client]);\n\n // Forward errors\n useEffect(() => {\n const onErr = (err: Error) => onErrorRef.current?.(err);\n client.on(\"error\", onErr);\n return () => {\n client.off(\"error\", onErr);\n };\n }, [client]);\n\n return (\n <ParcaeContext.Provider value={client}>{children}</ParcaeContext.Provider>\n );\n};\n\nexport default ParcaeProvider;\n","\"use client\";\n\n/**\n * Internal hook to read auth state reactively.\n * No Valtio — just reads the gate state and re-renders when it changes.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useParcae } from \"./context\";\nimport type { AuthStatus } from \"../auth-gate\";\n\nexport function useAuthStatus(): {\n status: AuthStatus;\n userId: string | null;\n version: number;\n} {\n const client = useParcae();\n const transport = client.transport as any;\n const gate = transport?.auth;\n\n const [, forceRender] = useState(0);\n\n useEffect(() => {\n if (!gate) return;\n let mounted = true;\n const check = () => {\n if (mounted) forceRender((n) => n + 1);\n };\n gate.ready.then(check);\n return () => {\n mounted = false;\n };\n }, [gate, gate?.state?.version]);\n\n return {\n status: gate?.state?.status ?? \"pending\",\n userId: gate?.state?.userId ?? null,\n version: gate?.state?.version ?? 0,\n };\n}\n","\"use client\";\n\nimport { useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\nimport { log } from \"../log\";\n\ninterface QueryChain<T> {\n find(): Promise<T[]>;\n __steps?: any[];\n __modelType?: string;\n __modelClass?: any;\n __adapter?: any;\n}\n\ninterface UseQueryOptions {\n waitForAuth?: boolean;\n}\n\ninterface UseQueryResult<T> {\n items: T[];\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n// ── Cache ────────────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n items: any[];\n loading: boolean;\n error: Error | null;\n refs: number;\n listeners: Set<() => void>;\n dispose: (() => void) | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst GC_DELAY = 60_000;\nconst EMPTY: any[] = [];\n\nfunction getOrCreate(key: string): CacheEntry {\n let e = cache.get(key);\n if (!e) {\n e = {\n items: EMPTY,\n loading: true,\n error: null,\n refs: 0,\n listeners: new Set(),\n dispose: null,\n gcTimer: null,\n };\n cache.set(key, e);\n }\n return e;\n}\n\nfunction notify(e: CacheEntry): void {\n for (const fn of e.listeners) fn();\n}\n\nfunction doFetch(key: string, entry: CacheEntry, chain: QueryChain<any>): void {\n log.debug(\"useQuery: fetching\", chain.__modelType);\n entry.loading = true;\n entry.error = null;\n notify(entry);\n\n chain\n .find()\n .then((result: any[]) => {\n log.debug(\"useQuery: got\", result.length, \"items for\", chain.__modelType);\n entry.items = result;\n entry.loading = false;\n notify(entry);\n })\n .catch((err: Error) => {\n log.error(\"useQuery: error\", err.message);\n entry.error = err;\n entry.loading = false;\n notify(entry);\n });\n}\n\n// ── useQuery ─────────────────────────────────────────────────────────────────\n\nexport function useQuery<T>(\n chain: QueryChain<T> | null | undefined,\n options: UseQueryOptions = {},\n): UseQueryResult<T> {\n const client = useParcae();\n const waitForAuth = options.waitForAuth ?? true;\n const { status: authStatus, version: authVersion } = useAuthStatus();\n const authReady = !waitForAuth || authStatus !== \"pending\";\n\n const key =\n chain && authReady\n ? `${chain.__modelType}:${authVersion}:${JSON.stringify(chain.__steps ?? [])}`\n : null;\n\n const keyRef = useRef(key);\n keyRef.current = key;\n\n const subscribe = (onChange: () => void) => {\n const k = keyRef.current;\n if (!k) return () => {};\n const e = getOrCreate(k);\n e.refs++;\n e.listeners.add(onChange);\n if (e.gcTimer) {\n clearTimeout(e.gcTimer);\n e.gcTimer = null;\n }\n return () => {\n e.listeners.delete(onChange);\n e.refs--;\n if (e.refs <= 0) {\n e.gcTimer = setTimeout(() => {\n e.dispose?.();\n cache.delete(k);\n }, GC_DELAY);\n }\n };\n };\n\n const getSnapshot = (): any[] => {\n const k = keyRef.current;\n if (!k) return EMPTY;\n return cache.get(k)?.items ?? EMPTY;\n };\n\n const items = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as T[];\n\n useEffect(() => {\n if (!key || !chain) return;\n const entry = getOrCreate(key);\n if (entry.items === EMPTY) {\n doFetch(key, entry, chain);\n }\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const refetch = () => {\n if (!key || !chain) return;\n doFetch(key, getOrCreate(key), chain);\n };\n\n if (!key)\n return {\n items: EMPTY as T[],\n loading: !authReady,\n error: null,\n refetch: () => {},\n };\n const entry = cache.get(key);\n return {\n items,\n loading: entry?.loading ?? true,\n error: entry?.error ?? null,\n refetch,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\n\nexport function useApi() {\n const client = useParcae();\n return useMemo(\n () => ({\n get: client.get.bind(client),\n post: client.post.bind(client),\n put: client.put.bind(client),\n patch: client.patch.bind(client),\n delete: client.delete.bind(client),\n }),\n [client],\n );\n}\n\nexport function useSDK() {\n return useParcae();\n}\n\nexport function useConnectionStatus() {\n const client = useParcae();\n const { status } = useAuthStatus();\n return { isConnected: client.isConnected, authStatus: status };\n}\n\nexport function useAuthState() {\n return useAuthStatus();\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\n\nexport function useSetting<T = string>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => Promise<void>, { isLoading: boolean }] {\n const client = useParcae();\n const { status: authStatus } = useAuthStatus();\n\n const [value, setValue] = useState<T>(defaultValue);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (authStatus === \"pending\") return;\n if (authStatus === \"unauthenticated\") {\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n client\n .get(`/settings/${encodeURIComponent(key)}`)\n .then((result: any) => {\n if (!cancelled && result?.value !== undefined) setValue(result.value);\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [key, client, authStatus]);\n\n const update = useCallback(\n async (newValue: T) => {\n setValue(newValue);\n await client.put(`/settings/${encodeURIComponent(key)}`, {\n value: newValue,\n });\n },\n [key, client],\n );\n\n return [value, update, { isLoading }];\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useAuthStatus } from \"./useAuth\";\n\ninterface GateProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function Authenticated({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"authenticated\" ? <>{children}</> : <>{fallback}</>;\n}\n\nexport function Unauthenticated({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"unauthenticated\" ? <>{children}</> : <>{fallback}</>;\n}\n\nexport function AuthLoading({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"pending\" ? <>{children}</> : <>{fallback}</>;\n}\n"]}
1
+ {"version":3,"sources":["../../src/react/context.ts","../../src/react/Provider.tsx","../../src/react/useAuth.ts","../../src/react/useQuery.ts","../../src/react/useApi.ts","../../src/react/useSetting.ts","../../src/react/gates.tsx"],"names":["useEffect","useRef","entry","useMemo","useState","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ParcaeClient } from \"../client\";\n\n// Use globalThis to ensure all copies of @parcae/sdk share the same context\n// (pnpm can install multiple copies — they all need the same React context)\nconst KEY = \"__parcae_context\";\nif (!(globalThis as any)[KEY]) {\n (globalThis as any)[KEY] = createContext<ParcaeClient | null>(null);\n}\n\nexport const ParcaeContext: React.Context<ParcaeClient | null> = (\n globalThis as any\n)[KEY];\n\nexport function useParcae(): ParcaeClient {\n const client = useContext(ParcaeContext);\n if (!client)\n throw new Error(\"useParcae must be used within a <ParcaeProvider>\");\n return client;\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport { createClient } from \"../client\";\nimport type { ParcaeClient, ClientConfig } from \"../client\";\nimport type { AuthClientAdapter } from \"../auth-adapter\";\nimport { ParcaeContext } from \"./context\";\nimport { log } from \"../log\";\n\nexport interface ParcaeProviderProps {\n /** Pre-created client instance. */\n client?: ParcaeClient;\n /** Backend URL. */\n url?: string;\n /** Auth adapter — handles session resolution internally. */\n auth?: AuthClientAdapter;\n version?: string;\n transport?: ClientConfig[\"transport\"];\n children: React.ReactNode;\n onReady?: (client: ParcaeClient) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ParcaeProvider: React.FC<ParcaeProviderProps> = ({\n client: externalClient,\n url,\n auth,\n version = \"v1\",\n transport = \"socket\",\n children,\n onReady,\n onError,\n}) => {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n if (!url)\n throw new Error(\n \"ParcaeProvider requires either a `client` or `url` prop\",\n );\n // Don't pass token — auth adapter handles it\n return createClient({ url, version, transport });\n }, [externalClient, url, version, transport]);\n\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n // Initialize auth adapter and resolve session\n useEffect(() => {\n if (!auth) {\n // No auth adapter — resolve as unauthenticated immediately\n client.authenticate(null).catch(() => {});\n return;\n }\n\n // Init adapter with the backend URL\n auth.init(url || \"\");\n\n // Resolve session and authenticate\n const doAuth = async () => {\n try {\n const token = await auth.getToken();\n await client.authenticate(token);\n onReadyRef.current?.(client);\n } catch (err: any) {\n log.warn(\"auth failed:\", err?.message);\n await client.authenticate(null);\n onErrorRef.current?.(err);\n }\n };\n\n doAuth();\n\n // Subscribe to session changes (login/logout)\n const unsub = auth.onChange((token) => {\n client.authenticate(token).catch(() => {});\n });\n\n return unsub;\n }, [auth, client, url]);\n\n // On socket reconnect, re-resolve session via auth adapter\n useEffect(() => {\n if (!auth) return;\n\n const onReconnect = async () => {\n log.debug(\"reconnected — re-resolving session\");\n try {\n const token = await auth.getToken();\n await client.authenticate(token);\n } catch {\n await client.authenticate(null);\n }\n };\n\n client.on(\"connected\", onReconnect);\n return () => {\n client.off(\"connected\", onReconnect);\n };\n }, [auth, client]);\n\n // Forward errors\n useEffect(() => {\n const onErr = (err: Error) => onErrorRef.current?.(err);\n client.on(\"error\", onErr);\n return () => {\n client.off(\"error\", onErr);\n };\n }, [client]);\n\n return (\n <ParcaeContext.Provider value={client}>{children}</ParcaeContext.Provider>\n );\n};\n\nexport default ParcaeProvider;\n","\"use client\";\n\n/**\n * Internal hook to read auth state reactively.\n * No Valtio — just reads the gate state and re-renders when it changes.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useParcae } from \"./context\";\nimport type { AuthStatus } from \"../auth-gate\";\n\nexport function useAuthStatus(): {\n status: AuthStatus;\n userId: string | null;\n version: number;\n} {\n const client = useParcae();\n const transport = client.transport as any;\n const gate = transport?.auth;\n\n const [, forceRender] = useState(0);\n\n useEffect(() => {\n if (!gate) return;\n let mounted = true;\n const check = () => {\n if (mounted) forceRender((n) => n + 1);\n };\n gate.ready.then(check);\n return () => {\n mounted = false;\n };\n }, [gate, gate?.state?.version]);\n\n return {\n status: gate?.state?.status ?? \"pending\",\n userId: gate?.state?.userId ?? null,\n version: gate?.state?.version ?? 0,\n };\n}\n","\"use client\";\n\nimport { useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\nimport { log } from \"../log\";\n\ninterface QueryChain<T> {\n find(): Promise<T[]>;\n __steps?: any[];\n __modelType?: string;\n __modelClass?: any;\n __adapter?: any;\n}\n\ninterface UseQueryOptions {\n waitForAuth?: boolean;\n}\n\ninterface UseQueryResult<T> {\n items: T[];\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n// ── Cache ────────────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n items: any[];\n loading: boolean;\n error: Error | null;\n refs: number;\n listeners: Set<() => void>;\n dispose: (() => void) | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst GC_DELAY = 60_000;\nconst EMPTY: any[] = [];\n\nfunction getOrCreate(key: string): CacheEntry {\n let e = cache.get(key);\n if (!e) {\n e = {\n items: EMPTY,\n loading: true,\n error: null,\n refs: 0,\n listeners: new Set(),\n dispose: null,\n gcTimer: null,\n };\n cache.set(key, e);\n }\n return e;\n}\n\nfunction notify(e: CacheEntry): void {\n for (const fn of e.listeners) fn();\n}\n\nfunction doFetch(key: string, entry: CacheEntry, chain: QueryChain<any>): void {\n log.debug(\"useQuery: fetching\", chain.__modelType);\n entry.loading = true;\n entry.error = null;\n notify(entry);\n\n chain\n .find()\n .then((result: any[]) => {\n log.debug(\"useQuery: got\", result.length, \"items for\", chain.__modelType);\n entry.items = result;\n entry.loading = false;\n notify(entry);\n })\n .catch((err: Error) => {\n log.error(\"useQuery: error\", err.message);\n entry.error = err;\n entry.loading = false;\n notify(entry);\n });\n}\n\n// ── useQuery ─────────────────────────────────────────────────────────────────\n\nexport function useQuery<T>(\n chain: QueryChain<T> | null | undefined,\n options: UseQueryOptions = {},\n): UseQueryResult<T> {\n const client = useParcae();\n const waitForAuth = options.waitForAuth ?? true;\n const { status: authStatus, version: authVersion } = useAuthStatus();\n const authReady = !waitForAuth || authStatus !== \"pending\";\n\n const key =\n chain && authReady\n ? `${chain.__modelType}:${authVersion}:${JSON.stringify(chain.__steps ?? [])}`\n : null;\n\n const keyRef = useRef(key);\n keyRef.current = key;\n\n const subscribe = (onChange: () => void) => {\n const k = keyRef.current;\n if (!k) return () => {};\n const e = getOrCreate(k);\n e.refs++;\n e.listeners.add(onChange);\n if (e.gcTimer) {\n clearTimeout(e.gcTimer);\n e.gcTimer = null;\n }\n return () => {\n e.listeners.delete(onChange);\n e.refs--;\n if (e.refs <= 0) {\n e.gcTimer = setTimeout(() => {\n e.dispose?.();\n cache.delete(k);\n }, GC_DELAY);\n }\n };\n };\n\n const getSnapshot = (): any[] => {\n const k = keyRef.current;\n if (!k) return EMPTY;\n return cache.get(k)?.items ?? EMPTY;\n };\n\n const items = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as T[];\n\n useEffect(() => {\n if (!key || !chain) return;\n const entry = getOrCreate(key);\n if (entry.items === EMPTY) {\n doFetch(key, entry, chain);\n }\n\n // Subscribe to model-level change events → refetch\n if (chain.__modelType) {\n const unsub = client.subscribe(`model:${chain.__modelType}:changed`, () =>\n doFetch(key, getOrCreate(key), chain),\n );\n return unsub;\n }\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const refetch = () => {\n if (!key || !chain) return;\n doFetch(key, getOrCreate(key), chain);\n };\n\n if (!key)\n return {\n items: EMPTY as T[],\n loading: !authReady,\n error: null,\n refetch: () => {},\n };\n const entry = cache.get(key);\n return {\n items,\n loading: entry?.loading ?? true,\n error: entry?.error ?? null,\n refetch,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\n\nexport function useApi() {\n const client = useParcae();\n return useMemo(\n () => ({\n get: client.get.bind(client),\n post: client.post.bind(client),\n put: client.put.bind(client),\n patch: client.patch.bind(client),\n delete: client.delete.bind(client),\n }),\n [client],\n );\n}\n\nexport function useSDK() {\n return useParcae();\n}\n\nexport function useConnectionStatus() {\n const client = useParcae();\n const { status } = useAuthStatus();\n return { isConnected: client.isConnected, authStatus: status };\n}\n\nexport function useAuthState() {\n return useAuthStatus();\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useParcae } from \"./context\";\nimport { useAuthStatus } from \"./useAuth\";\n\nexport function useSetting<T = string>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => Promise<void>, { isLoading: boolean }] {\n const client = useParcae();\n const { status: authStatus } = useAuthStatus();\n\n const [value, setValue] = useState<T>(defaultValue);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (authStatus === \"pending\") return;\n if (authStatus === \"unauthenticated\") {\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n client\n .get(`/settings/${encodeURIComponent(key)}`)\n .then((result: any) => {\n if (!cancelled && result?.value !== undefined) setValue(result.value);\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [key, client, authStatus]);\n\n const update = useCallback(\n async (newValue: T) => {\n setValue(newValue);\n await client.put(`/settings/${encodeURIComponent(key)}`, {\n value: newValue,\n });\n },\n [key, client],\n );\n\n return [value, update, { isLoading }];\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useAuthStatus } from \"./useAuth\";\n\ninterface GateProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function Authenticated({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"authenticated\" ? <>{children}</> : <>{fallback}</>;\n}\n\nexport function Unauthenticated({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"unauthenticated\" ? <>{children}</> : <>{fallback}</>;\n}\n\nexport function AuthLoading({ children, fallback = null }: GateProps) {\n const { status } = useAuthStatus();\n return status === \"pending\" ? <>{children}</> : <>{fallback}</>;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parcae/sdk",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Parcae SDK — client transport and React hooks for Parcae backends",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",