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 @@
-
+
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 @@ default: return 0
}
}
-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 @@ const url = `/api/v1/sessions${qs ? `?${qs}` : ''}`
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 @@ default: return 0
}
}
-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 @@ const url = `/api/v1/projects${qs ? `?${qs}` : ''}`
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 @@ useEffect(() => {
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 <>>