返回 oh-my-ppt
App.tsx
根目录 / src / renderer / src / App.tsx
1 import { useEffect, useState } from 'react'
2 import { Routes, Route, Navigate, useLocation, matchPath } from 'react-router-dom'
3 import { Sidebar } from './components/layout/Sidebar'
4 import { HomePage } from './pages/home'
5 import { SessionCreatePage } from './pages/session-create'
6 import { ThinkingDetailPage } from './pages/thinking-detail'
7 import { SessionsPage } from './pages/sessions'
8 import { SessionDetailPage } from './pages/session-detail'
9 import { SessionGeneratingPage } from './pages/session-generating'
10 import { TemplateSessionsGeneratingPage } from './pages/template-sessions-generating'
11 import { SettingsPage } from './pages/settings'
12 import { StylesPage } from './pages/styles'
13 import { FontsPage } from './pages/fonts'
14 import { StyleEditorPage } from './pages/style-editor'
15 import { TemplatesPage } from './pages/templates'
16 import { TokenUsagePage } from './pages/token-usage'
17 import { EditHtmlPage } from './pages/edit-html'
18 import { EditHtmlListPage } from './pages/edit-html-list'
19 import { AppToaster } from './components/AppToaster'
20 import { UpdateAvailableDialog } from './components/UpdateAvailableDialog'
21 import { ScrollArea } from './components/ui/ScrollArea'
22 import { ipc } from './lib/ipc'
23 import type { UpdateAvailablePayload } from '@shared/app-update.js'
24 import { useGenerationNotifications } from './hooks/useGenerationNotifications'
25
26 function App(): React.JSX.Element {
27 const location = useLocation()
28 useGenerationNotifications()
29 const isSessionDetailRoute = Boolean(matchPath('/sessions/:id/*', location.pathname))
30 const isHtmlEditorRoute = Boolean(matchPath('/edit-html/:id/*', location.pathname))
31 const isThinkingRoute = Boolean(matchPath('/thinking', location.pathname))
32 const [availableUpdate, setAvailableUpdate] = useState<UpdateAvailablePayload | null>(null)
33
34 useEffect(() => {
35 const unsubscribe = ipc.onUpdateAvailable((update) => {
36 setAvailableUpdate(update)
37 })
38 return () => {
39 unsubscribe?.()
40 }
41 }, [])
42
43 if (isSessionDetailRoute || isHtmlEditorRoute) {
44 return (
45 <>
46 <div className="flex h-full min-h-0 flex-col overflow-hidden bg-background text-foreground">
47 <Routes>
48 <Route path="/sessions/:id/template-generating" element={<TemplateSessionsGeneratingPage />} />
49 <Route path="/sessions/:id/generating" element={<SessionGeneratingPage />} />
50 <Route path="/sessions/:id" element={<SessionDetailPage />} />
51 <Route path="/edit-html/:id" element={<EditHtmlPage />} />
52 <Route path="*" element={<Navigate to="/" replace />} />
53 </Routes>
54 </div>
55 <UpdateAvailableDialog update={availableUpdate} onClose={() => setAvailableUpdate(null)} />
56 <AppToaster />
57 </>
58 )
59 }
60
61 return (
62 <>
63 <div className="h-full min-h-0 overflow-hidden bg-background text-foreground">
64 <div className="flex h-full min-h-0 flex-col">
65 <div className="app-drag-region app-titlebar bg-background/85 backdrop-blur-xl" />
66
67 <div className="flex min-h-0 flex-1">
68 <aside className="hidden min-h-0 w-[240px] shrink-0 flex-col border-r border-border/70 bg-[#f7f0e2]/40 md:flex">
69 <Sidebar />
70 </aside>
71 {isThinkingRoute ? (
72 <div className="min-h-0 flex-1 overflow-hidden">
73 <Routes>
74 <Route path="/thinking" element={<ThinkingDetailPage />} />
75 <Route path="*" element={<Navigate to="/" replace />} />
76 </Routes>
77 </div>
78 ) : (
79 <ScrollArea className="min-h-0 flex-1">
80 <Routes>
81 <Route path="/" element={<HomePage />} />
82 <Route path="/create/session" element={<SessionCreatePage />} />
83 <Route path="/sessions" element={<SessionsPage />} />
84 <Route path="/templates" element={<TemplatesPage />} />
85 <Route path="/styles" element={<StylesPage />} />
86 <Route path="/fonts" element={<FontsPage />} />
87 <Route path="/token-usage" element={<TokenUsagePage />} />
88 <Route path="/styles/new" element={<StyleEditorPage />} />
89 <Route path="/styles/:styleId" element={<StyleEditorPage />} />
90 <Route path="/edit-html" element={<EditHtmlListPage />} />
91 <Route path="/settings" element={<SettingsPage />} />
92 <Route path="*" element={<Navigate to="/" replace />} />
93 </Routes>
94 </ScrollArea>
95 )}
96 </div>
97 </div>
98 </div>
99 <UpdateAvailableDialog update={availableUpdate} onClose={() => setAvailableUpdate(null)} />
100 <AppToaster />
101 </>
102 )
103 }
104
105 export default App
106
106 lines Plain Text