Clafoutis / app /frontend /src /lib /apiClient.ts
Claude
Improve frontend robustness: fix re-renders, add code splitting and error boundary
bab0b06 unverified
import type { SearchRequest, SearchResponse, SourcesResponse } from '../types/api'
const BASE_URL = import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:8000'
const REQUEST_TIMEOUT_MS = 30_000
async function request<T>(path: string, init?: RequestInit): Promise<T> {
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS)
try {
const response = await fetch(`${BASE_URL}${path}`, {
...init,
signal: init?.signal ?? controller.signal,
headers: {
'Content-Type': 'application/json',
...(init?.headers ?? {}),
},
})
if (!response.ok) {
const body = await response.text()
throw new Error(body || `${response.status} ${response.statusText}`)
}
return (await response.json()) as T
} finally {
clearTimeout(timeoutId)
}
}
export async function searchItems(
payload: SearchRequest,
signal?: AbortSignal,
): Promise<SearchResponse> {
return request<SearchResponse>('/api/search', {
method: 'POST',
body: JSON.stringify(payload),
signal,
})
}
export async function listSources(): Promise<SourcesResponse> {
return request<SourcesResponse>('/api/sources')
}