import { _decorator, Color, Component, Label, Node, Tween, tween } from 'cc'; import { VirtualScrollView } from './VScrollView'; import { Palette } from './Palette'; import { SlotRankingDataManager } from './SlotRankingDataManager'; import { callGameApiForRank, getGameId, truncateString } from 'db://assets/Loading/scripts/comm'; import { AudioManager } from 'db://assets/Loading/scripts/manager/AudioManager'; const { ccclass, property } = _decorator; @ccclass('RankHistoryList') export class RankHistoryList extends Component { // ==================== 历史排行榜 ==================== rankHistoryList: Node = null; // 历史排行榜节点 rankHistoryLoadingNode: Node = null; // 历史记录加载节点 // 历史排行榜 - 翻页按钮 rightBtn: Node = null; // 右箭头按钮(下一期) leftBtn: Node = null; // 左箭头按钮(上一期) closeBtn: Node = null; // 关闭按钮 rankingHistoryListVScroll: VirtualScrollView = null; // 历史排行榜虚拟列表 selfInfo: Node = null; // 自己的信息节点 // 历史排行榜 - 日周月切换 rankHistoryRadioDWM: Node = null; // 历史记录日周月单选按钮父节点 rankHistoryRadioDayBtn: Node = null; // 历史记录日榜单选按钮 rankHistoryRadioWeekBtn: Node = null; // 历史记录周榜单选按钮 rankHistoryRadioMonthBtn: Node = null; // 历史记录月榜单选按钮 // 活动未开启提示 activityNotOpenTip: Node = null; // 活动未开启提示 label currentHistoryType: string = ''; historyIndex: number = 1; // 历史记录索引,1表示上一期,最大为10 maxHistoryIndex: number = 10; // 最大历史记录数 availableTypes: Set = new Set(); // 可用的类型 // 回调函数 onBack: () => void = null; // 返回到主列表 init(rankHistoryListNode: Node) { this.rankHistoryList = rankHistoryListNode; let titleChange = this.rankHistoryList.getChildByName('titleChange'); this.rightBtn = titleChange.getChildByName('rightBtn'); this.leftBtn = titleChange.getChildByName('leftBtn'); this.selfInfo = this.rankHistoryList.getChildByName('list').getChildByName('self'); this.rankHistoryLoadingNode = this.rankHistoryList.getChildByName('list').getChildByName('loading'); this.rankingHistoryListVScroll = this.rankHistoryList.getChildByName('list').getChildByName('vScroll').getComponent(VirtualScrollView); this.rankHistoryRadioDWM = this.rankHistoryList.getChildByName('rankHistoryRadioDWM'); this.rankHistoryRadioDayBtn = this.rankHistoryRadioDWM.getChildByName('dayBtn'); this.rankHistoryRadioWeekBtn = this.rankHistoryRadioDWM.getChildByName('weekBtn'); this.rankHistoryRadioMonthBtn = this.rankHistoryRadioDWM.getChildByName('monthBtn'); this.activityNotOpenTip = this.rankHistoryList.getChildByName('list').getChildByName('activityNotOpenTip'); this.rankHistoryList.active = false; this.rankHistoryLoadingNode.active = false; this.activityNotOpenTip.active = false; this.closeBtn = this.rankHistoryList.getChildByName('closeHistory'); this.rightBtn.on(Node.EventType.TOUCH_END, this.onClickRightBtn, this); this.leftBtn.on(Node.EventType.TOUCH_END, this.onClickLeftBtn, this); this.closeBtn.on(Node.EventType.TOUCH_END, this.closeRankHistoryPopup, this); this.rankHistoryRadioDayBtn.on(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioDayBtn, this); this.rankHistoryRadioWeekBtn.on(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioWeekBtn, this); this.rankHistoryRadioMonthBtn.on(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioMonthBtn, this); } // ==================== 对外接口 ==================== async show(type: string) { this.rankHistoryList.active = true; this.updateAvailableTypes(); this.currentHistoryType = type; this.historyIndex = 1; this.updateHistoryArrows(); this.refreshSelfRankingInfo(null); await this.loadHistoryData(this.currentHistoryType, this.historyIndex); } updateAvailableTypes() { let rankList = SlotRankingDataManager.instance.rankList; this.availableTypes.clear(); if (rankList && rankList.List) { for (let item of rankList.List) { this.availableTypes.add(item.Type); } } } isTypeAvailable(type: string): boolean { return this.availableTypes.has(type); } showActivityNotOpenTip() { this.activityNotOpenTip.active = true; this.rankingHistoryListVScroll.setTotalCount(0); } hideActivityNotOpenTip() { this.activityNotOpenTip.active = false; } hide() { this.rankHistoryList.active = false; } // ==================== 历史记录逻辑 ==================== async loadHistoryData(type: string, index: number) { this.setRankHistoryRadioBtn(type); this.refreshSelfRankingInfo(null); if (!this.isTypeAvailable(type)) { console.log(`${type} 历史榜单活动未开启`); this.rankHistoryLoadingNode.active = false; this.showActivityNotOpenTip(); return; } this.hideActivityNotOpenTip(); this.rankingHistoryListVScroll.setTotalCount(0); Tween.stopAllByTarget(this.rankHistoryLoadingNode); this.rankHistoryLoadingNode.active = true; tween(this.rankHistoryLoadingNode) .by(0.3, { angle: 360 }) .repeatForever() .start(); let historyDate = this.getHistoryDate(type, index); let data = { Type: type, GameId: getGameId(), Date: historyDate, } try { let rankInfos = await callGameApiForRank('getRankInfos', data); Tween.stopAllByTarget(this.rankHistoryLoadingNode); this.rankHistoryLoadingNode.active = false; this.openRankHistoryPopup(rankInfos); this.refreshSelfRankingInfo(rankInfos.Self); } catch (error) { console.error('获取历史排行榜数据失败:', error); Tween.stopAllByTarget(this.rankHistoryLoadingNode); this.rankHistoryLoadingNode.active = false; } } refreshSelfRankingInfo(selfInfo: any) { if (!selfInfo) { this.selfInfo.getChildByName('Rank').getChildByName('sp_1').active = false; this.selfInfo.getChildByName('Rank').getChildByName('sp_2').active = false; this.selfInfo.getChildByName('Rank').getChildByName('sp_3').active = false; this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = true; this.selfInfo.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = '-'; this.selfInfo.getChildByName('Uid').getComponent(Label).string = '-'; this.selfInfo.getChildByName('Shop').getComponent(Label).string = '-'; this.selfInfo.getChildByName('Win').getComponent(Label).string = '-'; return; } this.selfInfo.getChildByName('Rank').getChildByName('sp_1').active = selfInfo.Rank === 1; this.selfInfo.getChildByName('Rank').getChildByName('sp_2').active = selfInfo.Rank === 2; this.selfInfo.getChildByName('Rank').getChildByName('sp_3').active = selfInfo.Rank === 3; this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = selfInfo.Rank >= 4; this.selfInfo.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = selfInfo.Rank.toString(); if (selfInfo.Rank === -1) { this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = true; this.selfInfo.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = '-'; } this.selfInfo.getChildByName('Uid').getComponent(Label).string = truncateString(selfInfo.Uid); this.selfInfo.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-'; this.selfInfo.getChildByName('Win').getComponent(Label).string = selfInfo.Win.toString(); } getHistoryDate(type: string, index: number): string { let now = new Date(); let date = new Date(now); if (type === 'day') { date.setDate(date.getDate() - index); } else if (type === 'week') { date.setDate(date.getDate() - index * 7); } else if (type === 'month') { date.setMonth(date.getMonth() - index); } let year = date.getFullYear(); let month = (date.getMonth() + 1).toString(); let day = date.getDate().toString(); if (month.length < 2) month = '0' + month; if (day.length < 2) day = '0' + day; return `${year}${month}${day}`; } updateHistoryArrows() { this.rightBtn.active = this.historyIndex > 1; this.leftBtn.active = this.historyIndex < this.maxHistoryIndex; } openRankHistoryPopup(rankInfos: any) { this.rankingHistoryListVScroll.setTotalCount(rankInfos.List.length); this.rankingHistoryListVScroll.renderItemFn = (node: Node, idx: number) => { let itemData = rankInfos.List[idx]; if (!itemData) { return; } node.getChildByName('bg').active = idx % 2 === 0; node.getChildByName('bg2').active = idx % 2 !== 0; node.getChildByName('Rank').getChildByName('sp_1').active = idx === 0; node.getChildByName('Rank').getChildByName('sp_2').active = idx === 1; node.getChildByName('Rank').getChildByName('sp_3').active = idx === 2; node.getChildByName('Rank').getChildByName('rankLab').active = idx >= 3; node.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = (idx + 1).toString(); node.getChildByName('Uid').getComponent(Label).string = truncateString(itemData.Uid); node.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-'; node.getChildByName('Win').getComponent(Label).string = itemData.Win.toString(); } this.rankingHistoryListVScroll.refreshList(rankInfos.List); } // ==================== 按钮状态管理 ==================== setRankHistoryRadioBtn(type: string) { let selectedColor = new Color(219, 180, 180, 255); let unselectedColor = new Color(197, 255, 175, 255); this.setRadioBtnState(this.rankHistoryRadioDayBtn, type === 'day', selectedColor, unselectedColor); this.setRadioBtnState(this.rankHistoryRadioWeekBtn, type === 'week', selectedColor, unselectedColor); this.setRadioBtnState(this.rankHistoryRadioMonthBtn, type === 'month', selectedColor, unselectedColor); } setRadioBtnState(btn: Node, isSelected: boolean, selectedColor: Color, unselectedColor: Color) { let check = btn.getChildByName('check'); let unCheck = btn.getChildByName('unCheck'); let label = btn.getChildByName('label'); let palette = label?.getComponent(Palette); if (isSelected) { check.active = true; unCheck.active = false; if (palette) { palette.colorLB = selectedColor; palette.colorRB = selectedColor; } } else { check.active = false; unCheck.active = true; if (palette) { palette.colorLB = unselectedColor; palette.colorRB = unselectedColor; } } } // ==================== 按钮事件 ==================== async onClickLeftBtn() { AudioManager.instance.playSFX("Common_Button_Click"); if (this.historyIndex >= this.maxHistoryIndex) { return; } this.historyIndex++; this.updateHistoryArrows(); await this.loadHistoryData(this.currentHistoryType, this.historyIndex); } async onClickRightBtn() { AudioManager.instance.playSFX("Common_Button_Click"); if (this.historyIndex <= 1) { return; } this.historyIndex--; this.updateHistoryArrows(); await this.loadHistoryData(this.currentHistoryType, this.historyIndex); } async onClickRankHistoryRadioDayBtn() { AudioManager.instance.playSFX("Common_Button_Click"); if (this.currentHistoryType === 'day') { return; } this.currentHistoryType = 'day'; this.historyIndex = 1; this.updateHistoryArrows(); await this.loadHistoryData('day', this.historyIndex); } async onClickRankHistoryRadioWeekBtn() { AudioManager.instance.playSFX("Common_Button_Click"); if (this.currentHistoryType === 'week') { return; } this.currentHistoryType = 'week'; this.historyIndex = 1; this.updateHistoryArrows(); await this.loadHistoryData('week', this.historyIndex); } async onClickRankHistoryRadioMonthBtn() { AudioManager.instance.playSFX("Common_Button_Click"); if (this.currentHistoryType === 'month') { return; } this.currentHistoryType = 'month'; this.historyIndex = 1; this.updateHistoryArrows(); await this.loadHistoryData('month', this.historyIndex); } closeRankHistoryPopup() { AudioManager.instance.playSFX("Common_Button_Click"); this.onBack?.call(null); } onDestroy() { this.rightBtn.off(Node.EventType.TOUCH_END, this.onClickRightBtn, this); this.leftBtn.off(Node.EventType.TOUCH_END, this.onClickLeftBtn, this); this.rankHistoryRadioDayBtn.off(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioDayBtn, this); this.rankHistoryRadioWeekBtn.off(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioWeekBtn, this); this.rankHistoryRadioMonthBtn.off(Node.EventType.TOUCH_END, this.onClickRankHistoryRadioMonthBtn, this); this.closeBtn.off(Node.EventType.TOUCH_END, this.closeRankHistoryPopup, this); } }