import { useState } from 'react' import { ConfigProvider, Message, Spin } from '@arco-design/web-react' import '@arco-design/web-react/dist/css/arco.css' import '../App.css' import { login, setApiBaseUrl, type ApiSession } from '../api/client' import { mapWorkspace } from '../api/mappers' import { fetchProjectWorkspace, fetchProjects } from '../api/projects' import { LoginPage } from '../pages/login' import { ProjectPage } from '../pages/workspace-home' import type { ChannelKey, Project, ProjectWorkspace, Screen, Theme, WorkbenchView } from '../pages/projects/project-types' function App() { const [screen, setScreen] = useState('login') const [theme, setTheme] = useState('light') const [activeView, setActiveView] = useState('workspace') const [session, setSession] = useState(null) const [workspaces, setWorkspaces] = useState([]) const [activeProjectID, setActiveProjectID] = useState('') const [activeChannel, setActiveChannel] = useState('overview') const [activeTaskID, setActiveTaskID] = useState(null) const [, setSelectedItem] = useState('Inbox 待处理(36)') const [loading, setLoading] = useState(false) const dark = theme === 'dark' const activeWorkspace = workspaces.find((workspace) => workspace.project.id === activeProjectID) ?? workspaces[0] async function handleLogin(input: { server: string; email: string; password: string }) { setLoading(true) try { setApiBaseUrl(input.server) const nextSession = await login(input.email, input.password) const backendProjects = await fetchProjects(nextSession) const backendWorkspaces = await Promise.all( backendProjects.map((project, index) => fetchProjectWorkspace(nextSession, project.ID ?? project.id ?? '').then((workspace) => mapWorkspace(workspace, index))), ) setSession(nextSession) setWorkspaces(backendWorkspaces) setActiveProjectID(backendWorkspaces[0]?.project.id ?? '') setActiveChannel('overview') setActiveView('workspace') setScreen('workbench') } catch (error) { Message.error(error instanceof Error ? error.message : '登录失败') } finally { setLoading(false) } } function openTask(project: Project, taskID: string) { setActiveProjectID(project.id) setActiveView('project') setActiveChannel('tasks') setActiveTaskID(taskID) } return (
{screen === 'login' ? ( ) : activeWorkspace && session ? ( setActiveView('workspace')} onSelectWorkspaceInbox={() => setActiveView('workspace-inbox')} onSelectProject={(project) => { setActiveProjectID(project.id) setActiveView('project') setActiveChannel('overview') setActiveTaskID(null) }} onSelectChannel={(channel) => { setActiveChannel(channel) setActiveTaskID(null) }} onSelectItem={setSelectedItem} onOpenTask={openTask} onCloseTask={() => setActiveTaskID(null)} onToggleTheme={() => setTheme(dark ? 'light' : 'dark')} /> ) : ( )}
) } export default App