Files
frontend/packages/common/network/client.ts
T
jcchoi d4d9eaf773
Deploy Frontend / deploy (push) Successful in 5m32s
CM 로그인
하단 메뉴 링크
2026-10-06 11:13:46 +09:00

98 lines
2.5 KiB
TypeScript

import axios from "axios";
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
import Cookies from "js-cookie";
import { AUTH_USER_ID, CLAIM_NAME } from "./env";
import { errorInterceptor } from "./error-interceptor";
interface ClientConfig {
baseURL: string;
siteId: string;
redirectOnUnauthorized?: boolean;
}
const DEVICE_ID_KEY = "x-device-id";
class Client {
private static instance: Client;
private axiosInstance: AxiosInstance;
private constructor(config: ClientConfig) {
this.axiosInstance = axios.create({
baseURL: config.baseURL,
headers: {
"Content-Type": "application/json",
"X-Site-Id": config.siteId,
},
withCredentials: true,
});
this.axiosInstance.interceptors.request.use((config) => {
const token = Cookies.get(CLAIM_NAME);
const userId = Cookies.get(AUTH_USER_ID);
const deviceId = Cookies.get(DEVICE_ID_KEY);
if (!token || !userId) {
return config;
}
config.headers[CLAIM_NAME] = token;
config.headers[AUTH_USER_ID] = userId;
config.headers["X-Device-Id"] = deviceId;
return config;
});
this.axiosInstance.interceptors.response.use(
(response) => response,
(error) =>
errorInterceptor(error, {
redirectOnUnauthorized: config.redirectOnUnauthorized,
}),
);
}
public static getInstance(config: ClientConfig): Client {
if (!Client.instance) {
Client.instance = new Client(config);
}
return Client.instance;
}
public async get<T = unknown, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig,
): Promise<R> {
const response = await this.axiosInstance.get<T, R>(url, config);
return response;
}
public async post<T = unknown, R = AxiosResponse<T>, D = unknown>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>,
): Promise<R> {
const response = await this.axiosInstance.post<T, R>(url, data, config);
return response;
}
public async put<T = unknown, R = AxiosResponse<T>, D = unknown>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>,
): Promise<R> {
const response = await this.axiosInstance.put<T, R>(url, data, config);
return response;
}
public async delete<T = unknown, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig,
): Promise<R> {
const response = await this.axiosInstance.delete<T, R>(url, config);
return response;
}
}
export type { ClientConfig };
export { Client };