press-next
Version:
Vue3 组件库,支持 Composition API
435 lines (358 loc) • 10 kB
text/typescript
import {
CARD_STATUS_MAP,
CARD_BUTTON_MAP,
CARD_BUTTON_CLASS,
// CARD_ICON_FONT_MAP,
// CARD_ICON_TEXT_MAP,
MatchingStatus,
} from '../parser-base-card/utils';
// 对局状态 10未开始 100即将开始 200进行中 300已结束
// enum BattleStatus {
// UNKNOWN = 0,
// NOT_START = 10,
// WILL_START = 100,
// PLAYING = 200,
// END = 300,
// DESTROYED = 400,
// }
// 0未开始,100已开打进行中,200已结束
enum ScheState {
NOT_START = 0,
ING = 100,
END = 200,
}
const getBattleIndex = (battle: Record<string, any>) => {
const index = (`${battle?.battle_id}` || '').split('_')?.[4];
return index;
};
const getMyScore = (myTeamId: string, schScore: Record<string, any> = {}) => {
const { teama_id: teamAId, teamb_id: teamBId, teama_score: teamAScore, teamb_score: teamBScore } = schScore;
if (myTeamId === teamAId) {
return teamAScore || 0;
}
if (myTeamId === teamBId) {
return teamBScore || 0;
}
return;
};
function getBattleScoreList({
battleList,
myTeamIdOrUId = '',
}: {
battleList: Array<Record<string, any>>;
myTeamIdOrUId?: string;
}) {
return battleList.map((item: any, index: number) => ({
scoreOrRank: getMyScore(myTeamIdOrUId, item.schScore) || 0,
title: `第${getBattleIndex(item) ?? (index + 1)}局`,
isWin: item.battle_result === 100,
isFail: item.battle_result === 200,
isTie: false,
isPending: item.battle_result === 300,
}));
}
function getCycleMatchCardState({
gameResult,
}: {
battleList?: Array<Record<string, any>>;
gameResult?: number;
}) {
// 比赛结果 100晋级 200淘汰 300结算中
if (gameResult == 100) {
return CARD_STATUS_MAP.RESULT_WIN;
}
if (gameResult == 200) {
return CARD_STATUS_MAP.RESULT_FAIL;
}
if (gameResult == 300) {
return CARD_STATUS_MAP.RESULT_WAITING;
}
return CARD_STATUS_MAP.CYCLE_MATCH;
}
export function parseCycleMatchCard({
gameResult,
gameRank,
battleList = [],
curShowingBattleIndex,
matchingStatus,
matchingCountdown,
actEndTime,
actStartTime,
myTeamIdOrUId = '',
primaryButtonDisabledToShowQRCode = false,
}: {
gameResult?: number;
gameRank?: number;
battleList: Array<Record<string, any>>;
curShowingBattleIndex: number;
matchingStatus?: MatchingStatus;
matchingCountdown?: number;
actEndTime?: number;
actStartTime?: number;
myTeamIdOrUId?: string;
primaryButtonDisabledToShowQRCode?: boolean;
}) {
const cardState = getCycleMatchCardState({
gameResult,
});
const curGoingBattleIndex = Math.max(battleList.length - 1, 0);
const cardCustom = getCycleMatchCardCustom({
battleList,
curGoingBattleIndex,
curShowingBattleIndex,
matchingStatus,
matchingCountdown,
actEndTime,
actStartTime,
myTeamIdOrUId,
primaryButtonDisabledToShowQRCode,
});
let parsedBattleList = battleList.map((item, index) => {
const realBattleSeq = getBattleIndex(item) ?? (index + 1);
return {
...item,
title: `第${realBattleSeq}局`,
realBattleSeq,
};
});
const noBattle = !battleList.length;
if (noBattle) {
parsedBattleList = [{
title: '第1局',
realBattleSeq: '1',
}];
}
return {
cardState,
curGoingBattleIndex: noBattle ? 0 : curGoingBattleIndex,
battleList: parsedBattleList,
cardCustom: {
[cardState]: {
...cardCustom,
},
},
curBattleInfo: battleList[battleList.length - 1] || {},
gameRank,
battleScoreList: getBattleScoreList({
battleList,
myTeamIdOrUId,
}),
};
}
export function getCycleMatchCardCustom({
battleList,
curGoingBattleIndex,
curShowingBattleIndex,
matchingStatus,
matchingCountdown = 0,
actEndTime,
actStartTime,
myTeamIdOrUId = '',
primaryButtonDisabledToShowQRCode = false,
}: {
battleList: Array<Record<string, any>>;
curGoingBattleIndex: number;
curShowingBattleIndex: number;
matchingStatus?: MatchingStatus;
matchingCountdown?: number;
actEndTime?: number;
actStartTime?: number;
myTeamIdOrUId?: string;
primaryButtonDisabledToShowQRCode?: boolean;
}) {
const iconCustom = {
leftIconFont: '',
leftIconText: '',
// 匹配循环赛隐藏榜单入口
rightIconFont: '', // CARD_ICON_FONT_MAP.CHECK_RANK_LIST,
rightIconText: '', // CARD_ICON_TEXT_MAP.CHECK_RANK_LIST,
};
const now = parseInt(`${Date.now() / 1000}`, 10);
const getMainType = (info: Record<string, string | boolean | number>) => ({
matchingTitle: '',
matchingCountdown: 0,
showMatchingResult: false,
showBattleResultList: false,
showBattleScoreList: false,
isMatchingFail: false,
isMatchingSuccess: false,
...info,
});
if (actStartTime && actStartTime > now) {
// 匹配时间未到
// 显示待匹配按钮、匹配未开启
return {
...getMainType({
matchingTitle: '匹配未开启',
matchingCountdown: actStartTime ? Math.max(actStartTime - now, 0) * 1000 : 0,
}),
mainButton: CARD_BUTTON_MAP.WAIT_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.INVALID,
buttonTips: '',
...iconCustom,
memo: 'actStartTime > now',
};
}
if (actEndTime && actEndTime < now) {
// 比赛已结束
return {
...getMainType({ showBattleResultList: true }),
battleScoreList: getBattleScoreList({
battleList,
myTeamIdOrUId,
}),
mainButton: '',
// mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
leftIconFont: '',
leftIconText: '',
rightIconFont: '',
rightIconText: '',
memo: 'actEndTime < now',
};
}
if (curShowingBattleIndex > curGoingBattleIndex) {
// 显示待匹配按钮、匹配未开启
return {
...getMainType({
matchingTitle: '匹配未开启',
matchingCountdown: 0,
}),
mainButton: CARD_BUTTON_MAP.WAIT_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.INVALID,
buttonTips: '',
...iconCustom,
memo: 'check next battle',
};
}
if (curShowingBattleIndex < curGoingBattleIndex) {
// 显示匹配已结束按钮、积分排名
const battleScoreList = getBattleScoreList({
battleList,
myTeamIdOrUId,
});
return {
...getMainType({ showBattleScoreList: true }),
battleScoreList,
mainButton: CARD_BUTTON_MAP.MATCHING_END,
mainButtonClass: CARD_BUTTON_CLASS.INVALID,
buttonTips: '',
...iconCustom,
memo: 'check last battle',
};
}
const lastBattle = battleList[battleList.length - 1];
// 匹配失败
if (matchingStatus === MatchingStatus.FAILED) {
return {
...getMainType({
showMatchingResult: true,
isMatchingFail: true,
}),
mainButton: CARD_BUTTON_MAP.CONTINUE_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
buttonTips: '',
...iconCustom,
memo: 'match status is FAILED',
};
}
// 比赛已结束
if (lastBattle && lastBattle.scheState === ScheState.END && matchingStatus !== MatchingStatus.ON_GOING
&& actEndTime && actEndTime > now
) {
return {
...getMainType({
matchingTitle: '匹配已开启',
matchingCountdown: actEndTime ? Math.max(actEndTime - now, 0) * 1000 : 0,
}),
mainButton: CARD_BUTTON_MAP.START_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
buttonTips: '',
...iconCustom,
memo: 'last battle is end & act not end',
};
}
// 匹配未开启
if (matchingStatus === MatchingStatus.UNKNOWN) {
return {
...getMainType({
matchingTitle: '匹配未开启',
matchingCountdown: 0,
}),
mainButton: CARD_BUTTON_MAP.WAIT_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.INVALID,
buttonTips: '',
...iconCustom,
memo: 'match status is UNKNOWN',
};
}
// 开始匹配
if (matchingStatus === MatchingStatus.UN_JOIN) {
return {
...getMainType({
matchingTitle: '匹配已开启',
matchingCountdown: actEndTime ? Math.max(actEndTime - now, 0) * 1000 : 0,
}),
mainButton: CARD_BUTTON_MAP.START_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
buttonTips: '',
...iconCustom,
memo: 'match status is UN_JOIN',
};
}
// 匹配中
if (matchingStatus === MatchingStatus.ON_GOING) {
return {
...getMainType({
matchingTitle: '匹配已开启',
matchingCountdown: matchingCountdown * 1000,
}),
mainButton: CARD_BUTTON_MAP.MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
buttonTips: '',
...iconCustom,
memo: 'match status is ON_GOING',
};
}
// 匹配成功
if (matchingStatus === MatchingStatus.SUCCESS) {
let buttonInfo: Record<string, string | number> = {
mainButton: CARD_BUTTON_MAP.BATTLE_PLAYING,
mainButtonClass: CARD_BUTTON_CLASS.INVALID,
buttonTips: '',
};
if (lastBattle?.can_enter_game) {
buttonInfo = {
mainButton: CARD_BUTTON_MAP.LAUNCH_GAME,
mainButtonClass: primaryButtonDisabledToShowQRCode
? CARD_BUTTON_CLASS.INVALID
: CARD_BUTTON_CLASS.PRIMARY,
mainButtonCountdown: (lastBattle.enter_game_remain || 0) * 1000 + Date.now(),
buttonTips: '',
};
}
return {
...getMainType({
showMatchingResult: true,
isMatchingSuccess: true,
}),
...buttonInfo,
...iconCustom,
memo: 'match status is SUCCESS',
};
}
if (!lastBattle && !matchingStatus) {
return {
...getMainType({
matchingTitle: '匹配已开启',
matchingCountdown: actEndTime ? Math.max(actEndTime - now, 0) * 1000 : 0,
}),
mainButton: CARD_BUTTON_MAP.START_MATCHING,
mainButtonClass: CARD_BUTTON_CLASS.PRIMARY,
buttonTips: '',
...iconCustom,
memo: 'not battle && not match status',
};
}
return {
};
}