63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
"use client";
|
|
|
|
import { useMemo } from "react";
|
|
import { useAuth } from "@/context/AuthContext";
|
|
|
|
const API_BASE_URL =
|
|
process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080";
|
|
|
|
type JsonValue = any;
|
|
|
|
export function useApi() {
|
|
const { token } = useAuth();
|
|
|
|
return useMemo(() => {
|
|
function authHeaders(extra?: HeadersInit): HeadersInit {
|
|
const base: Record<string, string> = {};
|
|
if (token) base.Authorization = `Bearer ${token}`;
|
|
return { ...base, ...(extra as any) };
|
|
}
|
|
|
|
async function get(path: string, init?: RequestInit) {
|
|
return fetch(`${API_BASE_URL}${path}`, {
|
|
...init,
|
|
headers: authHeaders(init?.headers),
|
|
});
|
|
}
|
|
|
|
async function post(path: string, body: JsonValue, init?: RequestInit) {
|
|
return fetch(`${API_BASE_URL}${path}`, {
|
|
method: "POST",
|
|
...init,
|
|
headers: authHeaders({
|
|
"Content-Type": "application/json",
|
|
...(init?.headers as any),
|
|
}),
|
|
body: JSON.stringify(body),
|
|
});
|
|
}
|
|
|
|
async function put(path: string, body: JsonValue, init?: RequestInit) {
|
|
return fetch(`${API_BASE_URL}${path}`, {
|
|
method: "PUT",
|
|
...init,
|
|
headers: authHeaders({
|
|
"Content-Type": "application/json",
|
|
...(init?.headers as any),
|
|
}),
|
|
body: JSON.stringify(body),
|
|
});
|
|
}
|
|
|
|
async function del(path: string, init?: RequestInit) {
|
|
return fetch(`${API_BASE_URL}${path}`, {
|
|
method: "DELETE",
|
|
...init,
|
|
headers: authHeaders(init?.headers),
|
|
});
|
|
}
|
|
|
|
// ✅ stable reference unless token changes
|
|
return { get, post, put, del };
|
|
}, [token]);
|
|
} |