203 lines
6.8 KiB
TypeScript
203 lines
6.8 KiB
TypeScript
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,
|
|
};
|
|
}
|