4037816998
- wallet: parse {balance: string} response
- favorites: addFavorite returns void (EmptyResp)
- services: handle paginated response from listServicesByPlayer
- files: use query param ?key= instead of path param /:id
- search: remove unsupported selectedGames/minRating params
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { isApiError } from "@/lib/errors"
|
|
import type { SearchResponse, SearchSort } from "@/lib/search/types"
|
|
|
|
import { httpJson } from "./http"
|
|
|
|
export interface SearchCatalogParams {
|
|
q?: string
|
|
selectedGames?: string[]
|
|
min?: string
|
|
max?: string
|
|
onlyOnline?: boolean
|
|
minRating?: string
|
|
sort?: SearchSort
|
|
limit?: number
|
|
offset?: number
|
|
signal?: AbortSignal
|
|
}
|
|
|
|
export async function searchCatalog(params: SearchCatalogParams): Promise<SearchResponse> {
|
|
const searchParams = new URLSearchParams()
|
|
|
|
if (params.q) searchParams.set("q", params.q)
|
|
if (params.min) searchParams.set("min", params.min)
|
|
if (params.max) searchParams.set("max", params.max)
|
|
if (params.onlyOnline !== undefined) searchParams.set("onlyOnline", String(params.onlyOnline))
|
|
if (params.sort && params.sort !== "composite") searchParams.set("sort", params.sort)
|
|
|
|
if (params.limit !== undefined) searchParams.set("limit", String(params.limit))
|
|
if (params.offset !== undefined) searchParams.set("offset", String(params.offset))
|
|
|
|
try {
|
|
return await httpJson<SearchResponse>(`/api/v1/search?${searchParams.toString()}`, {
|
|
cache: "no-store",
|
|
signal: params.signal,
|
|
})
|
|
} catch (error) {
|
|
if (error instanceof Error && error.message === "UNAUTHORIZED") {
|
|
throw error
|
|
}
|
|
if (isApiError(error)) {
|
|
throw new Error(`Search API request failed: ${error.code} ${error.msg}`)
|
|
}
|
|
throw error
|
|
}
|
|
}
|