From 6971b2d09703b22178c58427be3211f93648eaca Mon Sep 17 00:00:00 2001 From: Eugene Blikh Date: Sun, 26 Apr 2026 17:03:44 +0300 Subject: [PATCH] =?UTF-8?q?web:=20palette=20=E2=80=94=20gate=20prefetch=20?= =?UTF-8?q?with=20enabled+staleTime=20per=20plan=204.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/server/web/dist/index.html | 2 +- web/src/features/home/useSessions.ts | 9 ++++++++- web/src/features/projects/useProjects.ts | 9 ++++++++- web/src/features/settings/useSavedSearches.ts | 10 ++++++++-- web/src/shell/Palette.tsx | 9 +++++---- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/internal/server/web/dist/index.html b/internal/server/web/dist/index.html index 96db9527ec87a7d37c99188bca2508b08ed0409d..30d60f4fe2fd468ba6c0a87994b536442b08a3f6 100644 --- a/internal/server/web/dist/index.html +++ b/internal/server/web/dist/index.html @@ -13,7 +13,7 @@ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" /> - + diff --git a/web/src/features/home/useSessions.ts b/web/src/features/home/useSessions.ts index 2bb3e7d88ba1c1480cdcb267bab62474436822e8..847f24ec333cb44caaec336fcf215ba6a9b837d8 100644 --- a/web/src/features/home/useSessions.ts +++ b/web/src/features/home/useSessions.ts @@ -28,7 +28,12 @@ function sinceToEpoch(since: string): number { } } -export function useSessions(filters: HomeFilters): UseQueryResult { +export interface UseSessionsOptions { + enabled?: boolean + staleTime?: number +} + +export function useSessions(filters: HomeFilters, options?: UseSessionsOptions): UseQueryResult { const since = filters.since ?? '30d' return useQuery({ @@ -54,5 +59,7 @@ export function useSessions(filters: HomeFilters): UseQueryResult { const data = await apiFetch(url) return data.sessions.map(adaptSession) }, + enabled: options?.enabled, + staleTime: options?.staleTime, }) } diff --git a/web/src/features/projects/useProjects.ts b/web/src/features/projects/useProjects.ts index 29354e1bd4320c08773bc381e1bf92b7499440ec..4e086cbbf0fae0b804f039c3a378f06d911ef414 100644 --- a/web/src/features/projects/useProjects.ts +++ b/web/src/features/projects/useProjects.ts @@ -24,7 +24,12 @@ function sinceToEpoch(since: string): number { } } -export function useProjects(filters: ProjectFilters): UseQueryResult { +export interface UseProjectsOptions { + enabled?: boolean + staleTime?: number +} + +export function useProjects(filters: ProjectFilters, options?: UseProjectsOptions): UseQueryResult { const since = filters.since ?? '30d' return useQuery({ @@ -41,5 +46,7 @@ export function useProjects(filters: ProjectFilters): UseQueryResult const data = await apiFetch(url) return data.projects.map(adaptProject) }, + enabled: options?.enabled, + staleTime: options?.staleTime, }) } diff --git a/web/src/features/settings/useSavedSearches.ts b/web/src/features/settings/useSavedSearches.ts index a1cc965bfb752861f5c349245f59c497c17e195a..c1771af504cd03e9db75a154c94e1a642549eb98 100644 --- a/web/src/features/settings/useSavedSearches.ts +++ b/web/src/features/settings/useSavedSearches.ts @@ -8,14 +8,20 @@ interface SavedSearchesResponse { saved_searches: SavedSearchDTO[] } -export function useSavedSearches(): UseQueryResult { +export interface UseSavedSearchesOptions { + enabled?: boolean + staleTime?: number +} + +export function useSavedSearches(options?: UseSavedSearchesOptions): UseQueryResult { return useQuery({ queryKey: ['saved-searches'], queryFn: async () => { const data = await apiFetch('/api/v1/saved-searches') return data.saved_searches.map(adaptSavedSearch) }, - staleTime: 30_000, + enabled: options?.enabled, + staleTime: options?.staleTime ?? 30_000, }) } diff --git a/web/src/shell/Palette.tsx b/web/src/shell/Palette.tsx index 11f3f46de89b3f05b938a9dd9bed4b823969867e..d910e3529bf3fc9f3c87f9a9b56246f27818935e 100644 --- a/web/src/shell/Palette.tsx +++ b/web/src/shell/Palette.tsx @@ -72,10 +72,11 @@ export function Palette({ open, onClose }: PaletteProps): React.JSX.Element { setCursor(0) }, [query]) - // Always call hooks unconditionally (React rules); data is used only when open - const { data: projects } = useProjects({ since: 'all' }) - const { data: sessions } = useSessions({}) - const { data: savedSearches } = useSavedSearches() + // Always call hooks unconditionally (React rules); enabled+staleTime gate + // network activity so closed-palette renders don't trigger refetches. + const { data: projects } = useProjects({ since: 'all' }, { enabled: open, staleTime: 30_000 }) + const { data: sessions } = useSessions({}, { enabled: open, staleTime: 30_000 }) + const { data: savedSearches } = useSavedSearches({ enabled: open, staleTime: 30_000 }) if (!open) return <>