import { useAuthSlice } from "@/app/providers/authProvider/model/authSlice";
import createClient, { type Middleware } from "openapi-fetch";
import type { components, paths } from "./apiTypes";
export type ApiError = components["schemas"][
| "ParseErrorResponse"
| "ErrorResponse404"
| "ErrorResponse405"
| "ErrorResponse406"
| "ErrorResponse415"
| "ErrorResponse500"];
export const apiClient = createClient<paths>({
baseUrl: import.meta.env.PUBLIC_API_HOST,
});
const addressMiddleware: Middleware = {
async onRequest({ request }) {
const address = useAuthSlice.getState().address;
// Always include cookies (trusted-wallet cookie) on API requests.
const reqWithCreds = new Request(request, { credentials: "include" });
if (!address) return reqWithCreds;
const headers = new Headers(reqWithCreds.headers);
headers.set("X-User-Address", address);
return new Request(reqWithCreds, { headers });
},
};
const errorMiddleware: Middleware = {
async onResponse({ response }) {
if (!response.ok) {
try {
const errorData = (await response.json()) as ApiError;
throw errorData;
} catch {
throw {
type: "parse_error",
errors: [
{
code: "parse_error",
detail: `HTTP ${response.status}`,
attr: null,
},
],
} as unknown as ApiError;
}
}
},
};
apiClient.use(addressMiddleware);
apiClient.use(errorMiddleware);