Files
MediaCrawler/webui/src/App.tsx
T
程序员阿江(Relakkes) 65ddaa8828 refactor: 将 WebUI 源码纳入仓库,移除打包产物
- 新增 webui/ 前端源码目录(React+Vite+TypeScript+Tailwind)
- 删除 api/webui/ 中旧的打包静态资源
- 更新 .gitignore 忽略 api/webui/ 构建输出和 webui/node_modules
- 更新 README 增加前端构建说明
2026-07-01 23:05:03 +08:00

75 lines
2.4 KiB
TypeScript

import { useState } from 'react'
import { Toaster } from 'sonner'
import { Sidebar } from '@/components/layout/Sidebar'
import { MainContent } from '@/components/layout/MainContent'
import { AuthorFooter } from '@/components/layout/AuthorFooter'
import { CrawlerConfigPanel } from '@/components/config/CrawlerConfigPanel'
import { EnvironmentCheck, isEnvChecked } from '@/components/env/EnvironmentCheck'
import { LicenseDisclaimer, isLicenseAccepted } from '@/components/license/LicenseDisclaimer'
function App() {
// Initialize by checking localStorage if license has been accepted
const [licenseAccepted, setLicenseAccepted] = useState(() => isLicenseAccepted())
// Initialize by checking localStorage if env check has passed
const [envChecked, setEnvChecked] = useState(() => isEnvChecked())
// State for showing disclaimer manually
const [showDisclaimer, setShowDisclaimer] = useState(false)
const handleEnvCheckComplete = () => {
setEnvChecked(true)
}
const handleLicenseAccept = () => {
setLicenseAccepted(true)
setShowDisclaimer(false)
}
const handleShowDisclaimer = () => {
setShowDisclaimer(true)
}
return (
<div className="flex flex-col h-screen cyber-grid overflow-hidden relative">
{/* License Disclaimer Modal - Shows first or when triggered */}
{(!licenseAccepted || showDisclaimer) && (
<LicenseDisclaimer onAccept={handleLicenseAccept} />
)}
{/* Environment Check Modal - Shows after license accepted */}
{licenseAccepted && !showDisclaimer && !envChecked && (
<EnvironmentCheck onCheckComplete={handleEnvCheckComplete} />
)}
{/* Header Bar */}
<Sidebar onShowDisclaimer={handleShowDisclaimer} />
{/* Main Area */}
<div className="flex-1 flex flex-col gap-4 p-4 overflow-hidden min-h-0">
{/* Config Panel - Primary Action Area (Always Expanded) */}
<div className="flex-shrink-0">
<CrawlerConfigPanel />
</div>
{/* Console - Collapsible Terminal */}
<MainContent />
</div>
{/* Author Footer */}
<AuthorFooter />
{/* Toast notifications - Theme-aware style */}
<Toaster
position="top-right"
toastOptions={{
className: 'glass-panel font-mono text-cyber-text-primary',
style: {
fontFamily: 'JetBrains Mono, monospace',
},
}}
/>
</div>
)
}
export default App