feat(web): useSearch infinite query + useDebouncedValue + MSW search handler
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,27 @@ export const personAuthorities: AuthorityView[] = [
|
||||
{ id: "a-ada", kind: "person", external_uri: null, labels: [{ lang: "en", label: "Ada Lovelace" }] },
|
||||
];
|
||||
|
||||
export type SearchHitView = components["schemas"]["SearchHitView"];
|
||||
|
||||
export const searchHits: SearchHitView[] = [
|
||||
{
|
||||
id: amphora.id,
|
||||
object_number: "2019.4.12",
|
||||
object_name: "Bronze figurine",
|
||||
brief_description: "A small cast figure.",
|
||||
visibility: "public",
|
||||
snippet: "cast bronze with green patina",
|
||||
},
|
||||
...Array.from({ length: 24 }, (_, i) => ({
|
||||
id: `s-${i + 2}`,
|
||||
object_number: `N-${i + 2}`,
|
||||
object_name: `Object ${i + 2}`,
|
||||
brief_description: null,
|
||||
visibility: "internal",
|
||||
snippet: null,
|
||||
})),
|
||||
];
|
||||
|
||||
export type VocabularyView = components["schemas"]["VocabularyView"];
|
||||
|
||||
export const vocabularies: VocabularyView[] = [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { http, HttpResponse } from "msw";
|
||||
|
||||
import { amphora, fibula, fieldDefinitions, materialTerms, objectsPage, personAuthorities, vocabularies } from "./fixtures";
|
||||
import { amphora, fibula, fieldDefinitions, materialTerms, objectsPage, personAuthorities, searchHits, vocabularies } from "./fixtures";
|
||||
|
||||
export const handlers = [
|
||||
http.get("/api/admin/me", () =>
|
||||
@@ -49,6 +49,20 @@ export const handlers = [
|
||||
|
||||
http.delete("/api/admin/objects/:id", () => new HttpResponse(null, { status: 204 })),
|
||||
|
||||
http.get("/api/admin/search", ({ request }) => {
|
||||
const url = new URL(request.url);
|
||||
const q = (url.searchParams.get("q") ?? "").trim();
|
||||
const offset = Number(url.searchParams.get("offset") ?? 0);
|
||||
const limit = Number(url.searchParams.get("limit") ?? 20);
|
||||
|
||||
if (!q) return HttpResponse.json({ hits: [], estimated_total: 0 });
|
||||
|
||||
return HttpResponse.json({
|
||||
hits: searchHits.slice(offset, offset + limit),
|
||||
estimated_total: searchHits.length,
|
||||
});
|
||||
}),
|
||||
|
||||
http.post("/api/admin/login", () => new HttpResponse(null, { status: 204 })),
|
||||
|
||||
http.post("/api/admin/logout", () => new HttpResponse(null, { status: 204 })),
|
||||
|
||||
Reference in New Issue
Block a user