rp_10012/assets/Game/SlotRanking/scripts/RewardHistoryList.ts
TJH 354766ccb9
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 47s
龙虎榜相关
2025-12-24 16:55:31 +08:00

123 lines
4.8 KiB
TypeScript

import { _decorator, Component, Label, Node, Tween, tween } from 'cc';
import { VirtualScrollView } from './VScrollView';
import { I18nManager } from 'db://assets/Loading/scripts/manager/I18nManager';
import { callGameApiForRank } from 'db://assets/Loading/scripts/comm';
import { AudioManager } from 'db://assets/Loading/scripts/manager/AudioManager';
const { ccclass, property } = _decorator;
@ccclass('RewardHistoryList')
export class RewardHistoryList extends Component {
rewardHistoryList: Node = null; // 历史记录列表节点
rewardHistoryLoadingNode: Node = null; // 历史记录加载节点
closeBtn: Node = null; // 关闭按钮
rewardHistoryListVScroll: VirtualScrollView = null; // 历史记录列表虚拟列表
historyData: any[] = [];
// 回调函数
onBack: () => void = null;
init(rewardHistoryListNode: Node) {
this.rewardHistoryList = rewardHistoryListNode;
this.rewardHistoryLoadingNode = this.rewardHistoryList.getChildByName('list').getChildByName('loading');
this.rewardHistoryListVScroll = this.rewardHistoryList.getChildByName('list').getChildByName('vScroll').getComponent(VirtualScrollView);
this.closeBtn = this.rewardHistoryList.getChildByName('closeHistory');
this.rewardHistoryList.active = false;
this.rewardHistoryLoadingNode.active = false;
this.closeBtn.on(Node.EventType.TOUCH_END, this.onClickCloseBtn, this);
}
// ==================== 对外接口 ====================
async show() {
this.rewardHistoryList.active = true;
await this.loadHistoryData();
}
hide() {
this.rewardHistoryList.active = false;
}
// ==================== 历史记录逻辑 ====================
async loadHistoryData() {
this.rewardHistoryListVScroll.setTotalCount(0);
Tween.stopAllByTarget(this.rewardHistoryLoadingNode);
this.rewardHistoryLoadingNode.active = true;
tween(this.rewardHistoryLoadingNode)
.by(0.3, { angle: 360 })
.repeatForever()
.start();
try {
let historyData = await callGameApiForRank('getRewardsHistory', {});
Tween.stopAllByTarget(this.rewardHistoryLoadingNode);
this.rewardHistoryLoadingNode.active = false;
this.openHistoryPopup(historyData);
} catch (error) {
console.error('获取奖励历史记录失败:', error);
Tween.stopAllByTarget(this.rewardHistoryLoadingNode);
this.rewardHistoryLoadingNode.active = false;
}
}
openHistoryPopup(historyData: any) {
if (!historyData || !historyData.List || historyData.List.length === 0) {
this.rewardHistoryListVScroll.setTotalCount(0);
return;
}
this.historyData = historyData.List;
this.rewardHistoryListVScroll.setTotalCount(this.historyData.length);
this.rewardHistoryListVScroll.renderItemFn = (node: Node, idx: number) => {
let itemData = this.historyData[idx];
if (!itemData) {
return;
}
let typeMap: { [key: string]: string } = {
'day': I18nManager.instance.t('Daily Ranking'),
'week': I18nManager.instance.t('Weekly Ranking'),
'month': I18nManager.instance.t('Monthly Ranking')
};
let typeLabel = typeMap[itemData.Type] || itemData.Type;
node.getChildByName('Activity').getComponent(Label).string = typeLabel;
node.getChildByName('ActivityTime').getComponent(Label).string = itemData.Date;
node.getChildByName('Rank').getChildByName('sp_1').active = itemData.Rank === 1;
node.getChildByName('Rank').getChildByName('sp_2').active = itemData.Rank === 2;
node.getChildByName('Rank').getChildByName('sp_3').active = itemData.Rank === 3;
node.getChildByName('Rank').getChildByName('rankLab').active = itemData.Rank >= 4;
node.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = itemData.Rank.toString();
node.getChildByName('Win').getComponent(Label).string = itemData.Rewards.toString();
let received = node.getChildByName('HasReceived').getChildByName('received');
let unReceived = node.getChildByName('HasReceived').getChildByName('unReceived');
received.active = true;
unReceived.active = false;
}
this.rewardHistoryListVScroll.refreshList(this.historyData);
}
// ==================== 按钮事件 ====================
onClickCloseBtn() {
AudioManager.instance.playSFX("Common_Button_Click");
this.onBack?.call(null);
}
onDestroy() {
if (this.closeBtn) {
this.closeBtn.off(Node.EventType.TOUCH_END, this.onClickCloseBtn, this);
}
}
}