fix(search): address request search review feedback
This commit is contained in:
@@ -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", () => {
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user