react-clone-trello
50 строк · 1.5 Кб
1import { API } from "./constants";
2import { IRefreshTokenResponse, TTokenError } from "../types/tokenTypes";
3import { cookies } from "../services/feature/user/auth";
4
5export const checkResponse = <T>(respose: Response): Promise<T> => {
6return respose.ok
7? respose.json()
8: respose.json().then((err) => Promise.reject(err));
9};
10
11export const request = <T>(url: string, options?: RequestInit): Promise<T> => {
12return fetch(url, options).then(checkResponse<T>);
13};
14
15export const refreshToken = (): Promise<IRefreshTokenResponse> => {
16return request(`${API.baseUrl}${API.endpoints.refreshToken}`, {
17method: "POST",
18headers: {
19"Content-Type": "application/json",
20},
21body: JSON.stringify({ token: cookies.get("refreshToken") }),
22});
23};
24
25export const fetchWithRefresh = async <T>(
26url: string,
27options: RequestInit
28): Promise<T> => {
29try {
30const res = await request<T>(url, options);
31return res;
32} catch (err: unknown) {
33if ((err as TTokenError).message === "jwt expired") {
34const refreshData = await refreshToken();
35if (!refreshData.success) {
36return Promise.reject(refreshData);
37}
38cookies.set("refreshToken", refreshData.refreshToken);
39cookies.set("accessToken", refreshData.accessToken.split("Bearer ")[1]);
40const headers: Record<string, string> = {
41"Content-type": "application/json",
42};
43headers.authorization = refreshData.accessToken;
44const res = await request<T>(url, options);
45return res;
46} else {
47return Promise.reject(err);
48}
49}
50};
51