fix(frontend): resolve API base URL at request time for production

Use same-origin /api in the browser so builds are not stuck with baked-in
localhost. Server-side fetches use INTERNAL_API_URL, NEXT_PUBLIC_API_URL, or
loopback. Centralize logic in lib/api-base.ts.

Made-with: Cursor
This commit is contained in:
Michilis
2026-04-01 19:52:54 +00:00
parent 76210db03d
commit 8cdf0231ce
7 changed files with 25 additions and 17 deletions

View File

@@ -1,4 +1,4 @@
const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:4000/api";
import { apiUrl } from "./api-base";
async function request<T>(path: string, options?: RequestInit): Promise<T> {
const token = typeof window !== "undefined" ? localStorage.getItem("bbe_token") : null;
@@ -8,7 +8,7 @@ async function request<T>(path: string, options?: RequestInit): Promise<T> {
...options?.headers,
};
const res = await fetch(`${API_URL}${path}`, { ...options, headers });
const res = await fetch(apiUrl(path), { ...options, headers });
if (!res.ok) {
const error = await res.json().catch(() => ({ message: "Request failed" }));
throw new Error(error.message || `HTTP ${res.status}`);
@@ -128,7 +128,7 @@ export const api = {
const token = typeof window !== "undefined" ? localStorage.getItem("bbe_token") : null;
const formData = new FormData();
formData.append("file", file);
const res = await fetch(`${API_URL}/media/upload`, {
const res = await fetch(apiUrl("/media/upload"), {
method: "POST",
headers: token ? { Authorization: `Bearer ${token}` } : {},
body: formData,