api.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import type { AxiosResponse, RawAxiosRequestHeaders } from 'axios';
  2. import axios from 'axios';
  3. import LinkHeader from 'http-link-header';
  4. import ready from './ready';
  5. import type { GetState } from './store';
  6. export const getLinks = (response: AxiosResponse) => {
  7. const value = response.headers.link as string | undefined;
  8. if (!value) {
  9. return new LinkHeader();
  10. }
  11. return LinkHeader.parse(value);
  12. };
  13. const csrfHeader: RawAxiosRequestHeaders = {};
  14. const setCSRFHeader = () => {
  15. const csrfToken = document.querySelector<HTMLMetaElement>(
  16. 'meta[name=csrf-token]',
  17. );
  18. if (csrfToken) {
  19. csrfHeader['X-CSRF-Token'] = csrfToken.content;
  20. }
  21. };
  22. void ready(setCSRFHeader);
  23. const authorizationHeaderFromState = (getState?: GetState) => {
  24. const accessToken =
  25. getState && (getState().meta.get('access_token', '') as string);
  26. if (!accessToken) {
  27. return {};
  28. }
  29. return {
  30. Authorization: `Bearer ${accessToken}`,
  31. } as RawAxiosRequestHeaders;
  32. };
  33. // eslint-disable-next-line import/no-default-export
  34. export default function api(getState: GetState) {
  35. return axios.create({
  36. headers: {
  37. ...csrfHeader,
  38. ...authorizationHeaderFromState(getState),
  39. },
  40. transformResponse: [
  41. function (data: unknown) {
  42. try {
  43. return JSON.parse(data as string) as unknown;
  44. } catch {
  45. return data;
  46. }
  47. },
  48. ],
  49. });
  50. }