Files
microdao-daarion/src/api/client.ts

84 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// API Client для MicroDAO
const API_BASE_URL = import.meta.env.VITE_API_URL || 'https://api.microdao.xyz';
export class ApiError extends Error {
constructor(
message: string,
public status: number,
public data?: unknown
) {
super(message);
this.name = 'ApiError';
}
}
async function getAuthToken(): Promise<string | null> {
// Перевіряємо localStorage або httpOnly cookie
return localStorage.getItem('auth_token');
}
async function fetchApi(
endpoint: string,
options: RequestInit = {}
): Promise<Response> {
const token = await getAuthToken();
const headers: HeadersInit = {
'Content-Type': 'application/json',
...options.headers,
};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
const url = endpoint.startsWith('http') ? endpoint : `${API_BASE_URL}${endpoint}`;
const response = await fetch(url, {
...options,
headers,
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
throw new ApiError(
errorData.message || `HTTP ${response.status}: ${response.statusText}`,
response.status,
errorData
);
}
return response;
}
export async function apiGet<T>(endpoint: string): Promise<T> {
const response = await fetchApi(endpoint, { method: 'GET' });
return response.json();
}
export async function apiPost<T>(endpoint: string, data?: unknown): Promise<T> {
const response = await fetchApi(endpoint, {
method: 'POST',
body: data ? JSON.stringify(data) : undefined,
});
return response.json();
}
export async function apiPatch<T>(endpoint: string, data: unknown): Promise<T> {
const response = await fetchApi(endpoint, {
method: 'PATCH',
body: JSON.stringify(data),
});
return response.json();
}
export async function apiDelete<T>(endpoint: string): Promise<T> {
const response = await fetchApi(endpoint, { method: 'DELETE' });
if (response.status === 204) {
return {} as T;
}
return response.json();
}