import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/bigFishWorkSummary'; import type { CustomWorldWorkSummary } from '../../../packages/shared/src/contracts/customWorldWorkSummary'; import type { BabyObjectMatchDraft } from '../../../packages/shared/src/contracts/edutainmentBabyObject'; import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; import type { CustomWorldLibraryEntry } from '../../../packages/shared/src/contracts/runtime'; import type { SquareHoleWorkSummary } from '../../../packages/shared/src/contracts/squareHoleWorks'; import type { VisualNovelWorkSummary } from '../../../packages/shared/src/contracts/visualNovel'; import { buildPuzzleResultProfileId, buildPuzzleResultWorkId, collectDraftNoticeKeys, } from './platformDraftGenerationShelfModel'; const PRIVATE_WORK_DELETE_DETAIL = '删除后会从你的作品列表中移除。'; const PUBLIC_GALLERY_DELETE_DETAIL = '删除后会从你的作品列表和公开广场中移除。'; const EDUTAINMENT_PUBLIC_DELETE_DETAIL = '删除后会从你的作品列表和寓教于乐板块中移除。'; export type PlatformCreationWorkDeleteConfirmationModel = { id: string; title: string; detail: string; noticeKeys: string[]; }; export type PlatformCreationWorkDeleteInput = | { kind: 'rpg-library'; entry: Pick, 'profileId' | 'worldName'>; } | { kind: 'rpg'; work: Pick< CustomWorldWorkSummary, 'workId' | 'title' | 'status' | 'sessionId' | 'profileId' >; } | { kind: 'big-fish'; work: Pick< BigFishWorkSummary, 'workId' | 'title' | 'status' | 'sourceSessionId' >; } | { kind: 'puzzle'; work: Pick< PuzzleWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'workTitle' | 'levelName' | 'publicationStatus' >; } | { kind: 'match3d'; work: Pick< Match3DWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'gameName' | 'publicationStatus' >; } | { kind: 'square-hole'; work: Pick< SquareHoleWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'gameName' | 'publicationStatus' >; } | { kind: 'visual-novel'; work: Pick< VisualNovelWorkSummary, 'profileId' | 'title' | 'publishStatus' >; } | { kind: 'baby-object-match'; work: Pick< BabyObjectMatchDraft, | 'profileId' | 'draftId' | 'workTitle' | 'templateName' | 'publicationStatus' >; }; export function resolvePlatformCreationWorkDeleteConfirmationModel( input: PlatformCreationWorkDeleteInput, ): PlatformCreationWorkDeleteConfirmationModel { switch (input.kind) { case 'rpg-library': return resolveRpgLibraryDeleteConfirmationModel(input.entry); case 'rpg': return resolveRpgWorkDeleteConfirmationModel(input.work); case 'big-fish': return resolveBigFishWorkDeleteConfirmationModel(input.work); case 'puzzle': return resolvePuzzleWorkDeleteConfirmationModel(input.work); case 'match3d': return resolveMatch3DWorkDeleteConfirmationModel(input.work); case 'square-hole': return resolveSquareHoleWorkDeleteConfirmationModel(input.work); case 'visual-novel': return resolveVisualNovelWorkDeleteConfirmationModel(input.work); case 'baby-object-match': return resolveBabyObjectMatchDeleteConfirmationModel(input.work); default: { const exhaustive: never = input; return exhaustive; } } } function resolveStatusDeleteDetail( status: string, publishedDetail = PUBLIC_GALLERY_DELETE_DETAIL, ) { return status === 'published' ? publishedDetail : PRIVATE_WORK_DELETE_DETAIL; } function resolveTrimmedTitle( value: string | null | undefined, fallback: string, ) { const trimmedValue = value?.trim(); return trimmedValue || fallback; } function resolveRpgLibraryDeleteConfirmationModel( entry: Pick, 'profileId' | 'worldName'>, ): PlatformCreationWorkDeleteConfirmationModel { return { id: entry.profileId, title: entry.worldName, detail: PUBLIC_GALLERY_DELETE_DETAIL, noticeKeys: [], }; } function resolveRpgWorkDeleteConfirmationModel( work: Pick< CustomWorldWorkSummary, 'workId' | 'title' | 'status' | 'sessionId' | 'profileId' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.workId, title: work.title, detail: resolveStatusDeleteDetail(work.status), noticeKeys: collectDraftNoticeKeys('rpg', [ work.workId, work.sessionId, work.profileId, ]), }; } function resolveBigFishWorkDeleteConfirmationModel( work: Pick< BigFishWorkSummary, 'workId' | 'title' | 'status' | 'sourceSessionId' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.workId, title: work.title, detail: resolveStatusDeleteDetail(work.status), noticeKeys: collectDraftNoticeKeys('big-fish', [ work.workId, work.sourceSessionId, ]), }; } function resolvePuzzleWorkDeleteConfirmationModel( work: Pick< PuzzleWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'workTitle' | 'levelName' | 'publicationStatus' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.workId, title: resolveTrimmedTitle( work.workTitle, resolveTrimmedTitle(work.levelName, '未命名拼图'), ), detail: resolveStatusDeleteDetail(work.publicationStatus), noticeKeys: collectDraftNoticeKeys('puzzle', [ work.workId, work.profileId, work.sourceSessionId, buildPuzzleResultWorkId(work.sourceSessionId), buildPuzzleResultProfileId(work.sourceSessionId), ]), }; } function resolveMatch3DWorkDeleteConfirmationModel( work: Pick< Match3DWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'gameName' | 'publicationStatus' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.workId, title: work.gameName, detail: resolveStatusDeleteDetail(work.publicationStatus), noticeKeys: collectDraftNoticeKeys('match3d', [ work.workId, work.profileId, work.sourceSessionId, ]), }; } function resolveSquareHoleWorkDeleteConfirmationModel( work: Pick< SquareHoleWorkSummary, | 'workId' | 'profileId' | 'sourceSessionId' | 'gameName' | 'publicationStatus' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.workId, title: work.gameName, detail: resolveStatusDeleteDetail(work.publicationStatus), noticeKeys: collectDraftNoticeKeys('square-hole', [ work.workId, work.profileId, work.sourceSessionId, ]), }; } function resolveVisualNovelWorkDeleteConfirmationModel( work: Pick, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.profileId, title: work.title || '未命名视觉小说', detail: resolveStatusDeleteDetail(work.publishStatus), noticeKeys: collectDraftNoticeKeys('visual-novel', [work.profileId]), }; } function resolveBabyObjectMatchDeleteConfirmationModel( work: Pick< BabyObjectMatchDraft, 'profileId' | 'draftId' | 'workTitle' | 'templateName' | 'publicationStatus' >, ): PlatformCreationWorkDeleteConfirmationModel { return { id: work.profileId, title: resolveTrimmedTitle(work.workTitle, work.templateName), detail: resolveStatusDeleteDetail( work.publicationStatus, EDUTAINMENT_PUBLIC_DELETE_DETAIL, ), noticeKeys: collectDraftNoticeKeys('baby-object-match', [ work.profileId, work.draftId, ]), }; }