462 lines
13 KiB
TypeScript
462 lines
13 KiB
TypeScript
import { _decorator, Button, Color, Component, EventHandler, EventMouse, instantiate, isValid, JsonAsset, Label, math, Node, Prefab, ScrollView, sp, tween, UITransform, Vec3 } from 'cc';
|
||
import { getCsymbol, getHistory, getHistoryDetails, getLanguage } from '../../../Loading/scripts/comm';
|
||
import { fixNum, getTimezoneOffsetString, getTranslate, hideAllChildren, hideToBottom, isBrahmic, showAllChildren, updateLang } from './Tools';
|
||
const { ccclass, property } = _decorator;
|
||
|
||
enum HISTORY_TYPE {
|
||
TODAY,
|
||
LAST7,
|
||
}
|
||
|
||
@ccclass('History')
|
||
export class History extends Component {
|
||
|
||
@property(JsonAsset)
|
||
langJson: JsonAsset | null = null;
|
||
|
||
/**loading 动画节点*/
|
||
@property(Node)
|
||
loading: Node = null
|
||
|
||
@property(Node)
|
||
sel_pnl: Node = null;
|
||
|
||
@property(Node)
|
||
pnl_title: Node = null;
|
||
|
||
@property(Node)
|
||
item_list: Node = null;
|
||
|
||
@property(ScrollView)
|
||
scrollView: ScrollView = null;
|
||
|
||
@property(Prefab)
|
||
history_detail: Prefab = null;
|
||
|
||
@property(Node)
|
||
node_detail: Node = null;
|
||
|
||
todayStart = null
|
||
todayEnd = null
|
||
last7Start = null
|
||
last7End = null
|
||
lastID = null
|
||
|
||
holdOn = false
|
||
finish = false
|
||
|
||
sel_idx: HISTORY_TYPE = HISTORY_TYPE.TODAY
|
||
|
||
DataArr: any[]
|
||
|
||
dict = null
|
||
scrollSpeed = 1;
|
||
|
||
onLoad(): void {
|
||
this.dict = this.langJson.json[getLanguage()] ?? this.langJson.json["en"];
|
||
|
||
this.item_list.active = false
|
||
this.sel_pnl.active = false
|
||
this.loading.active = true
|
||
this.holdOn = false
|
||
this.finish = false
|
||
|
||
this.showLoading()
|
||
|
||
this.clickTodayList()
|
||
|
||
this.node.on("hide_history_loading", this.hideLoading, this);
|
||
this.scrollView.node.on('scrolling', this.onScrolling, this);
|
||
this.scrollView.node.on(Node.EventType.MOUSE_WHEEL, this.onMouseWheel, this);
|
||
}
|
||
|
||
protected onDisable(): void {
|
||
this.node.off("hide_history_loading", this.hideLoading, this)
|
||
this.scrollView.node.off('scrolling', this.onScrolling, this);
|
||
this.scrollView.node.off(Node.EventType.MOUSE_WHEEL, this.onMouseWheel, this);
|
||
}
|
||
|
||
|
||
start() {
|
||
this.updateLang()
|
||
}
|
||
|
||
/*更新语言*/
|
||
updateLang() {
|
||
|
||
// let labelArr = []
|
||
// getAllLabels(this.node, labelArr);
|
||
|
||
// labelArr.forEach((label, i) => {
|
||
// console.log(`label.node.name: ${label.node.name}`)
|
||
|
||
// const staticTxt = label.node.getComponent(StaticTxt)
|
||
|
||
// let key = staticTxt?.key
|
||
// if (this.dict[key]) {
|
||
// label.string = this.dict[key]
|
||
// // label.updateRenderData()
|
||
// }
|
||
// })
|
||
|
||
updateLang(this.node, this.dict, getLanguage())
|
||
|
||
const txt_time = this.pnl_title.getChildByName("txt_time").getComponent(Label)
|
||
txt_time.string = `${this.dict["Time"]} \n ${getTimezoneOffsetString()}`
|
||
|
||
const txt_bet = this.pnl_title.getChildByName("txt_bet").getComponent(Label)
|
||
txt_bet.string = `${this.dict["Bet"]}(${getCsymbol()})`
|
||
|
||
const txt_profit = this.pnl_title.getChildByName("txt_profit").getComponent(Label)
|
||
txt_profit.string = `${this.dict["Profit"]}(${getCsymbol()})`
|
||
|
||
}
|
||
|
||
showLoading() {
|
||
this.loading.active = true
|
||
let sk = this.loading.getComponent(sp.Skeleton)
|
||
sk.paused = false
|
||
sk.loop = true
|
||
}
|
||
|
||
hideLoading() {
|
||
let sk = this.loading.getComponent(sp.Skeleton)
|
||
sk.paused = true
|
||
sk.loop = false
|
||
|
||
this.loading.active = false
|
||
|
||
}
|
||
|
||
clearContent() {
|
||
this.scrollView.content.destroyAllChildren()
|
||
}
|
||
|
||
|
||
|
||
|
||
async getHistoryList(startTime, endTime, lastID) {
|
||
|
||
let res = await getHistory({
|
||
GameId: "rp_11001",
|
||
StartTime: startTime,
|
||
EndTime: endTime,
|
||
LastId: lastID
|
||
})
|
||
|
||
if (!isValid(this.node, true)) {
|
||
return
|
||
}
|
||
|
||
if (!res) {
|
||
res = []
|
||
}
|
||
|
||
this.unschedule(this.cancelHoldOn)
|
||
this.holdOn = false
|
||
|
||
|
||
// 没有历史记录提示
|
||
let isActive = res.length == 0 && this.scrollView.content.children.length == 0
|
||
let Label_NoHistoryTip = this.node.getChildByName("Label_NoHistoryTip")
|
||
Label_NoHistoryTip.active = isActive
|
||
|
||
// 已全部加载提示,拿到的数据小于50条就证明拿完了
|
||
isActive = res.length < 50 && this.scrollView.content.children.length != 0
|
||
let Label_AllRecordDisplayed = this.scrollView.content.parent.getChildByName("Label_AllRecordDisplayed")
|
||
Label_AllRecordDisplayed.active = isActive
|
||
|
||
// 加载更多提示,一次最多能拿50条
|
||
isActive = res.length == 50
|
||
let Label_LoadMore = this.scrollView.content.parent.getChildByName("Label_LoadMore")
|
||
Label_LoadMore.active = isActive
|
||
|
||
|
||
if (res.length == 0 && this.scrollView.content.children.length > 0) {
|
||
this.finish = true
|
||
Label_AllRecordDisplayed.active = true
|
||
Label_LoadMore.active = false
|
||
}
|
||
|
||
this.hideLoading()
|
||
|
||
if (res.length == 0) {
|
||
// do nothing
|
||
return
|
||
}
|
||
|
||
this.loadListData(res)
|
||
|
||
return res
|
||
}
|
||
|
||
clickTodayList() {
|
||
this.sel_pnl.active = false
|
||
|
||
this.finish = false
|
||
this.scrollView.content.destroyAllChildren()
|
||
|
||
this.sel_idx = HISTORY_TYPE.TODAY
|
||
|
||
const txt_type = this.pnl_title.getChildByName("txt_type").getComponent(Label)
|
||
txt_type.string = getTranslate(this.dict, "Today")
|
||
|
||
const now = new Date();
|
||
const zeroDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
||
|
||
const todayZeroTimestampSeconds = Math.floor(zeroDate.getTime() / 1000);
|
||
const nowSeconds = Math.floor(now.getTime() / 1000);
|
||
|
||
this.todayStart = todayZeroTimestampSeconds
|
||
this.todayEnd = nowSeconds
|
||
this.lastID = null
|
||
|
||
this.getHistoryList(todayZeroTimestampSeconds, nowSeconds, this.lastID)
|
||
}
|
||
|
||
clickLast7() {
|
||
|
||
this.sel_pnl.active = false
|
||
|
||
this.finish = false
|
||
this.scrollView.content.destroyAllChildren()
|
||
|
||
this.sel_idx = HISTORY_TYPE.LAST7
|
||
const txt_type = this.pnl_title.getChildByName("txt_type").getComponent(Label)
|
||
txt_type.string = this.dict["Last 7 days"]
|
||
|
||
const now = new Date();
|
||
// 当前时间减去 6 天(6 * 24 * 60 * 60 * 1000 毫秒)
|
||
const sevenDaysAgo = new Date(now.getTime() - 6 * 24 * 60 * 60 * 1000);
|
||
// 设置时间为 0 点
|
||
// sevenDaysAgo.setHours(0, 0, 0, 0);
|
||
|
||
const last7ZeroTimestampSeconds = Math.floor(sevenDaysAgo.getTime() / 1000);
|
||
|
||
const nowSeconds = Math.floor(now.getTime() / 1000);
|
||
|
||
this.last7Start = last7ZeroTimestampSeconds
|
||
this.last7End = nowSeconds
|
||
|
||
this.lastID = null
|
||
this.getHistoryList(last7ZeroTimestampSeconds, nowSeconds, this.lastID)
|
||
|
||
|
||
|
||
}
|
||
|
||
loadListData(res) {
|
||
|
||
if (this.lastID == null) {
|
||
this.scrollView.content.destroyAllChildren()
|
||
this.DataArr = []
|
||
}
|
||
|
||
// 记录一次本次请求中最后一次spin的 roundId
|
||
if (res.length > 0) {
|
||
this.lastID = res[res.length - 1].roundId
|
||
}
|
||
|
||
this.scrollView.content.active = true
|
||
|
||
res.forEach((data, idx) => {
|
||
const item = instantiate(this.item_list)
|
||
item.active = true
|
||
|
||
/*
|
||
balance: 100000001580500
|
||
bet: 10000
|
||
currency: "THB"
|
||
currencySymbol: "฿"
|
||
endTime: 1759040624
|
||
isBuy: false
|
||
mode: 0
|
||
panDetails: [{…}]
|
||
roundId: "68d8d470908480f75bcc34a8"
|
||
startTime: 1759040624
|
||
win: 0
|
||
*/
|
||
|
||
this.DataArr[data.roundId] = data;
|
||
|
||
|
||
// name 当标签用
|
||
item.name = data.roundId
|
||
|
||
|
||
// time
|
||
let time = new Date(data.startTime * 1000)
|
||
const pad = (n: number) => (n < 10 ? '0' + n : String(n));
|
||
let str = `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())} ` + "\n"
|
||
+ `${pad(time.getMonth() + 1)}/${pad(time.getDate())}`;
|
||
item.getChildByName("txt_time").getComponent(Label).string = str
|
||
|
||
// "transaction"
|
||
item.getChildByName("layout_transaction").getChildByName("txt_transaction").getComponent(Label).string = data.roundId
|
||
item.getChildByName("layout_transaction").getChildByName("sp_icon").active = data.mode == 1
|
||
|
||
// Bet
|
||
item.getChildByName("txt_bet").getComponent(Label).string = fixNum(data.bet)
|
||
|
||
// profit : 1267000
|
||
item.getChildByName("txt_profit").getComponent(Label).string = fixNum(data.win - data.bet)
|
||
// profit 大于0 高亮白
|
||
if (data.win - data.bet > 0) {
|
||
item.getChildByName("txt_profit").getComponent(Label).color = new Color(0xFF, 0xFF, 0xFF, 255);
|
||
} else {
|
||
}
|
||
|
||
let btn = item.getChildByName("btn")
|
||
btn.active = true
|
||
|
||
// btn.getComponent(Button).normalColor = "#343440"
|
||
// btn.getComponent(Button).normalColor = "#30303D"
|
||
|
||
|
||
if (idx % 2 == 0) {
|
||
btn.getComponent(Button).normalColor = new Color(0x34, 0x34, 0x40, 255);
|
||
} else {
|
||
btn.getComponent(Button).normalColor = new Color(0x30, 0x30, 0x3D, 255);
|
||
}
|
||
|
||
|
||
|
||
// // 添加点击事件
|
||
const clickEventHandler = new EventHandler();
|
||
clickEventHandler.target = this.node;
|
||
clickEventHandler.component = 'History';
|
||
clickEventHandler.handler = 'clickItem';
|
||
clickEventHandler.customEventData = data.roundId
|
||
const button = btn.getComponent(Button);
|
||
button.clickEvents.push(clickEventHandler);
|
||
|
||
this.scrollView.content.addChild(item)
|
||
});
|
||
|
||
this.refreshVisibleZone(this.scrollView.getScrollOffset())
|
||
}
|
||
|
||
cancelHoldOn() {
|
||
this.holdOn = false
|
||
}
|
||
|
||
onScrolling(scrollView: ScrollView) {
|
||
|
||
const offset = this.scrollView.getScrollOffset();
|
||
const maxOffset = this.scrollView.getMaxScrollOffset();
|
||
|
||
this.refreshVisibleZone(scrollView.getScrollOffset())
|
||
|
||
if (this.finish) {
|
||
return
|
||
}
|
||
|
||
if (this.holdOn) {
|
||
// console.log("请求过于频繁")
|
||
return
|
||
}
|
||
|
||
|
||
|
||
if (offset.y >= maxOffset.y - 5) {
|
||
this.holdOn = true
|
||
this.scheduleOnce(this.cancelHoldOn, 5)
|
||
|
||
if (this.sel_idx == HISTORY_TYPE.TODAY) {
|
||
this.getHistoryList(this.todayStart, this.todayEnd, this.lastID)
|
||
} else {
|
||
this.getHistoryList(this.last7Start, this.last7End, this.lastID)
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
hideSelPnl() {
|
||
this.sel_pnl.active = false
|
||
}
|
||
|
||
showSelPnl() {
|
||
|
||
const Label_Today = this.sel_pnl.getChildByName("btn_today").getChildByName("Label_Today").getComponent(Label)
|
||
const Label_last7 = this.sel_pnl.getChildByName("btn_last7").getChildByName("Label_last7").getComponent(Label)
|
||
|
||
const yellowColor = new Color(0xFF, 0xAE, 0x00)
|
||
const grayColor = new Color(0xAC, 0xAC, 0xB1)
|
||
|
||
Label_Today.color = this.sel_idx == HISTORY_TYPE.TODAY ? yellowColor : Color.WHITE
|
||
Label_last7.color = this.sel_idx == HISTORY_TYPE.LAST7 ? yellowColor : Color.WHITE
|
||
|
||
this.sel_pnl.active = true
|
||
}
|
||
|
||
clickCloseHistory() {
|
||
const destroyFunc = () => { this.node.destroy() }
|
||
hideToBottom(this.node, destroyFunc)
|
||
}
|
||
|
||
|
||
|
||
async clickItem(event: Event, roundId: string) {
|
||
|
||
// console.log("clickItem, roundId = ", roundId)
|
||
|
||
const history_detail = instantiate(this.history_detail)
|
||
this.node_detail.addChild(history_detail)
|
||
let data = await getHistoryDetails({
|
||
GameId: "rp_11001",
|
||
Id: roundId
|
||
})
|
||
const comp = history_detail.getComponent("HistoryDetail") as any
|
||
comp.setDetailData(data, getLanguage())
|
||
|
||
const self = this
|
||
history_detail.position = new Vec3(1080, 0)
|
||
tween(history_detail).to(0.2, { position: new Vec3(0, 0) })
|
||
.call(() => {
|
||
self.scheduleOnce(() => { comp.entryFinish() })
|
||
})
|
||
.start()
|
||
|
||
}
|
||
|
||
|
||
// 只显示上下相邻的区域,远离view 窗口的content内容都隐藏掉
|
||
refreshVisibleZone(offset: math.Vec2) {
|
||
|
||
let height = this.scrollView.node.getChildByName("view").getComponent(UITransform).height
|
||
|
||
this.scrollView.content.children.forEach((child, idx) => {
|
||
let pos = child.position
|
||
|
||
let res = Math.abs(-offset.y - pos.y)
|
||
|
||
if (Math.abs(-offset.y - pos.y) < (height + 200)) {
|
||
// child.active = true
|
||
showAllChildren(child)
|
||
|
||
} else {
|
||
// child.active = false
|
||
hideAllChildren(child)
|
||
}
|
||
})
|
||
}
|
||
|
||
onMouseWheel(event: EventMouse) {
|
||
|
||
// console.log("鼠标滚动")
|
||
|
||
// deltaY > 0:向下滚;deltaY < 0:向上滚
|
||
const delta = event.getScrollY() * this.scrollSpeed;
|
||
|
||
// 获取当前滚动位置
|
||
const offset = this.scrollView.getScrollOffset();
|
||
|
||
let vec2 = offset.add2f(0, -delta)
|
||
this.refreshVisibleZone(vec2)
|
||
// 更新纵向滚动
|
||
this.scrollView.scrollToOffset(vec2, 0.1, true);
|
||
}
|
||
|
||
}
|
||
|