import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; import { logOut, setCredentials } from "../auth/authSlice"; import jwt_decode from "jwt-decode"; const baseQuery = fetchBaseQuery({ baseUrl: "https://strapi.dilig.net/api", prepareHeaders: (headers, { getState }) => { const token = getState().auth.token; if (token) { headers.set("Authorization", `Bearer ${token.jwt}`); } headers.set("Content-Type", "application/json"); return headers; }, }); const baseQueryWithReauth = async (args, api, extraOptions) => { let result = await baseQuery(args, api, extraOptions); if (result?.error?.status === 401) { const token = api.getState().auth.token; const jwtTokenDecoded = jwt_decode(token.jwt); if (new Date() > new Date(jwtTokenDecoded.exp * 1000)) { const refreshResult = await baseQuery( { url: "/token/refresh", method: "POST", body: { refreshToken: token.refreshToken }, }, api, extraOptions ); if (refreshResult?.data) { const user = api.getState().auth.user; api.dispatch(setCredentials({ ...refreshResult.data, user })); result = await baseQuery(args, api, extraOptions); } else { api.dispatch(logOut()); } } } return result; }; export const apiSlice = createApi({ baseQuery: baseQueryWithReauth, // eslint-disable-next-line no-unused-vars endpoints: (builder) => ({}), });