SPB Git

spb/ai-atlas

Public
1.1 KB · 19 lines typescript
1'use client';2/** Browser-side fetches: same origin `/api/v1/*` (Next rewrite → FastAPI). Never import server `api.ts` in client components. */3import type { ChangeEvent, Page, SearchPayload, Suggestion } from './types';45async function get<T>(path: string, signal?: AbortSignal): Promise<T> {6  const res = await fetch(`/api/v1${path}`, { headers: { accept: 'application/json' }, signal });7  if (!res.ok) throw new Error(`API ${res.status} on ${path}`);8  return (await res.json()) as T;9}1011export const clientApi = {12  suggest: (q: string, signal?: AbortSignal) => get<{ items: Suggestion[] }>(`/search/suggest?q=${encodeURIComponent(q)}`, signal),13  search: (q: string, limit = 10, signal?: AbortSignal) => get<SearchPayload>(`/search?q=${encodeURIComponent(q)}&limit=${limit}`, signal),14  changes: (qs: string, signal?: AbortSignal) => get<Page<ChangeEvent>>(`/changes?${qs}`, signal),15  /** Page-view beacon (1 req/s/IP server-side). Fire-and-forget. */16  view: (path: string) =>17    fetch('/api/v1/views', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ path }), keepalive: true }).catch(() => undefined),18};19
Files · 7456f4abc11ceb761f1f60861a5d96e6ddc93ef4
Menu

Theme