From 07ec747c8f9afb0b81fbdb2ad202a72868cc369f Mon Sep 17 00:00:00 2001 From: Robby Manihani Date: Fri, 13 Mar 2026 13:51:56 -0700 Subject: [PATCH] fix: frontend now uses settings API URL for all backend requests (#49) getBase() reads settings.apiUrl from localStorage so the API URL configured in the Settings page is actually used by api.ts and sse.ts. Previously hardcoded to localhost:8000, causing "Failed to get response" when the backend ran on a different port. Co-authored-by: robbym-dev --- frontend/src/lib/api.ts | 15 ++++++++++++++- frontend/src/lib/sse.ts | 6 ++---- frontend/src/pages/SettingsPage.tsx | 2 +- frontend/vite.config.ts | 4 ++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 206ec4f6..2b94edad 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -17,7 +17,20 @@ export const isTauri = () => typeof window !== 'undefined' && !!window.__TAURI_I const DESKTOP_API = 'http://127.0.0.1:8000'; -const getBase = () => { +const getSettingsApiUrl = (): string => { + try { + const raw = localStorage.getItem('openjarvis-settings'); + if (raw) { + const parsed = JSON.parse(raw); + if (parsed.apiUrl) return parsed.apiUrl.replace(/\/+$/, ''); + } + } catch {} + return ''; +}; + +export const getBase = (): string => { + const settingsUrl = getSettingsApiUrl(); + if (settingsUrl) return settingsUrl; if (import.meta.env.VITE_API_URL) return import.meta.env.VITE_API_URL; if (isTauri()) return DESKTOP_API; return ''; diff --git a/frontend/src/lib/sse.ts b/frontend/src/lib/sse.ts index b1cf624b..addd10b9 100644 --- a/frontend/src/lib/sse.ts +++ b/frontend/src/lib/sse.ts @@ -1,5 +1,5 @@ import type { SSEEvent } from '../types'; -import { isTauri } from './api'; +import { getBase } from './api'; export interface ChatRequest { model: string; @@ -7,13 +7,11 @@ export interface ChatRequest { stream: true; } -const DESKTOP_API = 'http://127.0.0.1:8000'; - export async function* streamChat( request: ChatRequest, signal?: AbortSignal, ): AsyncGenerator { - const base = import.meta.env.VITE_API_URL || (isTauri() ? DESKTOP_API : ''); + const base = getBase(); const response = await fetch(`${base}/v1/chat/completions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, diff --git a/frontend/src/pages/SettingsPage.tsx b/frontend/src/pages/SettingsPage.tsx index 91b8566b..2dbe4c37 100644 --- a/frontend/src/pages/SettingsPage.tsx +++ b/frontend/src/pages/SettingsPage.tsx @@ -188,7 +188,7 @@ export function SettingsPage() { - +