mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-05 04:52:58 +00:00
fix(frontend): resolve production API URL fallback to localhost
Problem: The unified Docker image builds the frontend at build time without VITE_API_URL. Vite inlined import.meta.env.VITE_API_URL as undefined, so every API call fell back to the hardcoded 'http://localhost:8080'. This broke Casa deployments where the frontend loaded from the public domain but tried to reach the backend at localhost. Solution: 1. Centralize API URL resolution in lib/api-url.ts via getApiOrigin(). It checks runtime window.ENV first (injected by docker-entrypoint.sh at container startup), then build-time import.meta.env, then dev fallback. In production unified deployments it returns '' so API calls use same-origin relative URLs (/api/v1/...) that nginx proxies to the backend. 2. Replace all 50+ inline import.meta.env.VITE_API_URL || 'localhost' usages across 14 source files with getApiOrigin() / getApiV1BaseUrl(). 3. Add build args and runtime sed substitution to Dockerfile and docker-entrypoint.sh so the same image works for any deployment. 4. Pass VITE_API_URL through docker-compose.yml and CI/CD build-args. Verified: - Production bundle contains 0 occurrences of localhost:8080. - Container health check and /api/v1/auth/check-users both return 200. - Runtime injection correctly sets VITE_API_URL='' for same-origin and VITE_API_URL='https://domain' for external backend. Generated with [Devin](https://cli.devin.ai/docs) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { createSignal, createEffect, onMount, For, Show } from 'solid-js'
|
||||
import { getApiOrigin } from '@/lib/api-url'
|
||||
import { DateRangePicker } from '@/components/ui/DateRangePicker';
|
||||
import { ModalPortal } from '@/components/ui/ModalPortal';
|
||||
import {
|
||||
@@ -149,9 +150,9 @@ export function Calendar() {
|
||||
|
||||
// Fetch all calendar data in parallel
|
||||
const [upcomingRes, todayRes, deadlinesRes] = await Promise.all([
|
||||
fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:8080'}/api/v1/calendar/upcoming`, { headers }),
|
||||
fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:8080'}/api/v1/calendar/today`, { headers }),
|
||||
fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:8080'}/api/v1/calendar/deadlines`, { headers })
|
||||
fetch(`${getApiOrigin()}/api/v1/calendar/upcoming`, { headers }),
|
||||
fetch(`${getApiOrigin()}/api/v1/calendar/today`, { headers }),
|
||||
fetch(`${getApiOrigin()}/api/v1/calendar/deadlines`, { headers })
|
||||
])
|
||||
|
||||
if (upcomingRes.ok) {
|
||||
@@ -247,7 +248,7 @@ export function Calendar() {
|
||||
const token = localStorage.getItem('token')
|
||||
if (!token) return
|
||||
|
||||
const response = await fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:8080'}/api/v1/calendar`, {
|
||||
const response = await fetch(`${getApiOrigin()}/api/v1/calendar`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
@@ -304,7 +305,7 @@ export function Calendar() {
|
||||
const token = localStorage.getItem('token')
|
||||
if (!token) return
|
||||
|
||||
const response = await fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:8080'}/api/v1/calendar/${eventId}/toggle-complete`, {
|
||||
const response = await fetch(`${getApiOrigin()}/api/v1/calendar/${eventId}/toggle-complete`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
|
||||
Reference in New Issue
Block a user