diff --git a/app/package.json b/app/package.json index dbba8d6d..61e6d4e3 100644 --- a/app/package.json +++ b/app/package.json @@ -13,6 +13,7 @@ "check": "biome check --write src" }, "dependencies": { + "@tauri-apps/api": "^2.0.0", "react": "^18.3.0", "react-dom": "^18.3.0", "@tanstack/react-query": "^5.0.0", diff --git a/app/src/App.tsx b/app/src/App.tsx index ed912a55..52c6a18b 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { GenerationForm } from '@/components/Generation/GenerationForm'; import { HistoryTable } from '@/components/History/HistoryTable'; import { ConnectionForm } from '@/components/ServerSettings/ConnectionForm'; @@ -7,14 +7,63 @@ import { ModelManagement } from '@/components/ServerSettings/ModelManagement'; import { Toaster } from '@/components/ui/toaster'; import { ProfileList } from '@/components/VoiceProfiles/ProfileList'; import { Sidebar } from '@/components/Sidebar'; +import { isTauri, startServer, stopServer } from '@/lib/tauri'; + +// Track if server is starting to prevent duplicate starts +let serverStarting = false; function App() { const [activeTab, setActiveTab] = useState('profiles'); + const [serverReady, setServerReady] = useState(false); + + // Auto-start server when running in Tauri + useEffect(() => { + if (!isTauri() || serverStarting) { + return; + } + + serverStarting = true; + console.log('Running in Tauri, starting bundled server...'); + + startServer(false) + .then(() => { + console.log('Server is ready'); + setServerReady(true); + }) + .catch((error) => { + console.error('Failed to auto-start server:', error); + serverStarting = false; + }); + + // Cleanup: stop server on actual unmount (not StrictMode remount) + return () => { + // In production builds, we want to stop the server on unmount + // In dev mode, React StrictMode causes remounts, so we skip cleanup + if (import.meta.env?.PROD) { + stopServer().catch((error) => { + console.error('Failed to stop server on cleanup:', error); + }); + serverStarting = false; + } + }; + }, []); + + // Show loading screen while server is starting in Tauri + if (isTauri() && !serverReady) { + return ( +
Starting server...
+