import type { ApiResponse, CompanyProfileDto, CompanyProfileInput, FileAttachmentDto, GanttLinkDto, GanttTaskDto, LoginRequest, LoginResponse, } from "@mrp/shared"; export class ApiError extends Error { constructor(message: string, public readonly code: string) { super(message); } } async function request(input: string, init?: RequestInit, token?: string): Promise { const response = await fetch(input, { ...init, headers: { "Content-Type": "application/json", ...(token ? { Authorization: `Bearer ${token}` } : {}), ...(init?.headers ?? {}), }, }); const json = (await response.json()) as ApiResponse; if (!json.ok) { throw new ApiError(json.error.message, json.error.code); } return json.data; } export const api = { login(payload: LoginRequest) { return request("/api/v1/auth/login", { method: "POST", body: JSON.stringify(payload), }); }, me(token: string) { return request("/api/v1/auth/me", undefined, token); }, getCompanyProfile(token: string) { return request("/api/v1/company-profile", undefined, token); }, updateCompanyProfile(token: string, payload: CompanyProfileInput) { return request( "/api/v1/company-profile", { method: "PUT", body: JSON.stringify(payload), }, token ); }, async uploadFile(token: string, file: File, ownerType: string, ownerId: string) { const formData = new FormData(); formData.append("file", file); formData.append("ownerType", ownerType); formData.append("ownerId", ownerId); const response = await fetch("/api/v1/files/upload", { method: "POST", headers: { Authorization: `Bearer ${token}`, }, body: formData, }); const json = (await response.json()) as ApiResponse; if (!json.ok) { throw new ApiError(json.error.message, json.error.code); } return json.data; }, getCustomers(token: string) { return request>>("/api/v1/crm/customers", undefined, token); }, getVendors(token: string) { return request>>("/api/v1/crm/vendors", undefined, token); }, getGanttDemo(token: string) { return request<{ tasks: GanttTaskDto[]; links: GanttLinkDto[] }>("/api/v1/gantt/demo", undefined, token); }, async getCompanyProfilePreviewPdf(token: string) { const response = await fetch("/api/v1/documents/company-profile-preview.pdf", { headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { throw new ApiError("Unable to render company profile preview PDF.", "PDF_PREVIEW_FAILED"); } return response.blob(); }, };