Files
mtdb_movie/resources/client/search/requests/use-search-results.ts
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

49 lines
1.4 KiB
TypeScript
Executable File

import { keepPreviousData, useQuery } from "@tanstack/react-query";
import { apiClient } from "@common/http/query-client";
import {
BackendResponse
} from "@common/http/backend-response/backend-response";
import { Title } from "@app/titles/models/title";
import { Person } from "@app/titles/models/person";
import {
getBootstrapData
} from "@common/core/bootstrap-data/use-backend-bootstrap-data";
export interface SearchResponse extends BackendResponse {
query: string;
results: (Title | Person)[];
}
export function useSearchResults(
loader: 'searchPage' | 'searchAutocomplete',
query: string = '',
) {
query = query.trim();
// sending only dot will cause an error as browser strips it out
if (query === '.') {
query = '';
}
return useQuery({
queryKey: ['search', query, 'loader'],
queryFn: ({signal}) => search(loader, query, signal),
enabled: !!query,
placeholderData: !!query ? keepPreviousData : undefined,
initialData: () => {
const data = getBootstrapData().loaders?.[loader];
if (query && data?.query == query) {
return data;
}
},
});
}
async function search(loader: string, query: string, signal: AbortSignal) {
await new Promise(resolve => setTimeout(resolve, 300));
return apiClient
.get<SearchResponse>(`search/${encodeURIComponent(query)}`, {
params: { loader },
signal
})
.then(response => response.data);
}