Files
lcbp3.np-dms.work/frontend/lib/api.js

40 lines
1.3 KiB
JavaScript
Executable File

// ใช้ NEXT_PUBLIC_API_BASE จาก docker-compose (ไม่ใช้ .env file)
export const API_BASE = process.env.NEXT_PUBLIC_API_BASE || "http://localhost:3001";
// NEW: querystring helper (รองรับ array)
export function qstr(params = {}) {
const sp = new URLSearchParams();
Object.entries(params).forEach(([k, v]) => {
if (v === undefined || v === null || v === "") return;
if (Array.isArray(v)) v.forEach((x) => sp.append(k, String(x)));
else sp.set(k, String(v));
});
const s = sp.toString();
return s ? `?${s}` : "";
}
// NEW: GET helper
export function apiGet(path, params = {}, opts = {}) {
return api(`${path}${qstr(params)}`, { ...opts, method: "GET" });
}
export async function api(path, { method = "GET", body, headers = {}, cache = "no-store" } = {}) {
const res = await fetch(`${API_BASE}${path}`, {
method,
headers: {
"Content-Type": "application/json",
...headers,
},
body: body ? JSON.stringify(body) : undefined,
credentials: "include",
cache,
next: { revalidate: 0 },
});
if (!res.ok) {
const text = await res.text().catch(()=>"");
throw new Error(`API ${method} ${path} ${res.status} ${text}`);
}
const ct = res.headers.get("content-type") || "";
return ct.includes("application/json") ? res.json() : res.text();
}