Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

apiSlice.js 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
  2. import { logOut, setCredentials } from "../auth/authSlice";
  3. import jwt_decode from "jwt-decode";
  4. const baseQuery = fetchBaseQuery({
  5. baseUrl: "https://strapi.dilig.net/api",
  6. prepareHeaders: (headers, { getState }) => {
  7. const token = getState().auth.token;
  8. if (token) {
  9. headers.set("Authorization", `Bearer ${token.jwt}`);
  10. }
  11. headers.set("Content-Type", "application/json");
  12. return headers;
  13. },
  14. });
  15. const baseQueryWithReauth = async (args, api, extraOptions) => {
  16. let result = await baseQuery(args, api, extraOptions);
  17. if (result?.error?.status === 401) {
  18. const token = api.getState().auth.token;
  19. const jwtTokenDecoded = jwt_decode(token.jwt);
  20. if (new Date() > new Date(jwtTokenDecoded.exp * 1000)) {
  21. const refreshResult = await baseQuery(
  22. {
  23. url: "/token/refresh",
  24. method: "POST",
  25. body: { refreshToken: token.refreshToken },
  26. },
  27. api,
  28. extraOptions
  29. );
  30. if (refreshResult?.data) {
  31. const user = api.getState().auth.user;
  32. api.dispatch(setCredentials({ ...refreshResult.data, user }));
  33. result = await baseQuery(args, api, extraOptions);
  34. } else {
  35. api.dispatch(logOut());
  36. }
  37. }
  38. }
  39. return result;
  40. };
  41. export const apiSlice = createApi({
  42. baseQuery: baseQueryWithReauth,
  43. // eslint-disable-next-line no-unused-vars
  44. endpoints: (builder) => ({}),
  45. });