import { useAuthStore } from '../stores/authStore'; const BASE_URL = ''; function getToken(): string | null { try { const raw = localStorage.getItem('clinicpro-auth'); if (!raw) return null; const parsed = JSON.parse(raw); return parsed?.state?.token ?? null; } catch { return null; } } export class ApiError extends Error { constructor( public status: number, public code: string, message: string, ) { super(message); } } async function request( path: string, options: RequestInit = {}, ): Promise { const token = getToken(); const headers: Record = { 'Content-Type': 'application/json', ...(options.headers as Record), }; if (token) headers['Authorization'] = `Bearer ${token}`; const res = await fetch(`${BASE_URL}${path}`, { ...options, headers }); if (!res.ok) { if (res.status === 401) { useAuthStore.getState().logout(); window.location.replace('/admin/login'); throw new ApiError(401, 'ERR_UNAUTHORIZED', 'نشست منقضی شده است'); } const body = await res.json().catch(() => ({})); const firstErr = body?.errors?.[0]; throw new ApiError( res.status, firstErr?.code ?? 'ERR_UNKNOWN', firstErr?.message ?? 'خطای ناشناخته', ); } return res.json() as Promise; } export const api = { get: (path: string) => request(path), post: (path: string, body: unknown) => request(path, { method: 'POST', body: JSON.stringify(body) }), patch: (path: string, body: unknown) => request(path, { method: 'PATCH', body: JSON.stringify(body) }), put: (path: string, body: unknown) => request(path, { method: 'PUT', body: JSON.stringify(body) }), delete: (path: string) => request(path, { method: 'DELETE' }), }; export interface ApiResponse { success: boolean; data: T; errors: { code: string; message: string; field?: string }[]; } export interface PaginatedResponse { success: boolean; data: T[]; meta: { totalRecords: number; totalPages: number; currentPage: number; }; errors: []; }