/** * API helpers for server components (forwards cookies) and client components (credentials: include). */ const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; // ─── Server-side fetch (use in Server Components / Route Handlers) ───────────── export async function apiFetch( path: string, init?: RequestInit ): Promise { // Dynamic import so this module can also be imported in client components // The `cookies` call only runs on the server side let cookieHeader = ""; try { const { cookies } = await import("next/headers"); const store = await cookies(); cookieHeader = store .getAll() .map((c) => `${c.name}=${c.value}`) .join("; "); } catch { // We're on the client — skip cookie forwarding } const res = await fetch(`${API_URL}${path}`, { ...init, cache: "no-store", headers: { "Content-Type": "application/json", ...(cookieHeader ? { Cookie: cookieHeader } : {}), ...(init?.headers as Record | undefined), }, }); if (!res.ok) { let msg = `API error ${res.status}`; try { const body = await res.json(); msg = body?.error?.message || body?.message || msg; } catch { /* ignore */ } throw new ApiError(msg, res.status); } // Some endpoints return 204 No Content const text = await res.text(); if (!text) return undefined as T; return JSON.parse(text) as T; } // ─── Client-side fetch (use in Client Components) ───────────────────────────── export async function clientFetch( path: string, init?: RequestInit ): Promise { const res = await fetch(`${API_URL}${path}`, { ...init, credentials: "include", headers: { "Content-Type": "application/json", ...(init?.headers as Record | undefined), }, }); if (!res.ok) { let msg = `API error ${res.status}`; try { const body = await res.json(); msg = body?.error?.message || body?.message || msg; } catch { /* ignore */ } throw new ApiError(msg, res.status); } const text = await res.text(); if (!text) return undefined as T; return JSON.parse(text) as T; } export class ApiError extends Error { constructor( message: string, public status: number ) { super(message); this.name = "ApiError"; } } export { API_URL };