import GetApiHost from "./GetApiHost"; import { environmentVariables } from "~/store"; import { useSignals } from "@preact/signals-react/runtime"; // const { formatUrl } = GetApiHost(); type UrlRoutingFunction = (urlRouteArgs: UrlRouteArgs) => string; interface RequestHeaders { [name: string]: string; } interface RouteSetup { method: string; multipart?: boolean; routingFunction: UrlRoutingFunction; } const METHOD_OMITS_BODY: { [key: string]: boolean } = { DELETE: false, GET: true, OPTIONS: true, PATCH: false, POST: false, PUT: false, }; const MakeRequest = ( routeSetup: RouteSetup, ): (( urlRouteArgs: UrlRouteArgs, request: Request, queries?: UrlParams, ) => Promise) => { return async function ( urlRouteArgs: UrlRouteArgs, request: Request, queries?: any, ): Promise { const newQueries = queries ? Object.keys(queries) .map((key, i) => { return `${i ? "&" : ""}${key}=${Array.isArray(queries[key]) ? queries[key].join(`&${key}=`) : queries[key]}`; }) .join("") : null; const endpoint = `${routeSetup.routingFunction(urlRouteArgs)}${newQueries ? "?" + newQueries : ""}`; const method = routeSetup.method; const methodOmitsBody = METHOD_OMITS_BODY[method] || false; // return fetch(formatUrl(endpoint), { return fetch(`${environmentVariables.value.BASE_API}${endpoint}`, { method, headers: { Accept: "application/json", ...(methodOmitsBody ? {} : { "Content-Type": "application/json" }), }, credentials: "include", ...(methodOmitsBody ? {} : { body: JSON.stringify(request) }), }) .then((res) => res.json()) .then((res) => { if (!res.success && res && (res.voice_token || res.dataset_token)) { return res; } else if (res && "success" in res) { return res; } else Promise.reject(); }) .catch((e) => ({ success: false })); }; }; export default MakeRequest;