const API_CONFIG = { local: { http: "http://localhost:8080", ws: "ws://localhost:8080", }, production: { http: "https://api.makima.jp", ws: "wss://api.makima.jp", }, } as const; type Environment = "local" | "production"; function detectEnvironment(): Environment { // Check if explicitly set via env var const envOverride = import.meta.env.VITE_API_ENV as Environment | undefined; if (envOverride && (envOverride === "local" || envOverride === "production")) { return envOverride; } // Auto-detect based on hostname if (typeof window !== "undefined") { const hostname = window.location.hostname; if (hostname === "localhost" || hostname === "127.0.0.1") { return "local"; } } return "production"; } const env = detectEnvironment(); export const API_BASE = API_CONFIG[env].http; export const WS_BASE = API_CONFIG[env].ws; export const LISTEN_ENDPOINT = `${WS_BASE}/api/v1/listen`; export function getEnvironment(): Environment { return env; } // File API types export interface TranscriptEntry { id: string; speaker: string; start: number; end: number; text: string; isFinal: boolean; } export interface FileSummary { id: string; name: string; description: string | null; transcriptCount: number; duration: number | null; createdAt: string; updatedAt: string; } export interface FileDetail { id: string; ownerId: string; name: string; description: string | null; transcript: TranscriptEntry[]; location: string | null; createdAt: string; updatedAt: string; } export interface FileListResponse { files: FileSummary[]; total: number; } export interface CreateFileRequest { name?: string; description?: string; transcript: TranscriptEntry[]; location?: string; } export interface UpdateFileRequest { name?: string; description?: string; transcript?: TranscriptEntry[]; } // File API functions export async function listFiles(): Promise { const res = await fetch(`${API_BASE}/api/v1/files`); if (!res.ok) { throw new Error(`Failed to list files: ${res.statusText}`); } return res.json(); } export async function getFile(id: string): Promise { const res = await fetch(`${API_BASE}/api/v1/files/${id}`); if (!res.ok) { throw new Error(`Failed to get file: ${res.statusText}`); } return res.json(); } export async function createFile(data: CreateFileRequest): Promise { const res = await fetch(`${API_BASE}/api/v1/files`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); if (!res.ok) { throw new Error(`Failed to create file: ${res.statusText}`); } return res.json(); } export async function updateFile( id: string, data: UpdateFileRequest ): Promise { const res = await fetch(`${API_BASE}/api/v1/files/${id}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); if (!res.ok) { throw new Error(`Failed to update file: ${res.statusText}`); } return res.json(); } export async function deleteFile(id: string): Promise { const res = await fetch(`${API_BASE}/api/v1/files/${id}`, { method: "DELETE", }); if (!res.ok) { throw new Error(`Failed to delete file: ${res.statusText}`); } }