68 lines
2.4 KiB
JavaScript
68 lines
2.4 KiB
JavaScript
// Tiny fetch wrapper. Reads token + investisseurId from localStorage.
|
|
|
|
const BASE = import.meta.env.VITE_API_URL || '/api';
|
|
|
|
function authHeaders() {
|
|
const token = localStorage.getItem('cl_token');
|
|
const investisseurId = localStorage.getItem('cl_investisseur_id');
|
|
const deviceToken = localStorage.getItem('cl_device_token');
|
|
const h = {};
|
|
if (token) h['Authorization'] = `Bearer ${token}`;
|
|
if (investisseurId) h['X-Investisseur-Id'] = investisseurId;
|
|
if (deviceToken) h['X-Device-Token'] = deviceToken;
|
|
return h;
|
|
}
|
|
|
|
async function handle(res) {
|
|
if (res.status === 204) return null;
|
|
const text = await res.text();
|
|
let body;
|
|
try { body = text ? JSON.parse(text) : null; } catch { body = text; }
|
|
if (!res.ok) {
|
|
const msg = (body && body.error) || res.statusText || 'Request failed';
|
|
const err = new Error(msg);
|
|
err.status = res.status;
|
|
err.code = body && body.code;
|
|
err.details = body && body.details;
|
|
throw err;
|
|
}
|
|
return body;
|
|
}
|
|
|
|
export const api = {
|
|
get: (path, params) => {
|
|
const qs = params ? '?' + new URLSearchParams(
|
|
Object.entries(params).filter(([, v]) => v !== undefined && v !== null && v !== '')
|
|
).toString() : '';
|
|
return fetch(BASE + path + qs, { headers: authHeaders() }).then(handle);
|
|
},
|
|
post: (path, body) =>
|
|
fetch(BASE + path, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json', ...authHeaders() },
|
|
body: JSON.stringify(body),
|
|
}).then(handle),
|
|
put: (path, body) =>
|
|
fetch(BASE + path, {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json', ...authHeaders() },
|
|
body: JSON.stringify(body),
|
|
}).then(handle),
|
|
patch: (path, body) =>
|
|
fetch(BASE + path, {
|
|
method: 'PATCH',
|
|
headers: { 'Content-Type': 'application/json', ...authHeaders() },
|
|
body: JSON.stringify(body),
|
|
}).then(handle),
|
|
del: (path) =>
|
|
fetch(BASE + path, { method: 'DELETE', headers: authHeaders() }).then(handle),
|
|
upload: (path, formData) =>
|
|
fetch(BASE + path, { method: 'POST', body: formData, headers: authHeaders() }).then(handle),
|
|
blob: (path) =>
|
|
fetch(BASE + path, { headers: authHeaders() }).then(async res => {
|
|
if (!res.ok) { const t = await res.text(); throw new Error(t || res.statusText); }
|
|
return res.blob();
|
|
}),
|
|
exportUrl: (path, params) => {
|
|
const qs = params ? '?' + new URLSearchParams(params).toString() : '';
|
|
|