fix(search): address request search review feedback

This commit is contained in:
Quick
2026-05-26 15:11:10 -04:00
parent 17a2cb0844
commit cd42610c95
9 changed files with 125 additions and 17 deletions
+35 -1
View File
@@ -80,10 +80,23 @@ describe("useRequestSearch", () => {
expect(init.signal).toBe(controller.signal);
});
it("uses a 5-minute staleTime", () => {
it("keeps the existing Requests page staleTime by default", () => {
mocks.useCurrentProfile.mockReturnValue({ profile: { id: "p" } });
render(<CallHook mediaType="all" q="dune" />);
const options = mocks.useQuery.mock.calls[0]![0] as { staleTime: number };
expect(options.staleTime).toBe(30 * 1000);
});
it("allows callers to opt into a longer staleTime", () => {
mocks.useCurrentProfile.mockReturnValue({ profile: { id: "p" } });
function CallHookWithStaleTime() {
useRequestSearch("all", "dune", 1, { staleTime: 5 * 60 * 1000 });
return null;
}
render(<CallHookWithStaleTime />);
const options = mocks.useQuery.mock.calls[0]![0] as { staleTime: number };
expect(options.staleTime).toBe(5 * 60 * 1000);
});
@@ -108,6 +121,27 @@ describe("useRequestSearch", () => {
const options = mocks.useQuery.mock.calls[0]![0] as { enabled: boolean };
expect(options.enabled).toBe(true);
});
it("does not require profile by default", () => {
mocks.useCurrentProfile.mockReturnValue({ profile: null });
render(<CallHook mediaType="all" q="dune" />);
const options = mocks.useQuery.mock.calls[0]![0] as { enabled: boolean };
expect(options.enabled).toBe(true);
});
it("can require a profile before fetching", () => {
mocks.useCurrentProfile.mockReturnValue({ profile: null });
function CallHookRequiringProfile() {
useRequestSearch("all", "dune", 1, { requireProfile: true });
return null;
}
render(<CallHookRequiringProfile />);
const options = mocks.useQuery.mock.calls[0]![0] as { enabled: boolean };
expect(options.enabled).toBe(false);
});
});
describe("requestKeys.all invalidation", () => {
+8 -3
View File
@@ -29,7 +29,6 @@ import type {
import { adminKeys, requestKeys } from "./keys";
const REQUESTS_STALE_TIME = 30_000;
const REQUEST_SEARCH_STALE_TIME = 5 * 60 * 1000;
const DISCOVER_BRAND_STALE_TIME = 24 * 60 * 60 * 1000;
const BROWSE_STALE_TIME = 60 * 1000;
@@ -156,6 +155,10 @@ export function useRequestMediaDetail(mediaType: RequestMediaType, tmdbID: numbe
export interface UseRequestSearchOptions {
/** When false, suppresses the query regardless of the query string. Default: true. */
enabled?: boolean;
/** When true, suppresses the query until the active profile is loaded. Default: false. */
requireProfile?: boolean;
/** Cache freshness window for this search surface. Default: existing Requests page timing. */
staleTime?: number;
}
export function useRequestSearch(
@@ -172,6 +175,7 @@ export function useRequestSearch(
// later be read by a different viewer.
const viewerKey = profile?.id ?? "anon";
const enabledOverride = options.enabled ?? true;
const requireProfile = options.requireProfile ?? false;
return useQuery({
queryKey: requestKeys.search(mediaType, normalizedQuery, page, viewerKey),
@@ -183,8 +187,9 @@ export function useRequestSearch(
});
return api<RequestMediaPage>(`/requests/search?${params}`, { signal });
},
enabled: enabledOverride && normalizedQuery.length > 1 && Boolean(profile?.id),
staleTime: REQUEST_SEARCH_STALE_TIME,
enabled:
enabledOverride && normalizedQuery.length > 1 && (!requireProfile || Boolean(profile?.id)),
staleTime: options.staleTime ?? REQUESTS_STALE_TIME,
});
}