| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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) => ({}),
- });
|