// @ts-check import axios from "axios"; import LinkHeader from "http-link-header"; import ready from "./ready"; /** * @param {import('axios').AxiosResponse} response * @returns {LinkHeader} */ export const getLinks = response => { const value = response.headers.link; if (!value) { return new LinkHeader(); } return LinkHeader.parse(value); }; /** @type {import('axios').RawAxiosRequestHeaders} */ const csrfHeader = {}; /** * @returns {void} */ const setCSRFHeader = () => { /** @type {HTMLMetaElement | null} */ const csrfToken = document.querySelector("meta[name=csrf-token]"); if (csrfToken) { csrfHeader["X-CSRF-Token"] = csrfToken.content; } }; ready(setCSRFHeader); /** * @param {() => import('immutable').Map} getState * @returns {import('axios').RawAxiosRequestHeaders} */ const authorizationHeaderFromState = getState => { const accessToken = getState && getState().getIn(["meta", "access_token"], ""); if (!accessToken) { return {}; } return { "Authorization": `Bearer ${accessToken}`, }; }; /** * @param {() => import('immutable').Map} getState * @returns {string} */ const baseUrlFromState = getState => { const baseUrl = getState && getState().getIn(["meta", "base_url"], ""); return `${baseUrl}`; }; /** * @param {() => import('immutable').Map} getState * @returns {import('axios').AxiosInstance} */ export default function api(getState) { return axios.create({ headers: { ...csrfHeader, ...authorizationHeaderFromState(getState), }, baseURL: baseUrlFromState(getState), transformResponse: [ function (data) { try { return JSON.parse(data); } catch { return data; } }, ], }); }