'use client' import axios, {type AxiosResponse} from "axios"; const baseUrl = "" const AxiosConfigs = { authenticated: { json: () => { return { headers: { 'content-type': 'application/json', Authorization: `Bearer ${localStorage.getItem('sub')}`, }, validateStatus: function (status: number) { return status < 500; // Resolve only if the status code is less than 500 } } } }, standard: { json: () => { return { headers: { 'content-type': 'application/json' }, validateStatus: function (status: number) { return status < 500; // Resolve only if the status code is less than 500 } } } } } /** * Makes an authenticated JSON POST request using axios. * @param {string} route - The route to send the request to. * @param {object} body - The request body. * @returns {Promise>} - The promise that resolves to the response from the server. */ async function doAuthenticatedJsonPostReq(route:string, body:object): Promise> { return await axios.post(baseUrl + route, body, AxiosConfigs.authenticated.json()) } /** * Makes an authenticated GET request to the specified route using Axios. * * @param {string} route - The route to which the GET request is sent. * @returns {Promise} - A promise that resolves to the Axios response object containing the request data and response details. */ async function doAuthenticatedGetReq(route:string): Promise> { return await axios.get(baseUrl + route, AxiosConfigs.authenticated.json()) } /** * Performs an authenticated PATCH request to the specified route with the given body. * * @param {string} route - The route to send the PATCH request to. * @param {object} body - The body of the request. * @returns {Promise>} - A Promise that resolves to the AxiosResponse object containing the response data. */ async function doAuthenticatedPatchReq(route:string, body: object): Promise> { return await axios.patch(baseUrl + route, body, AxiosConfigs.authenticated.json()) } /** * Sends an authenticated DELETE request to the specified route. * * @param {string} route - The route to send the request to. * * @return {Promise>} A Promise that resolves to the AxiosResponse object containing the response data. */ async function doAuthenticatedDelReq(route:string): Promise> { return await axios.delete(baseUrl + route, AxiosConfigs.authenticated.json()) } //TODO form/multipart req /** * Perform a JSON POST request. * * @param {string} route - The route to send the request to. * @param {object} body - The JSON object to send in the request body. * * @return {Promise>} - A promise that resolves with the response from the server. * * @throws {Error} - If an error occurs during the request. */ async function doJsonPostReq(route:string, body: object): Promise> { return await axios.post(baseUrl + route, body, AxiosConfigs.standard.json()) } /** * Perform a JSON GET request using Axios. * * @param {string} route - The route URL to make the GET request to. * @returns {Promise>} - A promise that resolves to the AxiosResponse object. */ async function doJsonGetReq(route:string): Promise> { return await axios.get(baseUrl + route, AxiosConfigs.standard.json()); } const ApiRequest = { authenticated: { post: {json: doAuthenticatedJsonPostReq}, patch: {json: doAuthenticatedPatchReq}, delete: {json: doAuthenticatedDelReq}, get: {json: doAuthenticatedGetReq} }, standard: { post: {json: doJsonPostReq}, get: {json: doJsonGetReq} } } export default ApiRequest;