96 lines
2.9 KiB
TypeScript
96 lines
2.9 KiB
TypeScript
import type {
|
|
ProfileDashboardSummary,
|
|
ProfilePlayedWorkSummary,
|
|
} from '../../../packages/shared/src/contracts/runtime';
|
|
|
|
export type ProfileDashboardPresentation = {
|
|
playedWorkCount: number;
|
|
playedWorkCountLabel: string;
|
|
totalPlayTimeLabel: string;
|
|
walletBalance: number;
|
|
walletBalanceLabel: string;
|
|
walletBalanceWithUnitLabel: string;
|
|
};
|
|
|
|
export function formatCompactPlayTime(playTimeMs: number) {
|
|
const totalMinutes = Math.max(0, Math.floor(playTimeMs / 60000));
|
|
const days = totalMinutes / 1440;
|
|
|
|
if (days >= 10) {
|
|
return `${Math.floor(days)}天`;
|
|
}
|
|
if (days >= 1) {
|
|
return `${days.toFixed(days >= 3 ? 0 : 1)}天`;
|
|
}
|
|
|
|
const hours = totalMinutes / 60;
|
|
if (hours >= 1) {
|
|
return `${hours.toFixed(hours >= 10 ? 0 : 1)}小时`;
|
|
}
|
|
|
|
return `${Math.max(0, totalMinutes)}分`;
|
|
}
|
|
|
|
// “累计游戏时长”卡片固定用小时口径,避免卡片在分钟 / 天之间跳变。
|
|
export function formatTotalPlayTimeHours(playTimeMs: number) {
|
|
const roundedHours = Math.max(0, Math.round(playTimeMs / 360000) / 10);
|
|
|
|
return `${roundedHours.toLocaleString('zh-CN', {
|
|
maximumFractionDigits: 1,
|
|
})}小时`;
|
|
}
|
|
|
|
export function formatDashboardCount(value: number) {
|
|
const normalizedValue = Math.max(0, Math.round(value));
|
|
if (normalizedValue >= 100000000) {
|
|
return `${(normalizedValue / 100000000).toFixed(1)}亿`;
|
|
}
|
|
if (normalizedValue >= 10000) {
|
|
return `${(normalizedValue / 10000).toFixed(1)}万`;
|
|
}
|
|
|
|
return normalizedValue.toLocaleString('zh-CN');
|
|
}
|
|
|
|
// 玩法标签沿用首页既有外显口径,未知类型暂归入 RPG。
|
|
export function formatPlayedWorkType(value: string | null | undefined) {
|
|
const normalizedValue = (value ?? '').toLowerCase();
|
|
if (normalizedValue === 'puzzle') {
|
|
return '拼图';
|
|
}
|
|
if (normalizedValue === 'match3d' || normalizedValue === 'match_3d') {
|
|
return '抓鹅';
|
|
}
|
|
if (normalizedValue === 'square-hole' || normalizedValue === 'square_hole') {
|
|
return '方洞';
|
|
}
|
|
if (normalizedValue === 'big_fish' || normalizedValue === 'big-fish') {
|
|
return '大鱼';
|
|
}
|
|
return 'RPG';
|
|
}
|
|
|
|
// 现有契约尚未下发公开作品码,“玩过”列表先沿用 profileId,再兜底 worldKey。
|
|
export function formatPlayedWorkId(work: ProfilePlayedWorkSummary) {
|
|
return work.profileId?.trim() || work.worldKey;
|
|
}
|
|
|
|
export function buildProfileDashboardPresentation(
|
|
dashboard: ProfileDashboardSummary | null,
|
|
): ProfileDashboardPresentation {
|
|
const walletBalance = dashboard?.walletBalance ?? 0;
|
|
const walletBalanceLabel = formatDashboardCount(walletBalance);
|
|
const playedWorkCount = dashboard?.playedWorldCount ?? 0;
|
|
|
|
return {
|
|
playedWorkCount,
|
|
playedWorkCountLabel: `${formatDashboardCount(playedWorkCount)}个`,
|
|
totalPlayTimeLabel: formatTotalPlayTimeHours(
|
|
dashboard?.totalPlayTimeMs ?? 0,
|
|
),
|
|
walletBalance,
|
|
walletBalanceLabel,
|
|
walletBalanceWithUnitLabel: `${walletBalanceLabel}泥点`,
|
|
};
|
|
}
|