api.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // @ts-check
  2. import axios from 'axios';
  3. import LinkHeader from 'http-link-header';
  4. import ready from './ready';
  5. /**
  6. * @param {import('axios').AxiosResponse} response
  7. * @returns {LinkHeader}
  8. */
  9. export const getLinks = response => {
  10. const value = response.headers.link;
  11. if (!value) {
  12. return new LinkHeader();
  13. }
  14. return LinkHeader.parse(value);
  15. };
  16. /** @type {import('axios').RawAxiosRequestHeaders} */
  17. const csrfHeader = {};
  18. /**
  19. * @returns {void}
  20. */
  21. const setCSRFHeader = () => {
  22. /** @type {HTMLMetaElement | null} */
  23. const csrfToken = document.querySelector('meta[name=csrf-token]');
  24. if (csrfToken) {
  25. csrfHeader['X-CSRF-Token'] = csrfToken.content;
  26. }
  27. };
  28. ready(setCSRFHeader);
  29. /**
  30. * @param {() => import('immutable').Map} getState
  31. * @returns {import('axios').RawAxiosRequestHeaders}
  32. */
  33. const authorizationHeaderFromState = getState => {
  34. const accessToken = getState && getState().getIn(['meta', 'access_token'], '');
  35. if (!accessToken) {
  36. return {};
  37. }
  38. return {
  39. 'Authorization': `Bearer ${accessToken}`,
  40. };
  41. };
  42. /**
  43. * @param {() => import('immutable').Map} getState
  44. * @returns {import('axios').AxiosInstance}
  45. */
  46. export default function api(getState) {
  47. return axios.create({
  48. headers: {
  49. ...csrfHeader,
  50. ...authorizationHeaderFromState(getState),
  51. },
  52. transformResponse: [
  53. function (data) {
  54. try {
  55. return JSON.parse(data);
  56. } catch {
  57. return data;
  58. }
  59. },
  60. ],
  61. });
  62. }