/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
frontend/src/services/baseQuery.ts
110 строк
3 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
import { BaseQueryFn, FetchArgs, fetchBaseQuery, FetchBaseQueryError, } from "@reduxjs/toolkit/query"; import { notification } from "antd"; import { JWT_AUTH } from "consts/index"; import { getAuthMode } from "./authMode"; import { getAccessToken, getRefreshToken, setAuthTokens, clearAuthTokens, } from "./authTokenService"; const baseQuery = fetchBaseQuery({ baseUrl: "/api", credentials: "include", prepareHeaders: async (headers) => { const token = await getAccessToken(); if (token) { headers.set("Authorization", `${JWT_AUTH.AuthorizationPattern}${token}`); } return headers; }, responseHandler: async (response) => { const contentType = response.headers.get("content-type"); if (contentType?.includes("application/json")) { return response.json(); } else if (contentType?.includes("application/problem+json")) { const data = await response.json(); return { status: response.status, data }; } return response.text(); }, }); export const baseQueryWithReauth: BaseQueryFn<FetchArgs, unknown, FetchBaseQueryError> = async ( args, api, extraOptions, ) => { let result = await baseQuery(args, api, extraOptions); if (result.error?.status === 401) { const mode = getAuthMode(); const supportsLocalTokens = mode === "Local" || mode === "Hybrid"; if (supportsLocalTokens) { try { const refreshToken = getRefreshToken(); if (!refreshToken) throw new Error("Refresh token не найден"); const refreshResult = await fetch("/api/Auth/refresh", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ refreshToken }), credentials: "include", }); if (!refreshResult.ok) throw new Error("Не удалось обновить токен"); const refreshData = await refreshResult.json(); setAuthTokens(refreshData); result = await baseQuery(args, api, extraOptions); } catch (e) { console.error("Ошибка при обновлении токена:", e); clearAuthTokens(); const currentPath = window.location.pathname; if (currentPath !== "/login") { window.location.href = "/login"; } } } else { clearAuthTokens(); if (window.location.pathname !== "/login") { window.location.href = "/login"; } } } if (result.error) { const error = result.error as FetchBaseQueryError & { data?: unknown }; const status = error.status; const data = error.data; let errorMessage = "Произошла ошибка при выполнении запроса."; if (typeof data === "string") { errorMessage = data; } else if (data?.message) { errorMessage = data.message; } else if (data?.errors) { const firstField = Object.keys(data.errors)[0]; errorMessage = data.errors[firstField][0]; } notification.error({ title: `Ошибка ${status}`, description: errorMessage, }); } return result; };