From 53393f2350e99307c8aac84147ac7086b4a2b982 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 17 May 2026 06:16:51 +0800 Subject: [PATCH] auto-sync: 2026-05-17 06:16:51 --- src/frontend/src/App.tsx | 94 +++++++++++++++++++++++++++++++++++++++ src/frontend/src/main.tsx | 10 +++++ 2 files changed, 104 insertions(+) create mode 100644 src/frontend/src/App.tsx create mode 100644 src/frontend/src/main.tsx diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx new file mode 100644 index 0000000..e739ea1 --- /dev/null +++ b/src/frontend/src/App.tsx @@ -0,0 +1,94 @@ +// App 主入口 + +import React, { useState, useCallback } from 'react'; +import { TaskBoard } from './pages/TaskBoard'; +import { Monitor } from './pages/Monitor'; +import { Config } from './pages/Config'; +import { Briefing } from './pages/Briefing'; +import { TaskModal } from './components/TaskModal'; +import { useProjects } from './hooks/useApi'; +import type { Task } from './types'; + +type Page = 'tasks' | 'monitor' | 'config' | 'briefing'; + +export default function App() { + const [page, setPage] = useState('tasks'); + const [selectedProject, setSelectedProject] = useState(null); + const [selectedTask, setSelectedTask] = useState(null); + const { projects } = useProjects(); + + const handleSelectTask = useCallback((task: Task) => { + setSelectedTask(task); + }, []); + + return ( +
+ {/* Sidebar */} + + + {/* Main content */} +
+ {page === 'tasks' && ( + + )} + {page === 'monitor' && } + {page === 'briefing' && } + {page === 'config' && } +
+ + {/* Task detail modal */} + setSelectedTask(null)} /> +
+ ); +} diff --git a/src/frontend/src/main.tsx b/src/frontend/src/main.tsx new file mode 100644 index 0000000..dc3f4b5 --- /dev/null +++ b/src/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './styles/global.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +);