import { useMemo, useState } from 'react'; import type { CustomWorldWorkSummary } from '../../../packages/shared/src/contracts/customWorldAgent'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; import { CustomWorldCreationStartCard } from './CustomWorldCreationStartCard'; import { CustomWorldWorkCard, type UnifiedCreationWorkItem, } from './CustomWorldWorkCard'; import { type CustomWorldWorkFilter, CustomWorldWorkTabs, } from './CustomWorldWorkTabs'; type CustomWorldCreationHubProps = { items: CustomWorldWorkSummary[]; loading: boolean; error: string | null; onBack: () => void; onRetry: () => void; onCreateNew: () => void; onOpenDraft: (item: CustomWorldWorkSummary) => void; onEnterPublished: (profileId: string) => void; puzzleItems?: PuzzleWorkSummary[]; onOpenPuzzleDetail?: (profileId: string) => void; }; function EmptyState({ title }: { title: string }) { return (
{title}
); } export function CustomWorldCreationHub({ items, loading, error, onBack, onRetry, onCreateNew, onOpenDraft, onEnterPublished, puzzleItems = [], onOpenPuzzleDetail, }: CustomWorldCreationHubProps) { const [activeFilter, setActiveFilter] = useState('all'); const unifiedItems = useMemo( () => [ ...items.map((item) => ({ kind: 'rpg', item }) as const), ...puzzleItems.map((item) => ({ kind: 'puzzle', item }) as const), ], [items, puzzleItems], ); const draftCount = unifiedItems.filter((entry) => entry.kind === 'puzzle' ? entry.item.publicationStatus === 'draft' : entry.item.status === 'draft', ).length; const publishedCount = unifiedItems.filter((entry) => entry.kind === 'puzzle' ? entry.item.publicationStatus === 'published' : entry.item.status === 'published', ).length; const filteredItems = useMemo( () => unifiedItems.filter((entry) => activeFilter === 'all' ? true : entry.kind === 'puzzle' ? entry.item.publicationStatus === activeFilter : entry.item.status === activeFilter, ), [activeFilter, unifiedItems], ); return (
创作中心
草稿 {draftCount} 已发布 {publishedCount}
{error ? (
{error}
) : null} {loading ? (
{Array.from({ length: 3 }).map((_, index) => (
))}
) : filteredItems.length > 0 ? (
{filteredItems.map((item) => ( { if (item.kind === 'puzzle') { onOpenPuzzleDetail?.(item.item.profileId); return; } if ( item.item.sourceType === 'agent_session' && item.item.sessionId ) { onOpenDraft(item.item); return; } if (item.item.profileId) { onEnterPublished(item.item.profileId); } }} /> ))}
) : unifiedItems.length === 0 ? ( ) : ( )}
); } export type { CustomWorldWorkFilter };