import { type AxiosResponse, type RawAxiosRequestHeaders } from "axios"; import axios from "axios"; import LinkHeader from "http-link-header"; import ready from "./ready"; import { type GetState } from "./store"; export const getLinks = (response: AxiosResponse) => { const value = response.headers.link as string | undefined; if (!value) { return new LinkHeader(); } return LinkHeader.parse(value); }; const csrfHeader: RawAxiosRequestHeaders = {}; const setCSRFHeader = () => { const csrfToken = document.querySelector( "meta[name=csrf-token]", ); if (csrfToken) { csrfHeader["X-CSRF-Token"] = csrfToken.content; } }; void ready(setCSRFHeader); const authorizationHeaderFromState = (getState?: GetState) => { const accessToken = getState && (getState().meta.get("access_token", "") as string); if (!accessToken) { return {}; } return { Authorization: `Bearer ${accessToken}`, } as RawAxiosRequestHeaders; }; export default function api(getState: GetState) { return axios.create({ headers: { ...csrfHeader, ...authorizationHeaderFromState(getState), }, transformResponse: [ function (data: unknown) { try { return JSON.parse(data as string) as unknown; } catch { return data; } }, ], }); }