app/apiHandler/axios.js

/**
 * @file
 * File : axios.js\
 * Defines the default Axios instance used for API requests.
 * Configures base URL and request interceptors.
 *
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @name axios
 */
import axios from 'axios'

import frontend from '../config/frontend'
import backend from '../config/backend'
import store from '../store'

/**
 * Creates and configures an Axios instance.
 * Determines the base URL based on the environment mode and sets up interceptors.
 *
 * @function
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @param {Object} env - The environment object.
 * @example
 * const axiosInstance = axios(env) // env is imported from the store
 * @returns {AxiosInstance} Configured Axios instance.
 */
let env = import.meta.env
let frontendMode = frontend(env).mode
let backendData = backend(env)
let baseUrl = backendData.baseUrlProd
if (frontendMode === 'developpement') {
  baseUrl = backendData.baseUrlDev
}

const axiosInstance = axios.create({
  baseURL: baseUrl,
  headers: {
    'Content-Type': 'application/json',
    // 'Cache-Control': 'no-cache',
    // Pragma: 'no-cache',
    // Expires: '0',
    // 'Content-Security-Policy':
    //   "script-src 'sha256-{HASHED_INLINE_SCRIPT}' 'strict-dynamic'; object-src 'none';base-uri 'none';",
  },
})

/**
 * Request interceptor for adding authorization token to requests.
 * Retrieves the access token from Redux store and adds it to the request headers.
 *
 * @function
 * @author  Pierre-Yves Léglise <contact@axialdata.net>
 * @param {Object} config - Axios request configuration.
 * @example
 * axiosInstance.interceptors.request.use(config => {
 *   return config
 * })
 * @returns {Object} Modified Axios request configuration.
 * @throws {Error} Throws error if request configuration fails.
 */
axiosInstance.interceptors.request.use((config) => {
  const state = store.getState()
  let token = state.auth.accessToken

  if (token) {
    config.headers.Authorization = 'Bearer ' + token
  }

  return config
}),
  (error) => {
    return Promise.reject(error)
  }

export default axiosInstance