137 lines
4.3 KiB
TypeScript
137 lines
4.3 KiB
TypeScript
import type { JumpHopSessionSnapshotResponse, JumpHopWorkSummaryResponse } from '../../../packages/shared/src/contracts/jumpHop';
|
|
import type { PuzzleAgentSessionSnapshot } from '../../../packages/shared/src/contracts/puzzleAgentSession';
|
|
import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary';
|
|
import type {
|
|
WoodenFishSessionSnapshotResponse,
|
|
WoodenFishWorkProfileResponse,
|
|
WoodenFishWorkSummaryResponse,
|
|
} from '../../../packages/shared/src/contracts/woodenFish';
|
|
import { normalizeCreationUrlValue } from './platformCreationUrlStateModel';
|
|
import {
|
|
buildPuzzleResultProfileId,
|
|
buildPuzzleResultWorkId,
|
|
} from './platformPuzzleIdentityModel';
|
|
|
|
export type PlatformMiniGameSessionOwner = {
|
|
userId?: string | null;
|
|
displayName?: string | null;
|
|
};
|
|
|
|
export function buildPuzzleRuntimeWorkFromSession(
|
|
session: PuzzleAgentSessionSnapshot,
|
|
owner: PlatformMiniGameSessionOwner,
|
|
): PuzzleWorkSummary | null {
|
|
const draft = session.draft;
|
|
const profileId =
|
|
session.publishedProfileId ?? buildPuzzleResultProfileId(session.sessionId);
|
|
if (!draft || !profileId || !draft.coverImageSrc?.trim()) {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
workId: buildPuzzleResultWorkId(session.sessionId) ?? profileId,
|
|
profileId,
|
|
ownerUserId: owner.userId ?? 'current-user',
|
|
sourceSessionId: session.sessionId,
|
|
authorDisplayName: owner.displayName ?? '玩家',
|
|
workTitle: draft.workTitle,
|
|
workDescription: draft.workDescription,
|
|
levelName: draft.levelName,
|
|
summary: draft.summary,
|
|
themeTags: draft.themeTags,
|
|
coverImageSrc: draft.coverImageSrc,
|
|
coverAssetId: draft.coverAssetId,
|
|
publicationStatus: 'draft',
|
|
updatedAt: session.updatedAt,
|
|
publishedAt: null,
|
|
playCount: 0,
|
|
remixCount: 0,
|
|
likeCount: 0,
|
|
publishReady: Boolean(session.resultPreview?.publishReady),
|
|
levels: draft.levels,
|
|
};
|
|
}
|
|
|
|
export function buildJumpHopPendingSession(
|
|
item: JumpHopWorkSummaryResponse,
|
|
): JumpHopSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: item.ownerUserId,
|
|
status: item.generationStatus,
|
|
draft: {
|
|
templateId: 'jump-hop',
|
|
templateName: '跳一跳',
|
|
profileId: item.profileId,
|
|
workTitle: item.workTitle,
|
|
workDescription: item.workDescription,
|
|
themeTags: item.themeTags,
|
|
difficulty: item.difficulty,
|
|
stylePreset: item.stylePreset,
|
|
characterPrompt: '',
|
|
tilePrompt: '',
|
|
endMoodPrompt: null,
|
|
characterAsset: null,
|
|
tileAtlasAsset: null,
|
|
tileAssets: [],
|
|
path: null,
|
|
coverComposite: item.coverImageSrc,
|
|
generationStatus: item.generationStatus,
|
|
},
|
|
createdAt: item.updatedAt,
|
|
updatedAt: item.updatedAt,
|
|
};
|
|
}
|
|
|
|
export function buildWoodenFishSessionFromWorkDetail(
|
|
work: WoodenFishWorkProfileResponse,
|
|
fallbackItem?: WoodenFishWorkSummaryResponse | null,
|
|
): WoodenFishSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(work.summary.sourceSessionId) ??
|
|
normalizeCreationUrlValue(fallbackItem?.sourceSessionId) ??
|
|
work.summary.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: work.summary.ownerUserId,
|
|
status: work.summary.generationStatus,
|
|
draft: work.draft,
|
|
createdAt: work.summary.updatedAt,
|
|
updatedAt: work.summary.updatedAt,
|
|
};
|
|
}
|
|
|
|
export function buildWoodenFishPendingSession(
|
|
item: WoodenFishWorkSummaryResponse,
|
|
): WoodenFishSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: item.ownerUserId,
|
|
status: item.generationStatus,
|
|
draft: {
|
|
templateId: 'wooden-fish',
|
|
templateName: '敲木鱼',
|
|
profileId: item.profileId,
|
|
workTitle: item.workTitle,
|
|
workDescription: item.workDescription,
|
|
themeTags: item.themeTags,
|
|
hitObjectPrompt: '',
|
|
hitObjectReferenceImageSrc: null,
|
|
hitSoundPrompt: null,
|
|
floatingWords: ['功德 +1'],
|
|
hitObjectAsset: null,
|
|
backgroundAsset: null,
|
|
backButtonAsset: null,
|
|
hitSoundAsset: null,
|
|
coverImageSrc: item.coverImageSrc,
|
|
generationStatus: item.generationStatus,
|
|
},
|
|
createdAt: item.updatedAt,
|
|
updatedAt: item.updatedAt,
|
|
};
|
|
}
|