react-clone-trello

Форк
0
50 строк · 1.5 Кб
1
import { API } from "./constants";
2
import { IRefreshTokenResponse, TTokenError } from "../types/tokenTypes";
3
import { cookies } from "../services/feature/user/auth";
4

5
export const checkResponse = <T>(respose: Response): Promise<T> => {
6
  return respose.ok
7
    ? respose.json()
8
    : respose.json().then((err) => Promise.reject(err));
9
};
10

11
export const request = <T>(url: string, options?: RequestInit): Promise<T> => {
12
  return fetch(url, options).then(checkResponse<T>);
13
};
14

15
export const refreshToken = (): Promise<IRefreshTokenResponse> => {
16
  return request(`${API.baseUrl}${API.endpoints.refreshToken}`, {
17
    method: "POST",
18
    headers: {
19
      "Content-Type": "application/json",
20
    },
21
    body: JSON.stringify({ token: cookies.get("refreshToken") }),
22
  });
23
};
24

25
export const fetchWithRefresh = async <T>(
26
  url: string,
27
  options: RequestInit
28
): Promise<T> => {
29
  try {
30
    const res = await request<T>(url, options);
31
    return res;
32
  } catch (err: unknown) {
33
    if ((err as TTokenError).message === "jwt expired") {
34
      const refreshData = await refreshToken();
35
      if (!refreshData.success) {
36
        return Promise.reject(refreshData);
37
      }
38
      cookies.set("refreshToken", refreshData.refreshToken);
39
      cookies.set("accessToken", refreshData.accessToken.split("Bearer ")[1]);
40
      const headers: Record<string, string> = {
41
        "Content-type": "application/json",
42
      };
43
      headers.authorization = refreshData.accessToken;
44
      const res = await request<T>(url, options);
45
      return res;
46
    } else {
47
      return Promise.reject(err);
48
    }
49
  }
50
};
51

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.