From a87d1ec865e4fe2ae56da10dc83bb43ae071d149 Mon Sep 17 00:00:00 2001 From: Gulum Date: Tue, 23 Jun 2026 09:18:55 +0200 Subject: [PATCH] fix(api): API-Host im Dev-Modus aus window.location ableiten (LAN/Handy-Zugriff) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Statt fest http://localhost:5179 (auf dem Handy = das Handy selbst) nutzt der Client im Dev-Modus den Host, von dem die Seite geladen wurde → 192.168.x.y:5179. e2e/Rechner bleiben bei localhost. Co-Authored-By: Claude Opus 4.8 --- gerbil-manager-web/src/api/client.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gerbil-manager-web/src/api/client.ts b/gerbil-manager-web/src/api/client.ts index dbddb10..4262406 100644 --- a/gerbil-manager-web/src/api/client.ts +++ b/gerbil-manager-web/src/api/client.ts @@ -3,11 +3,18 @@ import { de } from '../strings/de' /** * Basis-URL der GerbilManagerWebAPI. * Dev (Vite dev server / e2e mock): absolute URL, damit Playwright-Route-Interception greift. + * Der Host wird aus der AKTUELLEN Adresse abgeleitet (window.location.hostname), damit der + * Zugriff vom Handy/anderen LAN-Gerät funktioniert: lädt die Seite von 192.168.x.y:5173, + * geht die API an 192.168.x.y:5179 (nicht „localhost", was auf dem Handy das Handy selbst wäre). + * Auf dem Rechner/in e2e ist der Host „localhost" → unverändert http://localhost:5179. * Produktion (Vite build → nginx): relativer Pfad /api; nginx proxyt zum API-Container. - * Aspire (VITE_API_BASE_URL gesetzt): überschreibt immer (LAN-IP + Port für Handy-Zugriff). + * Aspire (VITE_API_BASE_URL gesetzt): überschreibt immer. */ +const devApiBase = `http://${ + typeof window !== 'undefined' && window.location.hostname ? window.location.hostname : 'localhost' +}:5179` export const API_BASE_URL: string = - import.meta.env.VITE_API_BASE_URL ?? (import.meta.env.PROD ? '/api' : 'http://localhost:5179') + import.meta.env.VITE_API_BASE_URL ?? (import.meta.env.PROD ? '/api' : devApiBase) export class ApiError extends Error { readonly status: number | null