76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @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 {import('axios').AxiosInstance}
 | |
|  */
 | |
| export default function api(getState) {
 | |
|   return axios.create({
 | |
|     headers: {
 | |
|       ...csrfHeader,
 | |
|       ...authorizationHeaderFromState(getState),
 | |
|     },
 | |
| 
 | |
|     transformResponse: [
 | |
|       function (data) {
 | |
|         try {
 | |
|           return JSON.parse(data);
 | |
|         } catch {
 | |
|           return data;
 | |
|         }
 | |
|       },
 | |
|     ],
 | |
|   });
 | |
| }
 |