ClubView.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. import { AppKernel } from '@scripts/app/AppKernel';
  2. import { UIViewID } from '@scripts/define/UIDefine';
  3. import { VipRights } from '@scripts/define/VipDeine';
  4. import { UICloseReason } from '@scripts/framework/ui/UILayer';
  5. import { UIView } from '@scripts/framework/ui/UIView';
  6. import { formatCurrency, formatGoodsNum } from '@scripts/utils/Helper';
  7. import { setSpriteFrame } from '@scripts/utils/ResHelper';
  8. import { CountdownTimer, formatTimes } from '@scripts/utils/TimesHelper';
  9. import { addBtnClick, addTogClick, ImgFitMode, setAsLastSibling } from '@scripts/utils/UIHelper';
  10. import { formatVipRights, getVipLbTitle as getVipLvTitle, getVipLvIcon, getVipName, getVipRightsIcon, getVipRightsName, isUnlockedRights } from '@scripts/utils/VipHelper';
  11. import { _decorator, Button, Component, find, instantiate, Label, Mask, Node, ProgressBar, ScrollView, Sprite, SpriteFrame, Toggle, ToggleContainer, UITransform, v2 } from 'cc';
  12. const { ccclass, property } = _decorator;
  13. class VipTabNode {
  14. toggle: Toggle;
  15. constructor(readonly node: Node) {
  16. this.toggle = node.getComponent(Toggle);
  17. }
  18. }
  19. class RightsNode {
  20. res: string;
  21. icon: Sprite;
  22. lblBonus: Label;
  23. lblName: Label;
  24. lblUnlock: Label;
  25. unlockNode: Node;
  26. constructor(readonly node: Node) {
  27. this.icon = find("sptIcon", node).getComponent(Sprite);
  28. this.lblBonus = find("lblBonus", node).getComponent(Label);
  29. this.lblName = find("lblName", node).getComponent(Label);
  30. this.unlockNode = find("unlockNode", node);
  31. this.lblUnlock = find("unlockNode/lblUnlock", node).getComponent(Label);
  32. }
  33. }
  34. class RewardNode {
  35. lblValue: Label;
  36. icon: Sprite;
  37. constructor(readonly node: Node) {
  38. this.icon = find("sptIcon", node).getComponent(Sprite);
  39. this.lblValue = find("lblValue", node).getComponent(Label);
  40. }
  41. }
  42. @ccclass('ClubView')
  43. export class ClubView extends UIView {
  44. readonly viewId: UIViewID = UIViewID.ClubView;
  45. @property(Node)
  46. btnBack: Node;
  47. @property(Node)
  48. btnRule: Node;
  49. @property(Node)
  50. btnBirthday: Node;
  51. @property(ScrollView)
  52. tabScroll: ScrollView;
  53. @property(Node)
  54. tabItem: Node;
  55. @property(ScrollView)
  56. contentScroll: ScrollView;
  57. @property(Node)
  58. contentItem: Node;
  59. @property(Sprite)
  60. smallVipSp: Sprite;
  61. @property(Label)
  62. lblProgress: Label;
  63. @property(ProgressBar)
  64. lvProgressBar: ProgressBar;
  65. @property(Label)
  66. lblUpgradeTips: Label;
  67. @property(Label)
  68. lblExp: Label;
  69. @property(Label)
  70. lblExpTotal: Label;
  71. @property(Sprite)
  72. vipTitle: Sprite;
  73. @property(Label)
  74. lblVipDesc: Label;
  75. @property(Label)
  76. lblEnds: Label;
  77. @property(Sprite)
  78. vipIcon: Sprite;
  79. @property(Button)
  80. btnClaim: Button;
  81. @property(Node)
  82. scNode: Node;
  83. @property(Node)
  84. gcNode: Node;
  85. @property(Node)
  86. propNode: Node;
  87. private m_VipTabs: VipTabNode[] = [];
  88. private m_RightsNode: RightsNode[] = [];
  89. private m_ScReward: RewardNode;
  90. private m_GcReward: RewardNode;
  91. private m_PropReward: RewardNode;
  92. private m_Timer: CountdownTimer = new CountdownTimer();
  93. protected onCreate() {
  94. addBtnClick(this.btnBack, this.closeSelf, this);
  95. addBtnClick(this.btnRule, this.onBtnRuleClick, this);
  96. addBtnClick(this.btnBirthday, this.onBtnBirthdayClick, this);
  97. addBtnClick(this.btnClaim, this.onBtnClaimClick, this);
  98. this.m_ScReward = new RewardNode(this.scNode);
  99. this.m_GcReward = new RewardNode(this.gcNode);
  100. this.m_PropReward = new RewardNode(this.propNode);
  101. AppKernel.events.on('club:update', this.updateUserInfo, this);
  102. }
  103. private onBtnRuleClick() {
  104. AppKernel.ui.open(UIViewID.UIClubRules);
  105. }
  106. private onBtnBirthdayClick() {
  107. AppKernel.ui.open(UIViewID.UIBirthdayGift);
  108. }
  109. private onVipTabClick(toggle: Toggle) {
  110. if (!toggle.isChecked) return;
  111. const index = toggle['_customData'];
  112. this.updateContent(index);
  113. }
  114. protected async onBeforeOpen(_params: unknown) {
  115. const vipStore = AppKernel.stores.vipStore;
  116. let vipConfig = vipStore.vipConfig;
  117. if (!vipConfig) {
  118. await vipStore.reqVipConfig();
  119. };
  120. }
  121. protected onOpen(_params: unknown) {
  122. const vipConfig = AppKernel.stores.vipStore.vipConfig;
  123. if (!vipConfig) return;
  124. this.initVipTabs(AppKernel.stores.vipStore.maxVip);
  125. this.updateUserInfo();
  126. }
  127. protected onClose(_reason: UICloseReason) {
  128. this.m_Timer.stop();
  129. }
  130. private initVipTabs(max: number) {
  131. const vipConfig = AppKernel.stores.vipStore.vipConfig;
  132. const vipIndex = vipConfig.vipLevel - 1;
  133. for (let i = 0; i < max; i++) {
  134. let tabNode = this.m_VipTabs[i];
  135. if (!tabNode) {
  136. const itemNode = instantiate(this.tabItem);
  137. itemNode.setParent(this.tabScroll.content);
  138. tabNode = this.m_VipTabs[i] = new VipTabNode(itemNode);
  139. }
  140. tabNode.node.active = true;
  141. tabNode.toggle['_customData'] = i;
  142. tabNode.toggle.isChecked = i === vipIndex;
  143. if (tabNode.toggle.isChecked) this.onVipTabClick(tabNode.toggle);
  144. addTogClick(tabNode.toggle, this.onVipTabClick, this);
  145. const sptIcon = find("sptIcon", tabNode.node).getComponent(Sprite);
  146. setSpriteFrame(sptIcon, `textures/club/tabs/clublist_btn_lv0${i + 1}_n`);
  147. const checkMark = tabNode.toggle['_checkMark'];
  148. if (checkMark) setSpriteFrame(checkMark, `textures/club/tabs/clublist_btn_lv0${i + 1}_s`);
  149. if (i === max - 1) {
  150. const sptLine = find("sptLine", tabNode.node);
  151. if (sptLine) sptLine.active = false;
  152. }
  153. }
  154. this.tabScroll.scrollTo(v2(vipIndex / (max - 1), 0), 0.1, false);
  155. for (let i = max; i < this.m_VipTabs.length; i++) {
  156. this.m_VipTabs[i].node.active = false;
  157. }
  158. }
  159. private updateContent(vipIdx: number) {
  160. const vipStore = AppKernel.stores.vipStore;
  161. let nodeIdx = 0;
  162. let lockedNodes: Node[] = [];
  163. for (let right = VipRights.UpgradePoint; right < VipRights.Total; ++right) {
  164. let rightNode = this.m_RightsNode[nodeIdx];
  165. if (!rightNode) {
  166. const nodeItem = instantiate(this.contentItem);
  167. nodeItem.setParent(this.contentScroll.content);
  168. rightNode = this.m_RightsNode[nodeIdx] = new RightsNode(nodeItem);
  169. }
  170. const value = vipStore.getVipRights(vipIdx, right);
  171. rightNode.lblBonus.string = formatVipRights(right, value);
  172. rightNode.lblName.string = getVipRightsName(right);
  173. const icon = getVipRightsIcon(right);
  174. if (rightNode.res !== icon) {
  175. rightNode.res = icon;
  176. setSpriteFrame(rightNode.icon, icon);
  177. }
  178. const locked = !isUnlockedRights(value);
  179. rightNode.unlockNode.active = locked;
  180. if (locked) {
  181. lockedNodes.push(rightNode.node);
  182. const lockedLv = vipStore.getRightsUnlock(right);
  183. const vipName = getVipName(lockedLv + 1);
  184. rightNode.lblUnlock.string = AppKernel.i18n.t("vip.rights_unlocked", vipName);
  185. }
  186. setAsLastSibling(rightNode.node);
  187. rightNode.node.active = true;
  188. nodeIdx++;
  189. }
  190. lockedNodes.forEach((node) => {
  191. setAsLastSibling(node);
  192. })
  193. for (let i = nodeIdx; i < this.m_RightsNode.length; ++i) {
  194. this.m_RightsNode[i].node.active = false;
  195. }
  196. }
  197. private updateUserInfo() {
  198. const vipStore = AppKernel.stores.vipStore;
  199. const vipConfig = vipStore.vipConfig;
  200. const vipLv = vipConfig.vipLevel;
  201. const points = vipConfig.clubPoints;
  202. const nextPoints = vipStore.getUpgradePoints(vipLv - 1);
  203. const isMax = vipLv === AppKernel.stores.vipStore.maxVip;
  204. const now_lv_name = getVipName(vipLv);
  205. const next_lv_name = getVipName(vipLv + 1, isMax);
  206. this.lblProgress.string = `${now_lv_name} - ${next_lv_name}`;
  207. this.lvProgressBar.progress = points / nextPoints;
  208. this.lblExp.string = formatCurrency(points);
  209. this.lblExpTotal.string = "/" + formatCurrency(nextPoints);
  210. const expDiff = nextPoints - points;
  211. const tips = AppKernel.i18n.t("vip.upgrade_tips", formatCurrency(expDiff));
  212. this.lblUpgradeTips.string = expDiff <= 0 ? "" : tips;
  213. const res = getVipLvIcon(vipLv);
  214. setSpriteFrame(this.smallVipSp, res);
  215. setSpriteFrame(this.vipIcon, res);
  216. setSpriteFrame(this.vipTitle, getVipLvTitle(vipLv));
  217. const weekly = vipStore.getVipRights(vipLv - 1, VipRights.WeeklyBonus);
  218. const store = vipStore.getVipRights(vipLv - 1, VipRights.StoreExtra);
  219. const desc = AppKernel.i18n.t("vip.vip_desc", vipLv, weekly, store);
  220. this.lblVipDesc.string = desc;
  221. const weekly_bonus = vipConfig.rewards.weekly_bonus;
  222. this.btnClaim.interactable = weekly_bonus.claimable;
  223. if (weekly_bonus.reward) {
  224. this.m_ScReward.node.active = weekly_bonus.reward.sc > 0;
  225. this.m_GcReward.node.active = weekly_bonus.reward.gc > 0;
  226. this.m_PropReward.node.active = weekly_bonus.reward.clubpoint > 0;
  227. this.m_ScReward.lblValue.string = formatGoodsNum(weekly_bonus.reward.sc);
  228. this.m_GcReward.lblValue.string = formatGoodsNum(weekly_bonus.reward.gc);
  229. this.m_PropReward.lblValue.string = formatCurrency(weekly_bonus.reward.clubpoint);
  230. }
  231. this.lblEnds.string = "";
  232. this.m_Timer.start(weekly_bonus.countdownSeconds, (left) => {
  233. this.lblEnds.string = AppKernel.i18n.t("vip.ends_in", formatTimes(left));
  234. });
  235. const birthday_gift = vipConfig.rewards.birthday_gift;
  236. this.btnBirthday.active = birthday_gift.claimable;
  237. }
  238. private async onBtnClaimClick() {
  239. AppKernel.ui.loading(true);
  240. const res = await AppKernel.stores.vipStore.reqVipClaim('weekly_bonus');
  241. if (res) {
  242. //更新
  243. }
  244. AppKernel.ui.loading(false);
  245. }
  246. }