import type { BarkBattleDraftConfig } from '../../../packages/shared/src/contracts/barkBattle'; import type { BigFishSessionSnapshotResponse } from '../../../packages/shared/src/contracts/bigFish'; import type { BabyObjectMatchDraft } from '../../../packages/shared/src/contracts/edutainmentBabyObject'; import type { Match3DAgentSessionSnapshot } from '../../../packages/shared/src/contracts/match3dAgent'; import type { PuzzleAgentSessionSnapshot } from '../../../packages/shared/src/contracts/puzzleAgentSession'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; import type { SquareHoleSessionSnapshot } from '../../../packages/shared/src/contracts/squareHoleAgent'; import type { VisualNovelAgentSessionSnapshot } from '../../../packages/shared/src/contracts/visualNovel'; import type { CreationUrlState } from '../../services/creationUrlState'; import type { JumpHopSessionSnapshotResponse, JumpHopWorkProfileResponse, } from '../../services/jump-hop/jumpHopClient'; import { buildPuzzlePublicWorkCode } from '../../services/publicWorkCode'; import type { PuzzleRuntimeUrlState } from '../../services/puzzleRuntimeUrlState'; import type { WoodenFishSessionSnapshotResponse, WoodenFishWorkProfileResponse, } from '../../services/wooden-fish/woodenFishClient'; import { buildPuzzleResultProfileId, buildPuzzleResultWorkId, buildPuzzleSessionIdFromProfileId, } from './platformPuzzleIdentityModel'; /** 平台创作恢复 URL 私有 query 的纯模型,调用方只需传入玩法快照。 */ export function normalizeCreationUrlValue(value: string | null | undefined) { return value?.trim() || null; } export function hasCreationUrlStateValue(state: CreationUrlState) { return Boolean( normalizeCreationUrlValue(state.sessionId) || normalizeCreationUrlValue(state.profileId) || normalizeCreationUrlValue(state.draftId) || normalizeCreationUrlValue(state.workId), ); } export function hasPuzzleRuntimeUrlStateValue(state: PuzzleRuntimeUrlState) { return Boolean( normalizeCreationUrlValue(state.runtimeSessionId) || normalizeCreationUrlValue(state.runtimeProfileId) || normalizeCreationUrlValue(state.runtimeLevelId) || normalizeCreationUrlValue(state.publicWorkCode) || normalizeCreationUrlValue(state.mode), ); } export function buildPuzzleRuntimeUrlStateKey(state: PuzzleRuntimeUrlState) { return [ normalizeCreationUrlValue(state.mode), normalizeCreationUrlValue(state.runtimeSessionId), normalizeCreationUrlValue(state.runtimeProfileId), normalizeCreationUrlValue(state.runtimeLevelId), normalizeCreationUrlValue(state.publicWorkCode), ].join('|'); } export function buildBigFishCreationUrlState( session: BigFishSessionSnapshotResponse | null, ): CreationUrlState { const sessionId = normalizeCreationUrlValue(session?.sessionId); return { sessionId, workId: sessionId ? `big-fish-work-${sessionId}` : null, }; } export function buildMatch3DCreationUrlState( session: Match3DAgentSessionSnapshot | null, ): CreationUrlState { const sessionId = normalizeCreationUrlValue(session?.sessionId); const profileId = normalizeCreationUrlValue( session?.draft?.profileId ?? session?.publishedProfileId, ); return { sessionId, profileId, workId: profileId, }; } export function buildSquareHoleCreationUrlState( session: SquareHoleSessionSnapshot | null, ): CreationUrlState { const sessionId = normalizeCreationUrlValue(session?.sessionId); const profileId = normalizeCreationUrlValue( session?.draft?.profileId ?? session?.publishedProfileId, ); return { sessionId, profileId, workId: profileId, }; } export function buildPuzzleCreationUrlState( session: PuzzleAgentSessionSnapshot | null, ): CreationUrlState { const sessionId = normalizeCreationUrlValue(session?.sessionId); const profileId = normalizeCreationUrlValue( session?.publishedProfileId ?? buildPuzzleResultProfileId(sessionId), ); return { sessionId, profileId, workId: sessionId ? buildPuzzleResultWorkId(sessionId) : null, }; } export function buildPuzzleDraftRuntimeUrlState( item: PuzzleWorkSummary, levelId?: string | null, ): PuzzleRuntimeUrlState { const runtimeSessionId = normalizeCreationUrlValue(item.sourceSessionId) ?? buildPuzzleSessionIdFromProfileId(item.profileId); return { mode: 'draft', runtimeSessionId, runtimeProfileId: normalizeCreationUrlValue(item.profileId), runtimeLevelId: normalizeCreationUrlValue(levelId), }; } export function buildPuzzlePublishedRuntimeUrlState( item: PuzzleWorkSummary, levelId?: string | null, ): PuzzleRuntimeUrlState { return { mode: 'published', runtimeProfileId: normalizeCreationUrlValue(item.profileId), runtimeLevelId: normalizeCreationUrlValue(levelId), publicWorkCode: buildPuzzlePublicWorkCode(item.profileId), }; } export function buildVisualNovelCreationUrlState( session: VisualNovelAgentSessionSnapshot | null, ): CreationUrlState { const sessionId = normalizeCreationUrlValue(session?.sessionId); const profileId = normalizeCreationUrlValue(session?.draft?.profileId); return { sessionId, profileId, workId: profileId ?? sessionId, }; } export function buildJumpHopCreationUrlState(params: { session?: JumpHopSessionSnapshotResponse | null; work?: JumpHopWorkProfileResponse | null; }): CreationUrlState { const sessionId = normalizeCreationUrlValue(params.session?.sessionId); const profileId = normalizeCreationUrlValue( params.work?.summary.profileId ?? params.session?.draft?.profileId, ); return { sessionId, profileId, workId: normalizeCreationUrlValue(params.work?.summary.workId ?? profileId), }; } export function buildWoodenFishCreationUrlState(params: { session?: WoodenFishSessionSnapshotResponse | null; work?: WoodenFishWorkProfileResponse | null; }): CreationUrlState { const sessionId = normalizeCreationUrlValue(params.session?.sessionId); const profileId = normalizeCreationUrlValue( params.work?.summary.profileId ?? params.session?.draft?.profileId, ); const draftId = profileId ?? sessionId; return { sessionId, profileId, draftId, workId: normalizeCreationUrlValue(params.work?.summary.workId ?? profileId), }; } export function buildBarkBattleCreationUrlState( draft: BarkBattleDraftConfig | null, ): CreationUrlState { return { draftId: normalizeCreationUrlValue(draft?.draftId), workId: normalizeCreationUrlValue(draft?.workId ?? draft?.draftId), }; } export function buildBabyObjectMatchCreationUrlState( draft: BabyObjectMatchDraft | null, ): CreationUrlState { const profileId = normalizeCreationUrlValue(draft?.profileId); return { profileId, draftId: normalizeCreationUrlValue(draft?.draftId), workId: profileId, }; }