import { API_HOST } from '@/lib/constant'; import { getOrCreateDeviceId } from '@/lib/device'; import { getSid } from '@/lib/auth'; // Fetch request wrapper export async function request(url: string, options: RequestInit = {}): Promise { // Get or generate Device ID (already encrypted 40-char format) let deviceId = ''; let sid: string | null = null; if (typeof window !== 'undefined') { deviceId = await getOrCreateDeviceId(); sid = getSid(); } const config: RequestInit = { ...options, headers: { 'Content-Type': 'application/json', 'os-type': '3', ...(deviceId && { 'Device-Id': deviceId }), ...(sid && { 'Authorization': `Bearer ${sid}` }), ...options.headers, }, }; const response = await fetch(`${API_HOST}${url}`, config); let data: T; const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { data = await response.json(); } else { const text = await response.text(); data = { message: text || response.statusText } as T; } if (!response.ok) { console.error('API Error:', { status: response.status, url, data, }); throw new Error( (data as { errMsg?: string; message?: string })?.errMsg || (data as { message?: string })?.message || `Request failed with status ${response.status}` ); } return data; } // GET request export function get(url: string, params?: Record) { const filteredParams = params ? Object.fromEntries( Object.entries(params).filter(([, v]) => v !== undefined && v !== null) ) : undefined; const queryString = filteredParams && Object.keys(filteredParams).length > 0 ? `?${new URLSearchParams(filteredParams as Record).toString()}` : ''; return request(url + queryString, { method: 'GET' }); } // POST request export function post(url: string, data?: unknown) { return request(url, { method: 'POST', body: JSON.stringify(data), }); }