Files
agent/apps/web_v1/src/pages/projects/project-channel-page.tsx

80 lines
3.5 KiB
TypeScript
Raw Normal View History

2026-07-20 12:26:21 +08:00
import { ProjectAi } from './project-ai'
import { ProjectCron } from './project-cron'
import { ProjectInbox } from './project-inbox'
import { ProjectNewChannel } from './project-new-channel'
2026-07-20 12:26:21 +08:00
import { ProjectNotes } from './project-notes'
import { ProjectOverview } from './project-overview'
2026-07-21 01:18:06 +08:00
import type { ProjectTaskUpdate } from './project-task-edit-modal'
2026-07-20 12:26:21 +08:00
import { ProjectTasks } from './project-tasks'
import type { ChannelKey, InboxConfirmationOutcome, ProjectWorkspace } from './project-types'
import type { CaptureInboxInput, InboxSuggestionDTO } from '../../api/inbox'
import type { AISessionDTO, CreateAISessionInput } from '../../api/ai'
import { Card, Empty, Typography } from '@arco-design/web-react'
const { Text } = Typography
2026-07-20 12:26:21 +08:00
export function ProjectChannelPage({
activeChannel,
activeWorkspace,
activeTaskID,
2026-07-20 12:26:21 +08:00
onSelectItem,
onOpenTask,
onCloseTask,
onCreateTask,
onUploadSource,
onCreateCronPlan,
onCreateProjectTag,
2026-07-21 01:18:06 +08:00
onUpdateTask,
onAnalyzeInbox,
onCaptureInbox,
onConfirmInbox,
onListAISessions,
onCreateAISession,
2026-07-20 12:26:21 +08:00
}: {
activeChannel: ChannelKey
activeWorkspace: ProjectWorkspace
activeTaskID: string | null
2026-07-20 12:26:21 +08:00
onSelectItem: (title: string) => void
onOpenTask: (taskID: string) => void
onCloseTask: () => void
onCreateTask: () => void
onUploadSource: () => void
onCreateCronPlan: () => void
onCreateProjectTag: (name: string) => Promise<void>
onUpdateTask: (update: ProjectTaskUpdate) => Promise<void>
onAnalyzeInbox: (inboxId: string) => Promise<InboxSuggestionDTO[]>
onCaptureInbox: (projectId: string, input: CaptureInboxInput) => Promise<string>
onConfirmInbox: (inboxId: string, suggestionIds: string[]) => Promise<InboxConfirmationOutcome>
onListAISessions: (projectId: string, signal?: AbortSignal) => Promise<AISessionDTO[]>
onCreateAISession: (projectId: string, input: CreateAISessionInput, signal?: AbortSignal) => Promise<AISessionDTO>
2026-07-20 12:26:21 +08:00
}) {
if (activeChannel.startsWith('custom:')) {
return (
<div className="project-channel-page project-unavailable-page overview-page">
<Card className="queue-section" bordered>
<Empty description="自定义链接频道暂未开放" />
<Text type="secondary">MVP </Text>
</Card>
</div>
)
}
2026-07-20 12:26:21 +08:00
switch (activeChannel) {
case 'inbox':
return <ProjectInbox key={activeWorkspace.project.id} activeWorkspace={activeWorkspace} onCapture={onCaptureInbox} onAnalyze={onAnalyzeInbox} onConfirm={onConfirmInbox} />
2026-07-20 12:26:21 +08:00
case 'tasks':
2026-07-21 01:18:06 +08:00
return <ProjectTasks activeWorkspace={activeWorkspace} activeTaskID={activeTaskID} onOpenTask={onOpenTask} onCloseTask={onCloseTask} onSelectItem={onSelectItem} onCreateTask={onCreateTask} onCreateProjectTag={onCreateProjectTag} onUpdateTask={onUpdateTask} />
2026-07-20 12:26:21 +08:00
case 'ai':
return <ProjectAi key={activeWorkspace.project.id} activeWorkspace={activeWorkspace} onSelectItem={onSelectItem} onListSessions={onListAISessions} onCreateSession={onCreateAISession} />
2026-07-20 12:26:21 +08:00
case 'notes':
return <ProjectNotes activeWorkspace={activeWorkspace} onSelectItem={onSelectItem} onUploadSource={onUploadSource} />
2026-07-20 12:26:21 +08:00
case 'cron':
return <ProjectCron activeWorkspace={activeWorkspace} onSelectItem={onSelectItem} onCreateCronPlan={onCreateCronPlan} />
case 'new-channel':
return <ProjectNewChannel activeWorkspace={activeWorkspace} />
2026-07-20 12:26:21 +08:00
case 'overview':
default:
2026-07-21 01:18:06 +08:00
return <ProjectOverview activeWorkspace={activeWorkspace} onSelectItem={onSelectItem} onUpdateTask={onUpdateTask} />
2026-07-20 12:26:21 +08:00
}
}