Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| // API Configuration and Service | |
| const API_CONFIG = { | |
| // Use the current origin in production | |
| // In development, use localhost:3001 explicitly | |
| BASE_URL: | |
| process.env.NODE_ENV === "development" || | |
| window.location.hostname === "localhost" | |
| ? "http://localhost:3001" | |
| : window.location.origin, | |
| }; | |
| // API Service for making HTTP requests | |
| const apiService = { | |
| // Generic API call method with error handling | |
| async call(endpoint, options = {}) { | |
| try { | |
| const url = endpoint.startsWith("http") | |
| ? endpoint | |
| : `${API_CONFIG.BASE_URL}${endpoint}`; | |
| const response = await fetch(url, { | |
| ...options, | |
| headers: { | |
| "Content-Type": "application/json", | |
| ...options.headers, | |
| }, | |
| }); | |
| // If response is not ok, throw an error | |
| if (!response.ok) { | |
| const errorData = await response.json().catch(() => ({})); | |
| throw new Error(errorData.detail || `API error: ${response.status}`); | |
| } | |
| // Check if response is JSON or text | |
| const contentType = response.headers.get("content-type"); | |
| if (contentType && contentType.includes("application/json")) { | |
| return await response.json(); | |
| } | |
| return await response.text(); | |
| } catch (error) { | |
| console.error("API call failed:", error); | |
| throw error; | |
| } | |
| }, | |
| // GET request | |
| async get(endpoint, options = {}) { | |
| return await this.call(endpoint, { | |
| method: "GET", | |
| ...options, | |
| }); | |
| }, | |
| // POST request with JSON data | |
| async post(endpoint, data, options = {}) { | |
| return await this.call(endpoint, { | |
| method: "POST", | |
| body: JSON.stringify(data), | |
| ...options, | |
| }); | |
| }, | |
| // POST request with FormData | |
| async postFormData(endpoint, formData, options = {}) { | |
| try { | |
| const url = endpoint.startsWith("http") | |
| ? endpoint | |
| : `${API_CONFIG.BASE_URL}${endpoint}`; | |
| const response = await fetch(url, { | |
| method: "POST", | |
| body: formData, | |
| ...options, | |
| headers: { | |
| // Ne pas définir Content-Type pour FormData | |
| ...(options.headers || {}), | |
| }, | |
| }); | |
| // Si response is not ok, throw an error | |
| if (!response.ok) { | |
| const errorData = await response.json().catch(() => ({})); | |
| throw new Error(errorData.detail || `API error: ${response.status}`); | |
| } | |
| // Check if response is JSON or text | |
| const contentType = response.headers.get("content-type"); | |
| if (contentType && contentType.includes("application/json")) { | |
| return await response.json(); | |
| } | |
| return await response.text(); | |
| } catch (error) { | |
| console.error("API FormData call failed:", error); | |
| throw error; | |
| } | |
| }, | |
| // PUT request | |
| async put(endpoint, data, options = {}) { | |
| return await this.call(endpoint, { | |
| method: "PUT", | |
| body: JSON.stringify(data), | |
| ...options, | |
| }); | |
| }, | |
| // DELETE request | |
| async delete(endpoint, options = {}) { | |
| return await this.call(endpoint, { | |
| method: "DELETE", | |
| ...options, | |
| }); | |
| }, | |
| // Upload a file | |
| async uploadFile(file) { | |
| const formData = new FormData(); | |
| formData.append("file", file); | |
| // Utilisation directe de fetch pour éviter les problèmes avec les en-têtes de FormData | |
| try { | |
| const response = await fetch(`${API_CONFIG.BASE_URL}/upload`, { | |
| method: "POST", | |
| body: formData, | |
| // Ne pas définir le Content-Type pour FormData | |
| }); | |
| // Si response is not ok, throw an error | |
| if (!response.ok) { | |
| const errorData = await response.json().catch(() => ({})); | |
| throw new Error(errorData.detail || `API error: ${response.status}`); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error("Upload file failed:", error); | |
| throw error; | |
| } | |
| }, | |
| // Upload content from a URL | |
| async uploadUrl(url) { | |
| const formData = new FormData(); | |
| formData.append("url", url); | |
| // Utilisation directe de fetch pour éviter les problèmes avec les en-têtes de FormData | |
| try { | |
| const response = await fetch(`${API_CONFIG.BASE_URL}/upload-url`, { | |
| method: "POST", | |
| body: formData, | |
| // Ne pas définir le Content-Type pour FormData | |
| }); | |
| // Si response is not ok, throw an error | |
| if (!response.ok) { | |
| const errorData = await response.json().catch(() => ({})); | |
| throw new Error(errorData.detail || `API error: ${response.status}`); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error("Upload URL failed:", error); | |
| throw error; | |
| } | |
| }, | |
| // Get static document content | |
| async getDocumentContent(docId, extension) { | |
| return await this.get(`/${docId}.${extension}`); | |
| }, | |
| // Download document | |
| downloadDocument(docId, extension, documentName) { | |
| try { | |
| const link = document.createElement("a"); | |
| link.href = `/${docId}.${extension}`; | |
| link.setAttribute("download", `${documentName}.${extension}`); | |
| document.body.appendChild(link); | |
| link.click(); | |
| document.body.removeChild(link); | |
| return true; | |
| } catch (error) { | |
| console.error("Download document failed:", error); | |
| throw error; | |
| } | |
| }, | |
| }; | |
| export { API_CONFIG, apiService }; | |
| export default API_CONFIG; | |