This commit is contained in:
2026-04-22 20:14:15 +08:00
parent 0773a0d0ca
commit 0e9c286a57
205 changed files with 25790 additions and 1623 deletions

View File

@@ -1,8 +1,12 @@
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 } from './CustomWorldWorkCard';
import {
CustomWorldWorkCard,
type UnifiedCreationWorkItem,
} from './CustomWorldWorkCard';
import {
type CustomWorldWorkFilter,
CustomWorldWorkTabs,
@@ -17,6 +21,8 @@ type CustomWorldCreationHubProps = {
onCreateNew: () => void;
onOpenDraft: (item: CustomWorldWorkSummary) => void;
onEnterPublished: (profileId: string) => void;
puzzleItems?: PuzzleWorkSummary[];
onOpenPuzzleDetail?: (profileId: string) => void;
};
function EmptyState({ title }: { title: string }) {
@@ -38,19 +44,38 @@ export function CustomWorldCreationHub({
onCreateNew,
onOpenDraft,
onEnterPublished,
puzzleItems = [],
onOpenPuzzleDetail,
}: CustomWorldCreationHubProps) {
const [activeFilter, setActiveFilter] =
useState<CustomWorldWorkFilter>('all');
const draftCount = items.filter((item) => item.status === 'draft').length;
const publishedCount = items.filter(
(item) => item.status === 'published',
const unifiedItems = useMemo<UnifiedCreationWorkItem[]>(
() => [
...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(
() =>
items.filter((item) =>
activeFilter === 'all' ? true : item.status === activeFilter,
unifiedItems.filter((entry) =>
activeFilter === 'all'
? true
: entry.kind === 'puzzle'
? entry.item.publicationStatus === activeFilter
: entry.item.status === activeFilter,
),
[activeFilter, items],
[activeFilter, unifiedItems],
);
return (
@@ -125,22 +150,30 @@ export function CustomWorldCreationHub({
<div className="grid gap-3 md:grid-cols-2 xl:grid-cols-3">
{filteredItems.map((item) => (
<CustomWorldWorkCard
key={item.workId}
key={`${item.kind}-${item.item.workId}`}
item={item}
onClick={() => {
if (item.sourceType === 'agent_session' && item.sessionId) {
onOpenDraft(item);
if (item.kind === 'puzzle') {
onOpenPuzzleDetail?.(item.item.profileId);
return;
}
if (item.profileId) {
onEnterPublished(item.profileId);
if (
item.item.sourceType === 'agent_session' &&
item.item.sessionId
) {
onOpenDraft(item.item);
return;
}
if (item.item.profileId) {
onEnterPublished(item.item.profileId);
}
}}
/>
))}
</div>
) : items.length === 0 ? (
) : unifiedItems.length === 0 ? (
<EmptyState title="还没有作品" />
) : (
<EmptyState title="当前筛选下没有内容" />