43bbcece7a
Backend: adds JDBC session support, login/status/logout endpoints, and new DTOs (AuthResponse, ConnectionStatusResponse, LoginResult). Frontend replaces the Vite boilerplate with a Dashboard, ServiceCard, and ConnectModal backed by a typed API client. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
22 lines
651 B
TypeScript
22 lines
651 B
TypeScript
const BASE = import.meta.env.VITE_API_URL ?? '/api'
|
|
|
|
export async function apiFetch<T>(path: string, init?: RequestInit): Promise<T> {
|
|
const res = await fetch(`${BASE}${path}`, {
|
|
...init,
|
|
credentials: 'include',
|
|
headers: { 'Content-Type': 'application/json', ...init?.headers },
|
|
})
|
|
if (!res.ok) {
|
|
let message = `Request failed (${res.status})`
|
|
try {
|
|
const body = await res.json()
|
|
if (body?.detail) message = body.detail
|
|
else if (body?.title) message = body.title
|
|
} catch {
|
|
// ignore parse errors
|
|
}
|
|
throw new Error(message)
|
|
}
|
|
return res.status === 204 ? (undefined as T) : res.json()
|
|
}
|