| const isLocalhost = typeof window !== "undefined" && ["127.0.0.1", "localhost"].includes(window.location.hostname) |
| const defaultApiBaseUrl = typeof window !== "undefined" |
| ? (isLocalhost ? "http://127.0.0.1:8000" : window.location.origin) |
| : "http://127.0.0.1:8000" |
|
|
| const API_BASE_URL = (import.meta.env.VITE_API_BASE_URL || defaultApiBaseUrl).replace(/\/$/, "") |
| const WS_BASE_URL = ( |
| import.meta.env.VITE_WS_BASE_URL || |
| API_BASE_URL.replace(/^http/, "ws") |
| ).replace(/\/$/, "") |
|
|
| async function request(path, options = {}) { |
| const response = await fetch(`${API_BASE_URL}${path}`, { |
| headers: { |
| "Content-Type": "application/json", |
| ...(options.headers || {}), |
| }, |
| ...options, |
| }) |
|
|
| if (!response.ok) { |
| let detail = "Request failed" |
|
|
| try { |
| const payload = await response.json() |
| detail = payload.detail || detail |
| } catch { |
| detail = response.statusText || detail |
| } |
|
|
| throw new Error(detail) |
| } |
|
|
| return response.json() |
| } |
|
|
| export function getWebSocketUrl(path = "/ws") { |
| return `${WS_BASE_URL}${path}` |
| } |
|
|
| export function fetchReports(limit = 50) { |
| return request(`/reports?limit=${limit}`) |
| } |
|
|
| export function fetchLatestReport() { |
| return request("/reports/latest") |
| } |
|
|
| export function fetchAnalyticsSummary(limit = 120) { |
| return request(`/analytics/summary?limit=${limit}`) |
| } |
|
|
| export function inspectImage(payload) { |
| return request("/inspect/image", { |
| method: "POST", |
| body: JSON.stringify(payload), |
| }) |
| } |
|
|
| export function inspectFrame(payload) { |
| return request("/inspect/frame", { |
| method: "POST", |
| body: JSON.stringify(payload), |
| }) |
| } |
|
|