40 lines
1.3 KiB
JavaScript
Executable File
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();
|
|
}
|