press-next
Version:
Vue3 组件库,支持 Composition API
240 lines (201 loc) • 5.44 kB
text/typescript
import { getPrizeListFromChildOrSite } from '../common/gp-match/reward/child-reward';
import { MatchingStatus } from '../press-schedule-card-gp/utils';
import { BUTTON_MAP, ScheState } from './config';
const getJoinTypeDesc = (childInfo: Record<string, any>) => {
const joinFunc = childInfo?.match_rule_cfg?.pubg_rule_cfg?.join_func;
const joinTypeMap = { 1: '团队赛', 2: '个人赛' };
const joinTypeDesc = joinTypeMap[joinFunc as 1] || '';
return joinTypeDesc;
};
const getMatchDesc = (childInfo: Record<string, any>) => {
const moduleCfg = childInfo.match_rule_cfg?.pubg_rule_cfg?.module_cfg || [];
const newModuleCfg = moduleCfg.map((item: Record<string, any>) => {
if (item.module_id === 1129) {
return {
...item,
module_name: '龙狮迎冰雪-海岛',
};
}
return item;
});
const str = newModuleCfg[0]
?.module_name
?.split('-')
.map((item: string) => item.trim())
.join(' - ') || '';
return str;
};
const baseButtonInfo = {
buttonText: '',
isButtonGray: false,
isButtonPrimary: false,
};
const getButtonText = ({
childInfo,
cycleMatchInfo,
isTeamMatch,
isJoined,
isFullTeam,
canClaimPrizeList = [],
isTeamLeader,
}: {
childInfo: Record<string, any>;
cycleMatchInfo: Record<string, any>;
isTeamMatch: boolean;
isJoined: boolean;
isFullTeam: boolean;
canClaimPrizeList?: Array<any>;
isTeamLeader: boolean
}) => {
const { act_start_time: actStartTime, act_end_time: actEndTime } = childInfo;
const now = parseInt(`${Date.now() / 1000}`, 10);
if (now > actEndTime) {
if (isJoined) {
if (canClaimPrizeList?.length) {
return {
buttonText: BUTTON_MAP.CLAIM_PRIZE,
isButtonPrimary: true,
};
}
}
return {
buttonText: BUTTON_MAP.GAME_END,
isButtonGray: true,
};
}
// TODO: to release
if (now < actStartTime) {
return {
buttonText: BUTTON_MAP.WILL_START,
isButtonGray: true,
showStartMatchCountdown: true,
};
}
const { matchingStatus, battleList } = cycleMatchInfo;
console.log('battleList', battleList);
if (matchingStatus === MatchingStatus.ON_GOING) {
return {
buttonText: BUTTON_MAP.MATCHING,
isButtonGray: true,
};
}
const lastBattle = battleList[battleList.length - 1];
if (lastBattle && lastBattle.scheState === ScheState.END && matchingStatus !== MatchingStatus.ON_GOING
&& actEndTime && actEndTime > now
) {
return isTeamMatch && !isTeamLeader ? {
buttonText: BUTTON_MAP.WAIT_CAPTAIN_MATCHING,
isButtonGray: true,
} : {
buttonText: BUTTON_MAP.START_MATCH,
isButtonPrimary: true,
};
}
if (matchingStatus === MatchingStatus.SUCCESS) {
if (lastBattle?.can_enter_game) {
return {
buttonTip: '已匹配到对手,请尽快进入游戏',
buttonText: BUTTON_MAP.ENTER_GAME,
buttonCountdown: (lastBattle.enter_game_remain || 0) * 1000,
isButtonPrimary: true,
};
}
return {
buttonTip: '等待本局结束后开始下一局匹配',
buttonText: BUTTON_MAP.GAME_PLAYING,
isButtonGray: true,
};
}
console.log('isJoined', isJoined, childInfo);
if (isTeamMatch) {
if (!isJoined) {
return {
buttonText: BUTTON_MAP.CREATE_GAME_AND_SIGNUP,
isButtonPrimary: true,
showRecruitingTeams: true,
};
}
if (!isFullTeam) {
return {
buttonTip: '队伍需要满足<span></span>人,否则无法参赛',
buttonText: BUTTON_MAP.INVITE_OTHER,
isButtonPrimary: true,
showPublishRecruit: true,
};
}
return !isTeamLeader ? {
buttonText: BUTTON_MAP.WAIT_CAPTAIN_MATCHING,
isButtonGray: true,
} : {
buttonText: BUTTON_MAP.START_MATCH,
isButtonPrimary: true,
};
}
return {
buttonTip: '已开启匹配,快来加入比赛吧',
buttonText: BUTTON_MAP.START_MATCH,
isButtonPrimary: true,
};
};
const checkShowChampion = ({
isJoined,
isEnd,
}: {
isJoined: boolean;
isEnd: boolean;
}) => isEnd && !isJoined;
export const checkIsEnd = (childInfo: Record<string, any>) => childInfo.act_end_time * 1000 < Date.now();
export function parseCycleChildInfo({
childInfo,
cycleMatchInfo,
siteInfo,
scoreInfo,
championInfo,
isTeamMatch,
isJoined,
isFullTeam,
isEnd,
canClaimPrizeList,
isTeamLeader,
}: {
childInfo: Record<string, any>;
cycleMatchInfo: Record<string, any>;
siteInfo: Record<string, any>;
scoreInfo: Record<string, any>;
championInfo: Record<string, any>;
isTeamMatch: boolean;
isJoined: boolean;
isFullTeam: boolean;
isEnd: boolean;
canClaimPrizeList: Array<any>;
isTeamLeader: boolean;
}) {
const mapDesc = getMatchDesc(childInfo);
const prizeList = getPrizeListFromChildOrSite(childInfo, siteInfo);
const buttonInfo = getButtonText({
childInfo,
cycleMatchInfo,
isTeamMatch,
isJoined,
isFullTeam,
canClaimPrizeList,
isTeamLeader,
});
console.log('prizeList', prizeList);
const result = {
...childInfo,
joinTypeDesc: getJoinTypeDesc(childInfo),
mapDesc,
prizeList,
...baseButtonInfo,
...buttonInfo,
scoreInfo,
championInfo,
showChampion: checkShowChampion({
isJoined,
isEnd,
}),
};
console.log('parsedChildInfo', result);
return result;
}