diff --git a/apps/admin/.env.example b/apps/admin/.env.example index b676155a4..bd8647fa7 100644 --- a/apps/admin/.env.example +++ b/apps/admin/.env.example @@ -1,6 +1,7 @@ -# API 서버 URL (필수) -# 빌드/프리뷰 시 이 값이 없으면 API 호출은 실패하지만 SSR shell은 500 없이 응답해야 합니다. -VITE_API_SERVER_URL=https://api.example.com +# API 서버 URL (로컬 개발 전용 override, 선택) +# 설정 시 로그인 계정의 이메일 패턴과 무관하게 이 값이 항상 사용됩니다. +# 비워두면 로그인한 계정의 이메일 도메인에 따라 dev/prod API가 런타임에 자동 선택됩니다. +# VITE_API_SERVER_URL=http://localhost:8080 # 업로드 CDN URL (선택) VITE_UPLOADED_IMAGE_URL=https://cdn.upload.solid-connection.com diff --git a/apps/admin/src/components/features/bruno/BrunoApiPageContent.tsx b/apps/admin/src/components/features/bruno/BrunoApiPageContent.tsx index 77c1b54e7..32b239497 100644 --- a/apps/admin/src/components/features/bruno/BrunoApiPageContent.tsx +++ b/apps/admin/src/components/features/bruno/BrunoApiPageContent.tsx @@ -15,6 +15,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { axiosInstance } from "@/lib/api/client"; +import { resolveActiveApiBaseUrl } from "@/lib/env"; import { cn } from "@/lib/utils"; type EndpointItem = BrunoApiDefinitionRegistryItem; @@ -46,7 +47,6 @@ const ALL_ENDPOINTS: EndpointItem[] = [...brunoApiDefinitionRegistry].sort((a, b const METHOD_FILTERS: MethodFilter[] = ["ALL", "GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]; const MUTATING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]); const METHODS_WITHOUT_BODY = new Set(["GET", "HEAD"]); -const apiServerUrl = import.meta.env.VITE_API_SERVER_URL?.trim() ?? ""; const toPrettyJson = (value: unknown): string => { if (value === undefined) { @@ -199,7 +199,7 @@ export function BrunoApiPageContent() { const remoteWarningUrl = selectedEndpoint && isAbsoluteUrl(selectedEndpoint.definition.path) ? selectedEndpoint.definition.path - : apiServerUrl; + : resolveActiveApiBaseUrl(); const showRemoteWarning = isRemoteApiServer(remoteWarningUrl); useEffect(() => { diff --git a/apps/admin/src/components/features/chat-socket/ChatSocketPageContent.tsx b/apps/admin/src/components/features/chat-socket/ChatSocketPageContent.tsx index 17dad5190..eceba4a2c 100644 --- a/apps/admin/src/components/features/chat-socket/ChatSocketPageContent.tsx +++ b/apps/admin/src/components/features/chat-socket/ChatSocketPageContent.tsx @@ -10,6 +10,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; +import { resolveActiveApiBaseUrl } from "@/lib/env"; import { loadAccessToken } from "@/lib/utils/localStorage"; type ConnectionState = "DISCONNECTED" | "CONNECTING" | "CONNECTED" | "ERROR"; @@ -92,7 +93,7 @@ export function ChatSocketPageContent() { const subscriptionRef = useRef(null); const [connectionState, setConnectionState] = useState("DISCONNECTED"); - const [serverUrl, setServerUrl] = useState(import.meta.env.VITE_API_SERVER_URL?.trim() ?? ""); + const [serverUrl, setServerUrl] = useState(resolveActiveApiBaseUrl()); const [token, setToken] = useState(""); const [roomId, setRoomId] = useState(""); const [topicTemplate, setTopicTemplate] = useState(defaultTopicTemplate); diff --git a/apps/admin/src/components/layout/AdminLayout.tsx b/apps/admin/src/components/layout/AdminLayout.tsx index edea0cfc6..785409f91 100644 --- a/apps/admin/src/components/layout/AdminLayout.tsx +++ b/apps/admin/src/components/layout/AdminLayout.tsx @@ -6,6 +6,7 @@ import { toast } from "sonner"; import { adminSignOutApi } from "@/lib/api/auth"; import { clearSession } from "@/lib/auth/session"; import { type ActiveAdminMenu, AdminSidebar } from "./AdminSidebar"; +import { EnvironmentBanner } from "./EnvironmentBanner"; interface AdminLayoutProps { children: React.ReactNode; @@ -51,6 +52,7 @@ export function AdminLayout({ children, activeMenu, title, description }: AdminL
+

운영 콘솔