feat: unify creation entry templates

This commit is contained in:
2026-06-03 10:24:03 +08:00
parent b0865cfa19
commit 3f742fbaca
25 changed files with 820 additions and 346 deletions

View File

@@ -20,13 +20,13 @@ import type {
import { isPlatformCreationTypeVisible } from '../platform-entry/platformEntryCreationTypes';
import {
buildCreationWorkShelfItems,
getCreationWorkShelfItemTime,
type CreationWorkShelfItem,
type CreationWorkShelfMetricId,
type CreationWorkShelfRuntimeState,
} from './creationWorkShelf';
import {
CustomWorldCreationStartCard,
type CreationEntryRecentWorkCard,
} from './CustomWorldCreationStartCard';
import { CustomWorldWorkCard } from './CustomWorldWorkCard';
import {
@@ -37,6 +37,9 @@ import {
const WORK_GRID_CLASS =
'creation-work-list grid min-w-0 gap-3 sm:gap-3.5 xl:gap-4';
const WORK_METRIC_CACHE_KEY = 'genarrative.creationHub.publishedMetrics.v1';
const RECENT_CREATION_WINDOW_DAYS = 7;
const RECENT_CREATION_WINDOW_MS =
RECENT_CREATION_WINDOW_DAYS * 24 * 60 * 60 * 1000;
type WorkMetricSnapshot = Record<
string,
@@ -92,7 +95,7 @@ type CustomWorldCreationHubProps = {
item: CreationWorkShelfItem,
) => CreationWorkShelfRuntimeState | null;
onOpenShelfItem?: (item: CreationWorkShelfItem) => void;
// 中文注释:底部加号入口的最近创作可传入后端作品架摘要,避免混入本地 pending 占位
// 中文注释:底部加号入口可传入后端作品架摘要,用于推导最近使用过的模板
recentWorkItems?: CreationWorkShelfItem[];
mode?: 'full' | 'start-only' | 'works-only';
};
@@ -160,35 +163,7 @@ function writeWorkMetricSnapshot(items: CreationWorkShelfItem[]) {
}
}
/** 格式化入口页最近创作状态,失败草稿和生成中草稿都保留真实后端摘要语义。 */
function formatRecentWorkStatusLabel(item: CreationWorkShelfItem) {
if (item.isGenerating) {
return '生成中';
}
if (item.status === 'published') {
return '已发布';
}
switch (item.source.kind) {
case 'rpg':
return item.source.item.stageLabel?.trim() || '草稿';
case 'match3d':
case 'jump-hop':
case 'wooden-fish':
return item.source.item.generationStatus === 'failed'
? '生成失败'
: '草稿';
case 'bark-battle':
return item.source.item.generationStatus === 'partial_failed'
? '生成失败'
: '草稿';
default:
return '草稿';
}
}
/** 渲染底部加号创作入口页与草稿作品架,入口页最近创作只来自后端作品摘要。 */
/** 渲染底部加号创作入口页与草稿作品架,最近创作复用最近使用过的模板入口。 */
export function CustomWorldCreationHub({
items,
loading,
@@ -348,19 +323,21 @@ export function CustomWorldCreationHub({
),
[activeFilter, shelfItems],
);
// 中文注释:最近创作只来自作品架摘要;平台入口会传入不含本地 pending 占位的后端摘要
// 中文注释:最近创作只取 7 天内作品架摘要,再推导模板 ID 复用模板入口卡片
const recentCreationCutoffMs = Date.now() - RECENT_CREATION_WINDOW_MS;
const recentWorkItems =
mode === 'start-only'
? (recentWorkSourceItems ?? shelfItems).slice(0, 4)
? (recentWorkSourceItems ?? shelfItems)
.filter(
(item) =>
getCreationWorkShelfItemTime(item.updatedAt) >=
recentCreationCutoffMs,
)
.slice(0, 4)
: [];
const recentWorkCards: CreationEntryRecentWorkCard[] = recentWorkItems.map(
(item) => ({
id: `${item.kind}:${item.id}`,
title: item.title,
summary: item.summary,
statusLabel: formatRecentWorkStatusLabel(item),
}),
);
const recentCreationTypeIds = [
...new Set(recentWorkItems.map((item) => item.kind)),
];
function handleOpenShelfItem(item: CreationWorkShelfItem) {
onOpenShelfItem?.(item);
@@ -427,14 +404,9 @@ export function CustomWorldCreationHub({
busy={createBusy}
entryConfig={entryConfig}
creationTypes={creationTypes}
recentWorks={recentWorkCards}
recentCreationTypeIds={recentCreationTypeIds}
recentWindowDays={RECENT_CREATION_WINDOW_DAYS}
onCreateType={onCreateType}
onOpenRecentWork={(index) => {
const item = recentWorkItems[index];
if (item) {
handleOpenShelfItem(item);
}
}}
/>
) : null}