Files
18xchat/assets/Scripts/chat18x/ui/panels/PurchasePanel.ts
T
2025-09-18 16:19:45 +08:00

225 lines
7.0 KiB
TypeScript

import { _decorator, Component, Label, Node } from "cc";
import li_BaseView from "../../../Main/Common/li_BaseView";
import Utils from "../../../Main/Common/Utils";
import { GButton } from "../../../Main/Common/GButton";
import { PurchasePanelItem } from "../../uiitems/PurchasePanelItem";
import LanguageUtils from "../../../Main/Common/LanguageUtils";
import { InnerMsgCode } from "../../../Main/Config/InnerMsgCode";
import { DataManager, DataId } from "../../data/DataManager";
import { WalletData } from "../../data/WalletData";
import { ShopData } from "../../data/ShopData";
import { GirlData } from "../../data/GirlData";
import { ShopService } from "db://assets/Scripts/chat18x/network/services/ShopService";
import { PaymentService } from "db://assets/Scripts/chat18x/payment/PaymentService";
import proto from "db://assets/Scripts/proto/proto.pb.js";
import { NavigationManager } from "../../manager/NavigationManager";
const { ccclass, property } = _decorator;
@ccclass("PurchasePanel")
export class PurchasePanel extends li_BaseView {
private _nodeTab: any = {};
private coinNum: Label;
private vipLeftTime: Label;
private vipPrice7: Label;
private vipTime7: Label;
private vipPrice30: Label;
private vipTime30: Label;
@property([PurchasePanelItem])
public items: PurchasePanelItem[] = [];
onLoadCT(): void {
Utils.parseNode(this.node, this._nodeTab);
this.coinNum = this._nodeTab.coinNum.getComponent(Label);
this.vipLeftTime = this._nodeTab.vipText.getComponent(Label);
this.vipPrice7 = this._nodeTab.vipPrice7.getComponent(Label);
this.vipTime7 = this._nodeTab.vipTime7.getComponent(Label);
this.vipPrice30 = this._nodeTab.vipPrice30.getComponent(Label);
this.vipTime30 = this._nodeTab.vipTime30.getComponent(Label);
this.bandBtn();
//订阅商业化数据事件
Utils.addInnerEL(InnerMsgCode.BalanceChange, this, () => {
this.onBalanceChange();
});
Utils.addInnerEL(InnerMsgCode.VipExpireChange, this, () => {
this.onVipExpireChange();
});
for (let index = 0; index < this.items.length; index++) {
const element = this.items[index];
element.init(this);
}
this.Show();
}
bandBtn() {
GButton.BandClick(
this._nodeTab.Buy7DayVipBt,
() => {
// 购买7天会员
const shopData = DataManager.I.getDataById<ShopData>(DataId.Shop);
const memberId = shopData.get7DayMemberId();
this.reqBuyGood(memberId);
},
this
);
GButton.BandClick(
this._nodeTab.Buy30DayVipBtn,
() => {
// 购买30天会员
const shopData = DataManager.I.getDataById<ShopData>(DataId.Shop);
const memberId = shopData.get30DayMemberId();
this.reqBuyGood(memberId);
},
this
);
GButton.BandClick(
this._nodeTab.ReturnBtn,
() => {
this.onClose();
// NavigationPanel 始终显示,不需要显示 DefaultView
},
this
);
}
async Show() {
// 请求商城数据
const reqData = {};
let res = await ShopService.I.reqShopList(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
// 保存数据
const shopData = DataManager.I.getDataById<ShopData>(DataId.Shop);
shopData.goods = res.data;
// 根据数据,刷新界面
this.updateView();
this.updateShops();
}
}
shopData: ShopData;
updateView() {
this.getPlayerMerData();
this.shopData = DataManager.I.getDataById<ShopData>(DataId.Shop);
// VIP会员
const memberId7 = this.shopData.get7DayMemberId();
const price7 = this.shopData.getOriginalPriceById(memberId7);
this.vipPrice7.string = `$ ${price7}`;
const memberId30 = this.shopData.get30DayMemberId();
const price30 = this.shopData.getOriginalPriceById(memberId30);
this.vipPrice30.string = `$ ${price30}`;
}
// 0:cash 1:web3
updateShops(type: number = 0) {
// 充值商品 缺:分开获取现金充值或者web3币充值
const rechargeIds = this.shopData.getRechargeIds();
for (let index = 0; index < this.items.length; index++) {
const element = this.items[index];
element.refresh(rechargeIds[index]);
}
}
setDiamondTag(id: number) {
const shopData = DataManager.I.getDataById<ShopData>(DataId.Shop);
const isRechargeId = shopData.isRechargeId(id);
if (isRechargeId) {
// 需要外部支付进行购买
this.startPayment(id, proto.cs.EnmPayType.EPT_Cash_INR, 0);
} else {
//是u币充值,打开页面
NavigationManager.Instance.openSubPanel("Web3PopPanel", this.node);
}
}
getPlayerMerData() {
//todo: 获取服务器玩家商业化数据
this.refreshCoinNum();
this.refreshVipExpire();
}
onBalanceChange() {
this.refreshCoinNum();
}
// 刷新余额
private refreshCoinNum() {
const walletData = DataManager.I.getDataById<WalletData>(DataId.Wallet);
const balance = walletData.getOriginalBalance();
this.coinNum.string = balance.toString();
}
onVipExpireChange() {
this.refreshVipExpire();
}
// 刷新 vip失效时间戳
private refreshVipExpire() {
const walletData = DataManager.I.getDataById<WalletData>(DataId.Wallet);
const vipExpire = walletData.vipExpire;
const leftTime = Utils.formatVipLeftTime(vipExpire);
this.vipLeftTime.string = LanguageUtils.getText(
"purchasepanel.vip_left"
).replace("${leftTime}", leftTime);
}
// 使用余额购买商品
async reqBuyGood(goodId: number) {
// 请求购买商品
const reqData = {
goodId: goodId,
girlId: 0,
};
let res = await ShopService.I.reqBuyGood(reqData);
console.log("请求使用余额购买商品的响应数据:", res);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
const resData = res.data;
// 保存数据
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const walletData = DataManager.I.getDataById<WalletData>(DataId.Wallet);
walletData.balance = Number(resData.balance);
walletData.vipExpire = Number(resData.vipExpire);
// 刷新界面
}
}
// 创建订单
async startPayment(goodId: number, payType: number, network: number) {
// 请求数据
const reqData = {
goodId,
payType,
network,
};
let res = await PaymentService.I.startPayment(reqData);
console.log("支付完成的响应数据:", res);
if (res) {
let status = res.status;
if (status === -1) {
console.log("支付失败!!!,错误码:", res.retCode);
} else if (status === 0) {
console.log("支付成功!!!");
const walletData = DataManager.I.getDataById<WalletData>(DataId.Wallet);
walletData.balance = Number(res.balance);
walletData.vipExpire = Number(res.vipExpire);
}
}
}
onClickCashBtn() {
this.updateShops(0);
}
onClickWeb3Btn() {
this.updateShops(1);
}
onDestroy() {
Utils.removeInnerEL(InnerMsgCode.BalanceChange, this, () => {});
Utils.removeInnerEL(InnerMsgCode.VipExpireChange, this, () => {});
super.onDestroy();
}
}