ignore folder

This commit is contained in:
2026-04-21 06:30:48 +07:00
commit ca00b36f19
70 changed files with 3871 additions and 0 deletions

59
services/api.ts Normal file
View File

@ -0,0 +1,59 @@
import axios from "axios";
import { useAuthStore } from "@/store/authStore";
import { useTenantStore } from "@/store/tenantStore";
import { useLocaleStore } from "@/store/uiStore";
import { useApiStore } from "@/store/uiStore";
export const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_BASE_URL || "http://localhost:9191",
timeout: 25000
});
apiClient.interceptors.request.use((config) => {
const auth = useAuthStore.getState();
const tenantId = useTenantStore.getState().tenantId || auth.tenantId;
const locale = useLocaleStore.getState().locale;
if (auth.accessToken) {
config.headers.Authorization = `${auth.tokenType ?? "Bearer"} ${auth.accessToken}`;
}
if (tenantId) {
config.headers["X-Tenant-Id"] = tenantId;
}
if (locale) {
config.headers["Accept-Language"] = locale === "id" ? "id-ID" : "en-US";
}
return config;
});
apiClient.interceptors.response.use(
(response) => response,
(error) => {
const status = error?.response?.status;
const message = error?.response?.data?.message || error.message;
const ui = useApiStore.getState();
if (status === 401) {
ui.addToast(message || "Unauthorized", "error");
useAuthStore.getState().clearAuth();
if (typeof window !== "undefined") {
window.location.href = "/(auth)/login";
}
}
if (status === 403) {
ui.addToast(message || "Forbidden", "error");
}
return Promise.reject(new Error(message ?? "Request failed"));
}
);
export async function unwrap<T>(promise: ReturnType<typeof apiClient.request>): Promise<T> {
const response = await promise;
const payload = response.data;
if (payload && typeof payload.success === "boolean" && payload.success === false) {
throw new Error(payload.message ?? "Business error");
}
return payload.data as T;
}