{"version":3,"sources":["webpack:///../web-slot-module/vue-module/setting/index.js","webpack:///../web-slot-module/vue-module/promotion/index.js","webpack:///../web-slot-module/utils/index.js","webpack:///../web-slot-module/vue-module/app/index.js","webpack:///../web-slot-module/utils/validate.js","webpack:///../web-slot-module/vue-module/bet-record/index.js","webpack:///../web-slot-module/vue-module/content-box/index.js","webpack:///../web-slot-module/utils/track.js","webpack:///../web-slot-module/utils/socket.js","webpack:///../web-slot-module/utils/veeValidate/customRules/base/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/Login/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/Register/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/ForgotPassword/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/ChangePassword/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/Deposit/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/Withdraw/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/BindAccount/index.js","webpack:///../web-slot-module/utils/veeValidate/customRules/DetailInfo/index.js","webpack:///../web-slot-module/vue-module/login/index.js","webpack:///../web-slot-module/vue-module/lobby/index.js","webpack:///../web-slot-module/vue-module/detail-info/index.js","webpack:///../web-slot-module/vue-module/index.js","webpack:///../web-slot-module/utils/request.js","webpack:///../web-slot-module/vue-module/otp-vertify/index.js","webpack:///../web-slot-module/utils/Decimal.js"],"names":["inject","name","props","title","type","String","default","dialogName","show","Boolean","itemObject","Object","Array","computed","isLoading","this","$store","getters","isMemberInfoLoading","appVersion","Version","musicEnable","state","app","isBGMEnable","langOptions","langData","map","lang","value","Code","label","Name","MemberInfoData","MemberInfo","data","result","dialog","changePassword","locale","canSubScribe","$nextTick","async","checkToken","getLanguage","getMemberInfo","device","getMobile","getSubscriptionState","then","console","log","isPushEnabled","isOptedOut","window","OneSignal","on","isSubscribed","methods","Token","openDialog","close","langShow","$emit","entry","action","playSound","$track","event_category","event_label","memberInfo","referrer","bindAccount","Invite","confirm","From","To","closeDialog","changeLanguage","location","reload","logout","AccountBind","FbBind","logoutAction","$t","confirmButtonText","cancelButtonText","showClose","closeOnClickModal","closeOnPressEscape","catch","commit","dispatch","faceBookLogout","href","formData","ErrorCode","Data","API","Language","GetList","filter","f","Status","langCode","language","$i18n","FB","getLoginStatus","response","status","handleMusicChange","v","BGMPlay","BGMPause","Promise","all","isPushNotificationsEnabled","handleSubscribe","setSubscription","registerForPushNotifications","PromotionList","RemainingFlow","FlowPercentage","TotalFlow","activeTypeIdx","activePromotionIndex","activePromotionType","activePromotionList","promotionDetail","finished","specialOffer","isPromotionInfoShow","Authority","myInterval","countDownTimes","missionType","activePromotion","typeTitle","promotionData","watch","activeIndex","isInfoShow","handler","val","SettleWaitTime","MissionType","initTimer","isPageDataEmpty","isEmpty","MissionClassGroup","index","find","item","idx","key","keys","Number","handleIconClick","values","immediate","deep","mounted","onPromotionClearFlow","obj","MissionClass","Financial","GetActivityDeposit","PromotionGroupID","from","to","itemData","GroupID","Mission","ID","Activity","Join_Promotion","$message","success","message","dataBind","Finish_Promotion","handleIcon","includes","ImageUrl","require","IconUrl","handleImage","moneyFilter","num","$options","filters","toThousandFilter","handleBindInfo","handleDotClick","i","element","$refs","rect","getBoundingClientRect","elementCanSee","top","left","bottom","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","scrollIntoView","behavior","block","reloadTime","toFixed","clearInterval","setInterval","handleIconClass","canFinish","some","el","FinishButton","active","handleIconSrc","sliderBox","scrollTop","handleSliderClick","handleTypeTitle","promotion","parseTime","time","cFormat","arguments","length","format","date","test","parseInt","toString","Date","formatObj","y","getFullYear","m","getMonth","d","getDate","h","getHours","getMinutes","s","getSeconds","a","getDay","time_str","replace","formatTime","option","now","diff","Math","ceil","mobileDevice","navigator","userAgent","match","handleScreenlock","params","open","orientation","screenfull","isEnabled","isAndroid","request","err","setTimeout","windowsVH","style","setProperty","screen","lock","unlock","isSafari","noSleep","NoSleep","ua","iOS","webkit","iOSSafari","provide","getVersion","Mp3Player","play","pause","checkUserNotificationIsEnabled","runWebSocket","closeSocket","createjs","Sound","isYoutubePlayerShow","isRotate","appName","process","isDomainLoaded","prompt","loadedCount","deferredPrompt","isPromptShow","isSafariHintShow","isYoutubePlayerLoaded","isIosTutorialShow","defaultViewport","width","height","WebSocket","HeartsInterval","isGotVersion","isQueryChecked","isSubscribeLoading","timer","hintTimer","hintCountDown","isContentLoaded","barWidth","currentProgress","progressInterval","step","$route","newVal","oldVal","windowResize","classList","querySelector","remove","add","token","$socket","connected","connect","fetchData","userInfo","Account","FBID","dataLayer","push","ga_c_id","isRotateShow","isOpenGameWallet","isGameView","localTime","BaseTime","moment","utc","local","qs","URLSearchParams","search","ac","get","AgentCode","$router","MaintainState","checkMaintain","checkQuery","createManifest","addEventListener","windowLoading","event","preventDefault","touches","lastTouchEnd","getTime","enableNoSleep","e","handleTriggerPrompt","registerSound","beforeDestroy","removeEventListener","progress","round","atan","PI","onreadystatechange","readyState","gameType","provider","providerId","getOneSignal","standalone","IOSVideo","onloadeddata","checkCrossDay","startHintTimer","Check","res","resolve","self","isPushSupported","isPushNotificationsSupported","init","appId","safari_web_id","VUE_APP_ONE_SIGNAL_SAFARI_WEB_ID","autoResubscribe","notifyButton","enable","getUserId","Provider","APPID","PlayerID","customRequest","Notification","SubscribeHasLogin","SubscribeNoLogin","permission","showSlidedownPrompt","handleLoaded","System","CheckAgentCode","LanguageCode","LocationCode","toLowerCase","LocationID","cmd","handleDrawerClose","dismiss","handleSafariDrawerClose","uri","Domains","SocketServer","SocketManagerOptions","reconnection","reconnectionDelay","randomizationFactor","reconnectionDelayMax","timeout","autoConnect","withCredentials","auth","env","source","tn","io","emit","channel","version","SocketVersion","extension","page","pageIndex","pageSize","msg","alert","callback","disconnect","amount","reason","off","ClearSocketHearts","CheckMaintain","manifest","Manifest","start_url","origin","scope","icons","src","stringManifest","JSON","stringify","blob","Blob","manifestURL","URL","createObjectURL","manifestNode","createElement","rel","head","appendChild","currentTime","handleTutorialClose","validTrueName","str","validEmail","email","reg","validateEmoji","validateBirthday","validateContainLeastNumberAndLetter","isDataLoading","isProviderLoading","isGameTypeLoading","ProviderID","GameTypeID","PageIndex","PageSize","ProviderList","GameTypeList","table","headers","columns","TotalCount","getProviderList","getGameTypeList","ProviderOptions","ProviderName","GameTypeOptions","GameTypeIDs","GameTypeName","clearTable","setTable","fields","formatter","row","column","cellValue","Precision","divide","CurrencyRate","pagination","limit","getGameBetRecord","Game","Get_GameBetRecord","Pagination","Get_GameProviderList","GameProviderID","Get_GameTypeList","submit","isMenuExpand","gameList","GameProviderList","logo","favGames","gameFilter","GameFilter","ProviderInfo","getGameType","initGameProviderList","getGameList","Level","Type","isTop50","isFav","undefined","GetTop50Game","finally","Get_GameList","isArray","list","handleFavData","openGame","GameID","IsDemo","OpenGame","GameUrl","Orientation","query","reduce","acc","curr","findGame","game","handleAddFav","id","handleHeartClass","handleGameTypeClass","handleMenuExpand","Get_GameType","isEqual","handleGameTypeIcon","_","isString","onGameTypeClick","checkGameTypeActive","track","options","$gtag","reconnectionAttempts","install","Vue","socket","prototype","emoji","validate","i18n","t","strlength","min","max","fieldName","_value_","Amount","required","IntegerOnly","LoginAccount","LoginPassword","RegisterAccount","RegisterPassword","Register_ReferrerAccount","PhoneNumber","validator","validPhone","store","NewPassword","DepositBankAccount","DepositMemo","Deposit_Amount","WithdrawBankAccount","WithdrawMemo","Withdraw_Amount","BindAccount_Account","BindAccount_Password","DetailInfo_Name","DetailInfo_Birthday","DetailInfo_IDNumber","DetailInfo_Phone","DetailInfo_Verify","DetailInfo_BankAccount","validBankAccount","DetailInfo_Email","directives","ClickOutside","isLogin","keyword","form","Password","login","isPwdShow","eyeIcon","eyeOpenIcon","register","forgotPassword","isContactShow","contactInfo","isLivechatOpen","isZendeskLoaded","user","contactList","liveChatInfo","zendeskInfo","$zendesk","load","ContactInfo","$on","zE","hide","created","error","getContactInfo","Community","Get_CommunityLink","normalLogin","valid","Action","AccountInfo","OauthInfo","DeviceInfo","DeviceID","User","Login","Tips","agent","lineLogin","faceBookLogin","vm","getFBProfile","accessToken","getAccessToken","isNewMember","FBCreateCheck","IsCreate","authResponse","FBCreateResult","FBAccountCreate","api","autoGetFBProfile","userID","quickLogin","deviceID","uuidV4","openSignUp","openForgotPwd","handleOpenLiveChat","LiveChatWidget","call","handleLiveChatChange","visibility","handleContactShow","target","className","handleContactImage","ContactImage","handleContact","ContactUrl","isFullscreen","isMusicPlay","otherParams","LetItSnowShow","setting","mission","champion","announcement","wallet","betRecord","specialOfferOverview","advertisement","profile","leaderboard","lottery","diamondshop","otpvertify","promoCode","route","getOtherParams","Message","Get_AdvertisementList","checkReferrerUrl","handleScreenChange","angle","cur","IsAvoidFlow","url","Birthday","OTP","BankID","BankAccount","BankImage","Email","BankList","accept","image","lastTime","isPhoneNumberLock","isFirstClick","AgentMode","IsBind","Birth","TimerFirstClick","TimerLock","tempPhone","TimerTempData","phoneNumber","TimerCount","InitTimer","BindCheck","getMemberBank","ClearTimer","Bank","getList","MemberBankAccount","MemberBankID","MemberBankImage","CellPhoneNumber","BindPhone","IsOTP","BankImg","VerificationCode","BindMember","onFileChange","files","dataTransfer","isIMAGE","isLt1M","size","createImage","reader","FileReader","readAsDataURL","onload","openFile","compressImage","file","maxSizeMB","initialQuality","imageCompression","onloadend","base64data","otpVertify","lobby","detailInfo","contentBox","service","axios","Api","domains","instanse","create","baseURL","interceptors","use","config","platform","Device","reject","urlSearchParams","fromEntries","entries","MaintainContent","router","path","isAlertShow","ErrorMsg","callAPI","findItem","requestData","findItemIndex","findIndex","splice","isOTPByPass","verifyForm","Phone","count","getSkipSmsOTP","skipSmsOTP","updatePhone","UserVerifyPhone","getInfo","b","checkNullUndefined","Decimal","plus","toNumber","subtract","minus","multiply","times","div","isNumber","isNaN","decimalObj"],"mappings":"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","file":"static/js/app-493df0b3.js","sourcesContent":["import API from '../../api'\nimport { MessageBox } from 'element-ui'\nimport { getMobile } from '../../utils'\n\nexport default {\n  inject: ['BGMPlay', 'BGMPause', 'playSound', 'checkUserNotificationIsEnabled'],\n  name: 'Setting',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  computed: {\n    isLoading() {\n      return this.$store.getters.isMemberInfoLoading\n    },\n    appVersion: function() {\n      return this.$store.getters.Version\n    },\n    musicEnable: function() {\n      return this.$store.state.app.isBGMEnable\n    },\n    langOptions: function() {\n      return this.langData.map(lang => ({\n        value: lang.Code,\n        label: lang.Name\n      }))\n    },\n    MemberInfoData() {\n      return this.$store.getters.MemberInfo\n    }\n  },\n  data() {\n    return {\n      result: {\n        itemObject: null\n      },\n      langData: [],\n      dialog: {\n        changePassword: {\n          name: 'changePassword',\n          locale: 'changePassword',\n          show: false,\n          itemObject: null\n        }\n      },\n      canSubScribe: false\n    }\n  },\n  async mounted() {\n    this.$nextTick(async () => {\n      this.checkToken()\n      this.getLanguage()\n      this.getMemberInfo()\n      const device = getMobile()\n      if (device === 'iPhone' || device === 'iPad' || device === 'iPod') return\n      this.getSubscriptionState()\n        .then(state => {\n          console.log(state)\n          this.canSubScribe = state ? (!state.isPushEnabled || state.isOptedOut) : false\n        })\n      window.OneSignal.on('subscriptionChange', (isSubscribed) => {\n        if (isSubscribed) {\n          this.canSubScribe = false\n        }\n      })\n    })\n  },\n  methods: {\n    checkToken() {\n      if (!this.$store.getters.Token) {\n        this.openDialog(null, 'login')\n      }\n    },\n    close() {\n      if (this.isLoading) return\n      this.langShow = false\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    openDialog(entry, action) {\n      this.playSound('open')\n      switch (action) {\n        case 'memberInfo':\n          this.$track('打開會員資訊頁', {\n            event_category: 'click',\n            event_label: '打開會員資訊頁'\n          })\n          this.dialog.memberInfo.show = true\n          this.dialog.memberInfo.itemObject = entry\n          break\n        case 'changePassword':\n          this.$track('打開修改密碼頁', {\n            event_category: 'click',\n            event_label: '打開修改密碼頁'\n          })\n          this.dialog.changePassword.show = true\n          break\n        case 'referrer':\n          this.dialog.referrer.show = true\n          break\n        case 'bindAccount':\n          this.$track('打開綁定帳號頁', {\n            event_category: 'click',\n            event_label: '打開綁定帳號頁'\n          })\n          this.dialog.bindAccount.show = true\n          break\n        case 'Invite':\n          this.$track('打開邀請連結頁', {\n            event_category: 'click',\n            event_label: '打開邀請連結頁'\n          })\n          this.dialog.Invite.show = true\n          break\n        case 'confirm':\n          this.langShow = false\n          this.dialog.confirm.show = true\n          this.dialog.confirm.itemObject = {\n            action: 'reload',\n            From: 'Confirm',\n            To: 'Setting',\n            data: entry\n          }\n          break\n      }\n    },\n    closeDialog(dialogName, result) {\n      switch (dialogName) {\n        case 'memberInfo':\n          this.getMemberInfo()\n          break\n        case 'changePassword':\n          break\n        case 'referrer':\n          this.getMemberInfo()\n          break\n        case 'bindAccount':\n          this.getMemberInfo()\n          break\n        case 'Invite':\n          break\n        case 'confirm':\n          this.dialog.confirm.show = false\n          if (result.itemObject && result.itemObject.action === 'reload') {\n            this.changeLanguage(result.itemObject.data.Code)\n            this.$track('語系切換', {\n              event_category: 'click',\n              event_label: '語系切換',\n              value: result.itemObject.data.Code\n            })\n            window.location.reload(true)\n          }\n          break\n      }\n    },\n    logout() {\n      // 沒綁定帳號時跳提示\n      if (!this.MemberInfoData.AccountBind && !this.MemberInfoData.FbBind) {\n        MessageBox.confirm(this.$t('Message.BindAccountMsg'), '', {\n          confirmButtonText: this.$t('Shared.BindAccount'),\n          cancelButtonText: this.$t('Shared.Logout'),\n          showClose: false,\n          closeOnClickModal: false,\n          closeOnPressEscape: false\n        })\n          .then(() => {\n            this.openDialog(null, 'bindAccount')\n          })\n          .catch(() => {\n            this.logoutAction()\n          })\n      } else {\n        this.logoutAction()\n      }\n    },\n    logoutAction() {\n      this.$track('登出', {\n        event_category: 'click',\n        event_label: '登出'\n      })\n      this.$store.commit('app/SET_ISLOADING', true)\n      // 登出 清空 Token\n      this.$store.dispatch('user/setToken', '')\n      // 清空 Device\n      this.$store.dispatch('user/setDevice', '')\n      // 清空 MemberInfo\n      this.$store.dispatch('user/setMemberInfo', {})\n      // 清掉 Vuex FBInfo\n      this.$store.dispatch('user/setFBInfo', {})\n      // 清掉 暫存的手機號碼\n      this.$store.dispatch('timer/setTimerTempData', null)\n      this.$store.dispatch('timer/setTimerLock', false)\n      this.$store.dispatch('timer/setFirstClick', false)\n      this.$store.dispatch('timer/setTimerCount', 180)\n      // FB Logout\n      this.faceBookLogout()\n      location.href = '/'\n    },\n    async getLanguage() {\n      var formData = {}\n      const { ErrorCode, Data } = await API.Language.GetList(formData)\n      if (ErrorCode === 0 && Data) {\n        this.langData = Data.filter(function(f) {\n          return f.Status === 1\n        })\n      }\n    },\n    changeLanguage(langCode) {\n      if (langCode === this.$store.getters.language) return\n\n      this.$i18n.locale = langCode\n      this.$store.dispatch('app/setLanguage', langCode)\n    },\n    async getMemberInfo() {\n      await this.$store.dispatch('user/getMemberInfo')\n    },\n    faceBookLogout() {\n      // 檢查登入狀態\n      window.FB?.getLoginStatus(function(response) {\n        // 檢查登入狀態\n        if (response.status === 'connected') {\n          // 移除授權\n          // window.FB.api('/me/permissions', 'DELETE', function(res) {\n          // 用戶登出\n          window.FB?.logout(function(response) {\n            console.log(response)\n          })\n          // })\n        } else {\n          // do something\n          console.log('logout connected else something')\n        }\n      })\n    },\n    handleMusicChange(v) {\n      this.$store.dispatch('app/setBGMEnable', v)\n      this.$track('設定BGM', {\n        event_category: 'click',\n        event_label: '設定BGM',\n        value: v\n      })\n      v ? this.BGMPlay() : this.BGMPause()\n    },\n    async getSubscriptionState() {\n      return Promise.all([\n        window.OneSignal.isPushNotificationsEnabled(),\n        window.OneSignal.isOptedOut()\n      ]).then(function(result) {\n        var isPushEnabled = result[0]\n        var isOptedOut = result[1]\n\n        return {\n          isPushEnabled: isPushEnabled,\n          isOptedOut: isOptedOut\n        }\n      })\n    },\n    handleSubscribe() {\n      this.$track('訂閱通知', {\n        event_category: 'click',\n        event_label: '訂閱通知'\n      })\n      this.getSubscriptionState().then(function(state) {\n        if (state.isPushEnabled) {\n          /* Subscribed, opt them out */\n          // window.OneSignal.setSubscription(false)\n        } else {\n          if (state.isOptedOut) {\n            /* Opted out, opt them back in */\n            window.OneSignal.setSubscription(true)\n          } else {\n            /* Unsubscribed, subscribe them */\n            window.OneSignal.registerForPushNotifications()\n          }\n        }\n      })\n    }\n  }\n}\n","import API from '../../api'\nimport { MessageBox } from 'element-ui'\nimport { isEmpty } from 'lodash'\n\nexport default {\n  inject: ['moment', '_', 'Precision'],\n  name: 'Promotion',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  data() {\n    return {\n      result: {\n        itemObject: null\n      },\n      isLoading: false,\n      PromotionList: [],\n      RemainingFlow: 0,\n      FlowPercentage: 0,\n      TotalFlow: 0,\n      activeTypeIdx: 0,\n      activePromotionIndex: 0,\n      activePromotionType: 0,\n      activePromotionList: [],\n      dialog: {\n        promotionDetail: {\n          name: 'promotionDetail',\n          locale: 'promotionDetail',\n          show: false,\n          itemObject: null\n        },\n        finished: {\n          name: 'finished',\n          locale: this.$t('Promotion.Action.finish'),\n          show: false,\n          itemObject: null\n        },\n        specialOffer: {\n          name: 'specialOffer',\n          locale: 'SpecialOffer',\n          show: false,\n          itemObject: null\n        }\n      },\n      isPromotionInfoShow: false,\n      Authority: false,\n      myInterval: null,\n      countDownTimes: 0,\n      missionType: 1\n    }\n  },\n  computed: {\n    activePromotion() {\n      return (this.activePromotionList && this.activePromotionList[this.activePromotionIndex]) || {}\n    },\n    memberInfo() {\n      return this.$store.getters.MemberInfo\n    },\n    typeTitle() {\n      switch (this.activePromotionType) {\n        case '0':\n          return this.$t('Shared.1xTurnover')\n        case '1':\n          return this.$t('Shared.RewardPromotion')\n        case '2':\n          return this.$t('Shared.ReferrerPromotion')\n        case '4':\n          return this.$t('Shared.RebatePromotion')\n        case '6':\n          return this.$t('Shared.DailyMission')\n        case '7':\n          return this.$t('Shared.DepositPromotion')\n        case '8':\n          return this.$t('Shared.LotteryPromotion')\n      }\n    },\n    promotionData() {\n      return this.$store.getters['promotion/Promotions']?.data\n    }\n  },\n  watch: {\n    activeIndex() {\n      this.isInfoShow = false\n    },\n    promotionData: {\n      handler(val) {\n        this.RemainingFlow = val.RemainingFlow\n        this.TotalFlow = val.TotalFlow\n        this.FlowPercentage = val.FlowPercentage > 0 ? val.FlowPercentage : 0\n        this.Authority = val.Authority\n        this.countDownTimes = val.SettleWaitTime\n        this.missionType = val.MissionType\n        if (this.countDownTimes > 0) {\n          this.initTimer(this.countDownTimes)\n        }\n        const isPageDataEmpty = isEmpty(this.PromotionList)\n        this.PromotionList = val.MissionClassGroup\n        if (isPageDataEmpty) { // 頁面初始資料是空的才執行\n          if (this.itemObject && this.itemObject.type === 7) {\n            let index = 0\n            const find = this.PromotionList.find((item, idx) => {\n              const key = Object.keys(item)[0]\n              if (Number(key) === 7) index = idx\n              return Number(key) === 7\n            })\n            if (find) {\n              this.handleIconClick(find, index)\n            } else {\n              this.handleIconClick(this.PromotionList[0], 0)\n            }\n          } else {\n            this.handleIconClick(this.PromotionList[0], 0)\n          }\n        } else {\n          const find = this.PromotionList.find((item, idx) => {\n            const result = Object.keys(item)[0] === this.activePromotionType\n            if (Object.keys(item)[0] === this.activePromotionType) {\n              this.activeTypeIdx = idx\n            }\n            return result\n          })\n          if (find) {\n            this.activePromotionList = Object.values(find)[0]\n          } else {\n            this.handleIconClick(this.PromotionList[0], 0)\n          }\n        }\n      },\n      immediate: true,\n      deep: false\n    }\n  },\n  mounted() {\n    this.$store.dispatch('promotion/getPromotions')\n  },\n  methods: {\n    close() {\n      if (this.isLoading) return\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    async dataBind() {\n      this.isLoading = true\n      const result = await this.$store.dispatch('promotion/getPromotions').catch(() => {\n        this.isLoading = false\n      })\n      this.isLoading = false\n    },\n    openDialog(entry, action) {\n      switch (action) {\n        case 'promotionDetail':\n          this.dialog.promotionDetail.show = true\n          this.dialog.promotionDetail.itemObject = entry\n          break\n        case 'finished':\n          this.dialog.finished.show = true\n          this.dialog.finished.itemObject = entry\n          break\n        case 'specialOffer':\n          this.dialog.specialOffer.show = true\n          this.dialog.specialOffer.itemObject = entry\n          break\n        default:\n          break\n      }\n    },\n    closeDialog(dialogName, result) {\n      switch (dialogName) {\n        case 'promotionDetail':\n          this.dialog.promotionDetail.show = false\n          break\n        case 'finished':\n          this.dialog.finished.show = false\n          if (result.itemObject) {\n            this.onPromotionClearFlow(result.itemObject)\n          }\n          break\n        case 'specialOffer':\n          this.dialog.specialOffer.show = false\n          if (result.itemObject) {\n            this.result.itemObject = result.itemObject\n            this.close()\n          }\n          break\n        default:\n          break\n      }\n    },\n    async onPromotionJoin(obj) {\n      // 彈出存款贈特例\n      if (obj.MissionClass && obj.MissionClass === 7) {\n        this.$store.commit('app/SET_ISLOADING', true)\n        const { Data, ErrorCode } = await API.Financial.GetActivityDeposit({ PromotionGroupID: obj.PromotionGroupID })\n        this.$store.commit('app/SET_ISLOADING', false)\n        if (ErrorCode === 0) {\n          this.result.itemObject = {\n            action: 'openDialog',\n            from: 'SpecialOffer',\n            to: 'Deposit',\n            itemData: {\n              GroupID: obj.PromotionGroupID,\n              PromotionList: Data.Mission\n            }\n          }\n          this.close()\n        }\n        return\n      }\n      if (obj.MissionClass && obj.MissionClass === 8) {\n        this.result.itemObject = {\n          action: 'openDialog',\n          from: 'promotion',\n          to: 'lottery'\n        }\n        this.close()\n        return\n      }\n      var formData = {\n        MissionClass: obj.MissionClass,\n        ID: obj.ID\n      }\n      this.$store.commit('app/SET_ISLOADING', true)\n      const result = await API.Activity.Join_Promotion(formData).catch(() => {\n        console.log('error')\n      })\n      this.$store.commit('app/SET_ISLOADING', false)\n      if (result.ErrorCode === 0) {\n        this.$track('參加活動', {\n          event_category: 'click',\n          event_label: '參加活動',\n          value: obj.ID\n        })\n        this.$message.success({\n          message: this.$t('Has Joined Promotion')\n        })\n        await this.dataBind()\n      }\n    },\n    async onPromotionClearFlow(obj) {\n      if (this.countDownTimes > 0) return\n      MessageBox.confirm(this.$t('Message.Msg.AreYouPromotionFinished'), '', {\n        confirmButtonText: this.$t('Shared.Confirm'),\n        cancelButtonText: this.$t('Shared.Cancel'),\n        showClose: false,\n        closeOnClickModal: false,\n        closeOnPressEscape: false\n      })\n        .then(async () => {\n          var formData = {\n            MissionClass: obj.MissionClass,\n            ID: obj.ID\n          }\n          this.$store.commit('app/SET_ISLOADING', true)\n          const result = await API.Activity.Finish_Promotion(formData).catch(() => {\n            console.log('error')\n          })\n          this.$store.commit('app/SET_ISLOADING', false)\n\n          if (result.ErrorCode === 0) {\n            this.$message.success({\n              message: this.$t('Promotion Finished')\n            })\n            await this.dataBind()\n          } else {\n            if (result.Data.SettleWaitTime) {\n              this.countDownTimes = result.Data.SettleWaitTime\n              this.initTimer(this.countDownTimes)\n            }\n          }\n        })\n        .catch(() => {\n          console.log('cancel')\n        })\n    },\n    handleIcon(item) {\n      if ([7, 8].includes(item.MissionClass)) return item.ImageUrl\n      if (item.MissionClass === 0) return require('@/assets/images/common/cash-flow-icon.webp')\n      if (item.IconUrl) return item.IconUrl\n      switch (item.MissionClass) {\n        case 0:\n          return require('@/assets/images/common/cash-flow-icon.webp')\n        case 2:\n          return require('@/assets/images/common/bring-new-icon.webp')\n        case 4:\n          return require('@/assets/images/common/rack-back-icon.webp')\n        case 6:\n          return require('@/assets/images/common/daily-mission-icon.webp')\n        default:\n          return item.IconUrl\n      }\n    },\n    handleImage(item) {\n      if (item.ImageUrl) return item.ImageUrl\n      switch (item.MissionClass) {\n        case 0:\n          return require('@/assets/images/common/cash-flow-image.webp')\n        case 2:\n          return require('@/assets/images/common/bring-new-image.webp')\n        case 4:\n          return require('@/assets/images/common/rack-back-image.webp')\n        case 6:\n          return require('@/assets/images/common/daily-mission-image.webp')\n      }\n      return item.IconUrl\n    },\n    moneyFilter(num) {\n      return this.$options.filters.toThousandFilter(num, 2)\n    },\n    handleBindInfo() {\n      this.result.itemObject = {\n        action: 'openDialog',\n        from: 'promotion',\n        to: 'DetailInfo'\n      }\n      this.close()\n    },\n    handleDotClick(i) {\n      this.activePromotionIndex = i\n      this.isPromotionInfoShow = false\n      const element = this.$refs[`slider${i}`][0]\n      const rect = element.getBoundingClientRect()\n      const elementCanSee = rect.top >= 0 &&\n        rect.left >= 0 &&\n        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n        rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n      if (!elementCanSee) {\n        element.scrollIntoView({ behavior: 'smooth', block: 'end' })\n      }\n    },\n    initTimer(reloadTime = 120) {\n      reloadTime = Number(reloadTime.toFixed(0))\n      if (this.myInterval) {\n        clearInterval(this.myInterval)\n      }\n      this.myInterval = setInterval(() => {\n        reloadTime--\n        this.countDownTimes = reloadTime\n        if (reloadTime === 0) {\n          this.countDownTimes = 0\n          clearInterval(this.myInterval)\n        }\n      }, 1000)\n    },\n    handleIconClass(item, idx) {\n      const canFinish = Object.values(item)[0].some(el => el.FinishButton) && idx !== this.activeTypeIdx\n      return { active: idx === this.activeTypeIdx, canFinish }\n    },\n    handleIconSrc(item, idx) {\n      const type = Object.keys(item)[0]\n      switch (type) {\n        case '0':\n          return require(`@/assets/images/promotion/1x-wager${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '1':\n          return require(`@/assets/images/promotion/promotion${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '2':\n          return require(`@/assets/images/promotion/ref${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '4':\n          return require(`@/assets/images/promotion/water-return${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '6':\n          return require(`@/assets/images/promotion/daily-mission${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '7':\n          return require(`@/assets/images/promotion/deposit${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n        case '8':\n          return require(`@/assets/images/promotion/lottery${idx === this.activeTypeIdx ? '-active' : ''}.webp`)\n      }\n    },\n    handleIconClick(item, idx) {\n      this.activeTypeIdx = idx\n      this.activePromotionList = Object.values(item)[0]\n      this.activePromotionType = Object.keys(item)[0]\n      this.activePromotionIndex = 0\n      this.isPromotionInfoShow = false\n      this.$nextTick(() => {\n        this.$refs.sliderBox.scrollTop = 0\n      })\n    },\n    handleSliderClick(idx) {\n      this.activePromotionIndex = idx\n      this.isPromotionInfoShow = false\n    },\n    handleTypeTitle(item) {\n      const promotion = Object.keys(item)[0]\n      switch (String(promotion)) {\n        case '0':\n          return this.$t('Shared.1xTurnover')\n        case '1':\n          return this.$t('Shared.RewardPromotion')\n        case '2':\n          return this.$t('Shared.ReferrerPromotion')\n        case '4':\n          return this.$t('Shared.RebatePromotion')\n        case '6':\n          return this.$t('Shared.Daily')\n        case '7':\n          return this.$t('Shared.DepositPromotion')\n        case '8':\n          return this.$t('Shared.LotteryPromotion')\n      }\n    }\n  }\n}\n","import screenfull from 'screenfull'\n\n/**\n * Parse the time to string\n * @param {(Object|string|number)} time\n * @param {string} cFormat\n * @returns {string}\n */\nexport function parseTime(time, cFormat) {\n  if (arguments.length === 0) {\n    return null\n  }\n  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n  let date\n  if (typeof time === 'object') {\n    date = time\n  } else {\n    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {\n      time = parseInt(time)\n    }\n    if (typeof time === 'number' && time.toString().length === 10) {\n      time = time * 1000\n    }\n    date = new Date(time)\n  }\n  const formatObj = {\n    y: date.getFullYear(),\n    m: date.getMonth() + 1,\n    d: date.getDate(),\n    h: date.getHours(),\n    i: date.getMinutes(),\n    s: date.getSeconds(),\n    a: date.getDay()\n  }\n  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n    let value = formatObj[key]\n    // Note: getDay() returns 0 on Sunday\n    if (key === 'a') {\n      return ['日', '一', '二', '三', '四', '五', '六'][value]\n    }\n    if (result.length > 0 && value < 10) {\n      value = '0' + value\n    }\n    return value || 0\n  })\n  return time_str\n}\n\n/**\n * @param {number} time\n * @param {string} option\n * @returns {string}\n */\nexport function formatTime(time, option) {\n  if (('' + time).length === 10) {\n    time = parseInt(time) * 1000\n  } else {\n    time = +time\n  }\n  const d = new Date(time)\n  const now = Date.now()\n\n  const diff = (now - d) / 1000\n\n  if (diff < 30) {\n    return '刚刚'\n  } else if (diff < 3600) {\n    // less 1 hour\n    return Math.ceil(diff / 60) + '分钟前'\n  } else if (diff < 3600 * 24) {\n    return Math.ceil(diff / 3600) + '小时前'\n  } else if (diff < 3600 * 24 * 2) {\n    return '1天前'\n  }\n  if (option) {\n    return parseTime(time, option)\n  } else {\n    return (\n      d.getMonth() +\n      1 +\n      '月' +\n      d.getDate() +\n      '日' +\n      d.getHours() +\n      '时' +\n      d.getMinutes() +\n      '分'\n    )\n  }\n}\n\n/**\n * @param {string} url\n * @returns {Object}\n */\nexport function getQueryObject(url) {\n  url = url == null ? window.location.href : url\n  const search = url.substring(url.lastIndexOf('?') + 1)\n  const obj = {}\n  const reg = /([^?&=]+)=([^?&=]*)/g\n  search.replace(reg, (rs, $1, $2) => {\n    const name = decodeURIComponent($1)\n    let val = decodeURIComponent($2)\n    val = String(val)\n    obj[name] = val\n    return rs\n  })\n  return obj\n}\n\n/**\n * @param {string} input value\n * @returns {number} output value\n */\nexport function byteLength(str) {\n  // returns the byte length of an utf8 string\n  let s = str.length\n  for (var i = str.length - 1; i >= 0; i--) {\n    const code = str.charCodeAt(i)\n    if (code > 0x7f && code <= 0x7ff) {\n      s++\n    } else if (code > 0x7ff && code <= 0xffff) s += 2\n    if (code >= 0xdc00 && code <= 0xdfff) i--\n  }\n  return s\n}\n\n/**\n * @param {Array} actual\n * @returns {Array}\n */\nexport function cleanArray(actual) {\n  const newArray = []\n  for (let i = 0; i < actual.length; i++) {\n    if (actual[i]) {\n      newArray.push(actual[i])\n    }\n  }\n  return newArray\n}\n\n/**\n * @param {Object} json\n * @returns {Array}\n */\nexport function param(json) {\n  if (!json) return ''\n  return cleanArray(\n    Object.keys(json).map(key => {\n      if (json[key] === undefined) return ''\n      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])\n    })\n  ).join('&')\n}\n\n/**\n * @param {string} url\n * @returns {Object}\n */\nexport function param2Obj(url) {\n  const search = url.split('?')[1]\n  if (!search) {\n    return {}\n  }\n  return JSON.parse(\n    '{\"' +\n    decodeURIComponent(search)\n      .replace(/\"/g, '\\\\\"')\n      .replace(/&/g, '\",\"')\n      .replace(/=/g, '\":\"')\n      .replace(/\\+/g, ' ') +\n    '\"}'\n  )\n}\n\n/**\n * @param {string} val\n * @returns {string}\n */\nexport function html2Text(val) {\n  const div = document.createElement('div')\n  div.innerHTML = val\n  return div.textContent || div.innerText\n}\n\n/**\n * Merges two objects, giving the last one precedence\n * @param {Object} target\n * @param {(Object|Array)} source\n * @returns {Object}\n */\nexport function objectMerge(target, source) {\n  if (typeof target !== 'object') {\n    target = {}\n  }\n  if (Array.isArray(source)) {\n    return source.slice()\n  }\n  Object.keys(source).forEach(property => {\n    const sourceProperty = source[property]\n    if (typeof sourceProperty === 'object') {\n      target[property] = objectMerge(target[property], sourceProperty)\n    } else {\n      target[property] = sourceProperty\n    }\n  })\n  return target\n}\n\n/**\n * @param {HTMLElement} element\n * @param {string} className\n */\nexport function toggleClass(element, className) {\n  if (!element || !className) {\n    return\n  }\n  let classString = element.className\n  const nameIndex = classString.indexOf(className)\n  if (nameIndex === -1) {\n    classString += '' + className\n  } else {\n    classString =\n      classString.substr(0, nameIndex) +\n      classString.substr(nameIndex + className.length)\n  }\n  element.className = classString\n}\n\n/**\n * @param {string} type\n * @returns {Date}\n */\nexport function getTime(type) {\n  if (type === 'start') {\n    return new Date().getTime() - 3600 * 1000 * 24 * 90\n  } else {\n    return new Date(new Date().toDateString())\n  }\n}\n\n/**\n * @param {Function} func\n * @param {number} wait\n * @param {boolean} immediate\n * @return {*}\n */\nexport function debounce(func, wait, immediate) {\n  let timeout, args, context, timestamp, result\n\n  const later = function() {\n    // 据上一次触发时间间隔\n    const last = +new Date() - timestamp\n\n    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait\n    if (last < wait && last > 0) {\n      timeout = setTimeout(later, wait - last)\n    } else {\n      timeout = null\n      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n      if (!immediate) {\n        result = func.apply(context, args)\n        if (!timeout) context = args = null\n      }\n    }\n  }\n\n  return function(...args) {\n    context = this\n    timestamp = +new Date()\n    const callNow = immediate && !timeout\n    // 如果延时不存在,重新设定延时\n    if (!timeout) timeout = setTimeout(later, wait)\n    if (callNow) {\n      result = func.apply(context, args)\n      context = args = null\n    }\n\n    return result\n  }\n}\n\n/**\n * 這只是深度複製的簡單版本\n * 有很多邊緣案例的錯誤\n * 如果要使用完美的深層副本,請使用lodash的_.cloneDeep\n * @param {Object} source\n * @returns {Object}\n */\nexport function deepClone(source) {\n  if (!source && typeof source !== 'object') {\n    throw new Error('error arguments', 'deepClone')\n  }\n  const targetObj = source.constructor === Array ? [] : {}\n  Object.keys(source).forEach(keys => {\n    if (source[keys] && typeof source[keys] === 'object') {\n      targetObj[keys] = deepClone(source[keys])\n    } else {\n      targetObj[keys] = source[keys]\n    }\n  })\n  return targetObj\n}\n\n/**\n * @param {Array} arr\n * @returns {Array}\n */\nexport function uniqueArr(arr) {\n  return Array.from(new Set(arr))\n}\n\n/**\n * @returns {string}\n */\nexport function createUniqueString() {\n  const timestamp = +new Date() + ''\n  const randomNum = parseInt((1 + Math.random()) * 65536) + ''\n  return (+(randomNum + timestamp)).toString(32)\n}\n\n/**\n * Check if an element has a class\n * @param {HTMLElement} elm\n * @param {string} cls\n * @returns {boolean}\n */\nexport function hasClass(ele, cls) {\n  return !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'))\n}\n\n/**\n * Add class to element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport function addClass(ele, cls) {\n  if (!hasClass(ele, cls)) ele.className += ' ' + cls\n}\n\n/**\n * Remove class from element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport function removeClass(ele, cls) {\n  if (hasClass(ele, cls)) {\n    const reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)')\n    ele.className = ele.className.replace(reg, ' ')\n  }\n}\n\n/**\n * boolean change to number\n * number change to boolean\n * @param {boolean,number} value\n */\nexport function deformatStatus(value) {\n  switch (typeof value) {\n    case 'boolean':\n      switch (value) {\n        case false:\n          return 0\n        case true:\n          return 1\n      }\n      break\n    case 'number':\n      switch (value) {\n        case 0:\n          return false\n        case 1:\n          return true\n      }\n      break\n  }\n}\n\n/**\n * randomWord 产生任意长度随机字母数字组合\n * randomFlag-是否任意长度 min-任意长度最小位[固定位数] max-任意长度最大位\n * @param {Boolean} randomFlag\n * @param {Number} min\n * @param {Number} max\n */\nexport function GenerateRandom(randomFlag, min, max) {\n  var str = ''\n  var range = min\n  var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']\n\n  // 随机产生\n  if (randomFlag) {\n    range = Math.round(Math.random() * (max - min)) + min\n  }\n  for (var i = 0; i < range; i++) {\n    var pos = Math.round(Math.random() * (arr.length - 1))\n    str += arr[pos]\n  }\n  return str\n}\n\n/**\n *\n * 產生亂數\n * @param {Number} len\n */\nexport function getRandomStr(len) {\n  var text = ''\n  var possible =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n  for (var i = 0; i < len; i++) {\n    text += possible.charAt(Math.floor(Math.random() * possible.length))\n  }\n  return text\n}\n\n/**\n * 四捨五入至 n位\n */\nexport function Rounding(num, pos) {\n  var size = Math.pow(10, pos)\n  return Math.round(num * size) / size\n}\n\n/**\n * 判斷是否為JSON\n * @param str\n * @returns {boolean}\n */\nexport function isJSON(str) {\n  if (typeof str === 'string') {\n    try {\n      var obj = JSON.parse(str)\n      if (typeof obj === 'object' && obj) {\n        return true\n      } else {\n        return false\n      }\n    } catch (e) {\n      // console.log('error:' + str + '!!!' + e)\n      return false\n    }\n  }\n  // console.log('It is not a string!')\n}\n\n/**\n * 報表用,會有負數\n * 將 x 四捨五入,保留小數點後 d 位數\n * @param {int} x\n * @param {int} d\n */\nexport function toDecimal(x, d) {\n  var f = parseFloat(x)\n  if (isNaN(f)) {\n    return\n  }\n  var p = Math.pow(10, d)\n  f = Math.round(x * p) / p\n  return f.toFixed(d)\n}\n\n/**\n * 判斷是不是手持裝置\n * @returns {boolean}\n */\nexport function isMobile() {\n  const mobileDevice = ['Android', 'webOS', 'iPhone', 'iPad', 'iPod', 'BlackBerry', 'Windows Phone']\n  var isMobileDevice = mobileDevice.some(e => navigator.userAgent.match(e))\n  return isMobileDevice\n}\n\n/**\n * 取得裝置\n * @returns {string}\n */\nexport function getMobile() {\n  const mobileDevice = ['Android', 'webOS', 'iPhone', 'iPad', 'iPod', 'BlackBerry', 'Windows Phone']\n  const device = mobileDevice.find(f => navigator.userAgent.match(f))\n  return device\n}\n\nexport function iOSversion() {\n  let d, v\n  if (/iP(hone|od|ad)/.test(navigator.platform)) {\n    v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/)\n    d = {\n      status: true,\n      version: parseInt(v[1], 10),\n      info: parseInt(v[1], 10) + '.' + parseInt(v[2], 10) + '.' + parseInt(v[3] || 0, 10)\n    }\n  } else {\n    d = { status: false, version: false, info: '' }\n  }\n  return d\n}\n\nexport async function handleScreenlock(params = { open: true, orientation: 2 }) {\n  if (!screenfull.isEnabled || !isAndroid()) return\n  if (params.open) {\n    await screenfull.request().catch(err => {\n      console.log(err)\n    })\n    setTimeout(() => {\n      const windowsVH = window.innerHeight / 100\n      document.documentElement.style.setProperty('--vh', windowsVH + 'px')\n    }, 100)\n    let orientation = null\n    switch (params.orientation) {\n      case 1:\n        orientation = 'portrait'\n        break\n      case 2:\n        orientation = 'landscape'\n        break\n      default:\n        break\n    }\n    if (orientation) {\n      await screen.orientation.lock(orientation).catch(err => {\n        console.log(err)\n      })\n    } else {\n      screen.orientation.unlock()\n    }\n  } else {\n    screen.orientation.unlock()\n  }\n}\n\nexport function isAndroid() {\n  return /(android)/i.test(navigator.userAgent)\n}\n\nexport function isSafari() {\n  return /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n}\n","import API from '../../api'\nimport { getMobile, isSafari } from '../../utils'\nimport NoSleep from 'nosleep.js'\nimport io from 'socket.io-client'\nimport { MessageBox } from 'element-ui'\nimport Manifest from '~manifest'\nimport { computed } from 'vue'\n\nconst noSleep = new NoSleep()\nconst ua = window.navigator.userAgent\nconst iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i)\nconst webkit = !!ua.match(/WebKit/i)\nconst iOSSafari = iOS && webkit && !ua.match(/CriOS/i)\n\nexport default {\n  inject: ['moment'],\n  provide() {\n    return {\n      getVersion: () => {\n        this.getVersion()\n      },\n      BGMPlay: () => {\n        this.$refs.Mp3Player && this.$refs.Mp3Player.play()\n      },\n      BGMPause: () => {\n        this.$refs.Mp3Player && this.$refs.Mp3Player.pause()\n      },\n      checkUserNotificationIsEnabled: () => {\n        this.checkUserNotificationIsEnabled()\n      },\n      runWebSocket: () => {\n        return this.runWebSocket()\n      },\n      closeSocket: () => {\n        this.closeSocket()\n      },\n      playSound(type = 'open') {\n        if (!this.$store.state.app.isBGMEnable) return\n        window.createjs.Sound.play(type)\n      },\n      isYoutubePlayerShow: computed(() => this.isYoutubePlayerShow),\n      isRotate: computed(() => this.isRotate),\n      isSafari: isSafari()\n    }\n  },\n  data() {\n    return {\n      appName: process.env.VUE_APP_TITLE,\n      isDomainLoaded: false,\n      prompt: false,\n      isRotate: false,\n      loadedCount: 0,\n      deferredPrompt: null,\n      isPromptShow: false,\n      isSafariHintShow: false,\n      isSafari: iOSSafari,\n      isYoutubePlayerShow: true,\n      isYoutubePlayerLoaded: false,\n      isIosTutorialShow: false,\n      defaultViewport: {\n        width: 0,\n        height: 0\n      },\n      WebSocket: {\n        HeartsInterval: null\n      },\n      isGotVersion: false,\n      isQueryChecked: false,\n      isSubscribeLoading: false,\n      timer: null,\n      hintTimer: null,\n      hintCountDown: 4,\n      isContentLoaded: false,\n      barWidth: 0,\n      currentProgress: 0,\n      progressInterval: null,\n      step: 0.1\n    }\n  },\n  watch: {\n    $route: function(newVal, oldVal) {\n      this.windowResize()\n    },\n    language: {\n      immediate: true,\n      handler(val) {\n        const classList = document.querySelector('html').classList\n        classList.remove('th')\n        classList.remove('en')\n        classList.remove('zh-CN')\n        classList.add(val)\n      }\n    },\n    token: {\n      immediate: true,\n      handler(val) {\n        if (val && !this.$socket.connected) {\n          this.runWebSocket()\n        } else if (!val && this.$socket.connect) {\n          this.closeSocket()\n        }\n\n        this.fetchData()\n      }\n    },\n    userInfo: {\n      immediate: true,\n      handler(newVal, oldVal) {\n        if (newVal.Account === oldVal?.Account && newVal.FBID === oldVal?.FBID) return\n        if (newVal.Account || newVal.FBID) {\n          window.dataLayer.push({ ga_c_id: newVal.Account || newVal.FBID })\n        }\n      }\n    }\n  },\n  computed: {\n    language() {\n      return this.$store.getters.language\n    },\n    token() {\n      return this.$store.getters.Token\n    },\n    isRotateShow() {\n      return this.$store.getters.isOpenGameWallet\n        ? this.isRotate\n        : this.isRotate && !this.$store.getters.isGameView\n    },\n    userInfo() {\n      return this.$store.getters.MemberInfo\n    },\n    localTime() {\n      const BaseTime = this.moment.utc('2021-01-01 00:01') // UTC+0時間基準點 日期隨便設定 主要是後面的時間\n      const localTime = this.moment(BaseTime).local().format('HH:mm') // 轉成當地時間\n\n      return localTime\n    }\n  },\n  async created() {\n    await this.$store.dispatch('app/setIsAlertShow', false)\n    const qs = new URLSearchParams(window.location.search)\n    const ac = qs.get('ac')\n    if (ac) {\n      const AgentCode = ac\n      if (ac !== this.$store.getters.AgentCode) {\n        await this.$store.dispatch('user/setAgentCode', AgentCode)\n        await this.$store.dispatch('user/setToken', '')\n        // 清空 Device\n        await this.$store.dispatch('user/setDevice', '')\n        // 清空 MemberInfo\n        await this.$store.dispatch('user/setMemberInfo', {})\n        // 清掉 Vuex FBInfo\n        await this.$store.dispatch('user/setFBInfo', {})\n        // 清掉 暫存的手機號碼\n        await this.$store.dispatch('timer/setTimerTempData', null)\n      } else {\n        if (this.$store.getters.Token) {\n          this.$router.replace('/')\n        }\n      }\n    }\n    const MaintainState = await this.checkMaintain()\n    if (MaintainState) {\n      this.isGotVersion = await this.getVersion()\n    }\n    await this.checkQuery()\n    await this.createManifest()\n    await this.$store.dispatch('app/setGameView', false)\n    this.windowResize()\n    window.addEventListener('load', this.windowLoading)\n    window.addEventListener('resize', this.windowResize)\n    window.addEventListener('orientationchange', this.windowResize)\n    window.addEventListener('gesturestart', function(event) {\n      event.preventDefault()\n    })\n    window.addEventListener('touchstart', function(event) {\n      if (event.touches.length > 1) {\n        event.preventDefault()\n      }\n    })\n    var lastTouchEnd = 0\n    window.addEventListener(\n      'touchend',\n      function(event) {\n        var now = new Date().getTime()\n        if (now - lastTouchEnd <= 300) {\n          event.preventDefault()\n        }\n        lastTouchEnd = now\n      },\n      false\n    )\n    this.enableNoSleep()\n    window.addEventListener('blur', () => {\n      this.$nextTick(() => {\n        this.$refs.Mp3Player && this.$refs.Mp3Player.pause()\n      })\n    })\n    window.addEventListener('focus', () => {\n      this.windowResize()\n      if (this.$store.state.app.isBGMEnable && !this.$store.getters.isGameView) {\n        this.$nextTick(() => {\n          this.$refs.Mp3Player && this.$refs.Mp3Player.play()\n        })\n      }\n    })\n    window.addEventListener('beforeinstallprompt', e => {\n      e.preventDefault()\n      this.deferredPrompt = e\n      if (e.prompt) {\n        document.querySelector('#app').addEventListener('click', this.handleTriggerPrompt)\n      }\n    })\n    window.addEventListener('appinstalled', () => {\n      this.deferredPrompt = null\n      this.isPromptShow = false\n    })\n    window.OneSignal = window.OneSignal || []\n    window.createjs.Sound.registerSound(require('@/assets/music/open.wav'), 'open')\n    window.createjs.Sound.registerSound(require('@/assets/music/close.wav'), 'close')\n    window.createjs.Sound.registerSound(require('@/assets/music/take-reward.mp3'), 'takeReward')\n  },\n  beforeDestroy() {\n    window.removeEventListener('load', this.windowLoading)\n    window.removeEventListener('resize', this.windowResize)\n    window.removeEventListener('orientationchange', this.windowResize)\n    if (this.timer) {\n      clearInterval(this.timer)\n    }\n    if (this.hintTimer) {\n      clearInterval(this.hintTimer)\n    }\n  },\n  async mounted() {\n    this.progressInterval = setInterval(() => {\n      this.currentProgress += this.step\n      const progress = Math.round(Math.atan(this.currentProgress) / (Math.PI / 2) * 100 * 1000) / 1000\n      this.barWidth = progress\n      if (progress >= 100) {\n        clearInterval(this.progressInterval)\n        this.isContentLoaded = true\n      } else if (progress >= 70) {\n        this.step = 0.01\n      }\n    }, 1000)\n    document.onreadystatechange = () => {\n      if (document.readyState === 'complete') {\n        this.barWidth = 100\n        clearInterval(this.progressInterval)\n        setTimeout(() => {\n          this.isContentLoaded = true\n        }, 1000)\n      }\n    }\n    setTimeout(() => {\n      if (!this.isContentLoaded) {\n        this.barWidth = 100\n        clearInterval(this.progressInterval)\n        this.isContentLoaded = true\n      }\n    }, 20000)\n    this.$store.commit('app/SET_ISLOADING', false)\n    this.$store.dispatch('app/setGameFilter', {\n      gameType: null,\n      provider: 'top50',\n      providerId: null\n    })\n    // OneSignal\n    if (process.env.VUE_APP_ENV !== 'local') {\n      this.getOneSignal()\n    }\n    if (this.isSafari && !window.navigator.standalone) {\n      this.isSafariHintShow = true\n      this.$nextTick(() => {\n        this.$refs.IOSVideo.onloadeddata = () => {\n          this.isYoutubePlayerLoaded = true\n        }\n      })\n    } else {\n      this.isYoutubePlayerShow = false\n    }\n    this.checkCrossDay()\n    this.startHintTimer()\n  },\n  methods: {\n    async getVersion() {\n      await API.Version.Check({}).then(res => {\n        const { Data } = res\n        console.log('當前版本:', Data.Version)\n        this.$store.dispatch('app/setVersion', Data.Version)\n      })\n      return Promise.resolve(true)\n    },\n    windowLoading(e) {\n      this.windowResize(e)\n    },\n    async windowResize(e) {\n      // 單純旋轉螢幕紀錄原始寬高\n      if (this.defaultViewport.width === 0 || (window.innerWidth + window.innerHeight) === (this.defaultViewport.width + this.defaultViewport.height)) {\n        this.defaultViewport.width = window.innerWidth\n        this.defaultViewport.height = window.innerHeight\n      }\n      if (window.innerWidth < window.innerHeight || window.orientation === 0) {\n        this.isRotate = true\n      } else {\n        this.isRotate = false\n      }\n\n      // 為了 Android 鍵盤高度會擠壓 innerheight\n      if (this.defaultViewport.width === window.innerWidth && this.defaultViewport.height !== window.innerHeight) return\n      setTimeout(() => {\n        const windowsVH = window.innerHeight / 100\n        document.documentElement.style.setProperty('--vh', windowsVH + 'px')\n      }, 100)\n    },\n    faceBookLogout() {\n      // 檢查登入狀態\n      window.FB.getLoginStatus(function(response) {\n        // 檢查登入狀態\n        if (response.status === 'connected') {\n          // 移除授權\n          // window.FB.api('/me/permissions', 'DELETE', function(res) {\n          // 用戶登出\n          window.FB.logout(function(response) {\n            console.log(response)\n          })\n          // })\n        } else {\n          // do something\n          console.log('logout connected else something')\n        }\n      })\n    },\n    getOneSignal() {\n      var self = this\n      window.OneSignal.push(function() {\n        /* These examples are all valid */\n        var isPushSupported = window.OneSignal.isPushNotificationsSupported()\n        if (isPushSupported) {\n          // Push notifications are supported\n          // 瀏覽器支援 初始化OneSignal\n          // 測試要注意 一定要用手機開 瀏覽器手機模式沒用\n          console.log('Push notifications are supported')\n          var device = getMobile()\n          if (device === 'iPhone' || device === 'iPad' || device === 'iPod') return\n          window.OneSignal.init({\n            appId: process.env.VUE_APP_ONE_SIGNAL_APP_ID,\n            safari_web_id: process.env.VUE_APP_ONE_SIGNAL_SAFARI_WEB_ID,\n            autoResubscribe: true,\n            notifyButton: {\n              enable: true\n            }\n          })\n        }\n      })\n      if (self.$store.getters.AgentCode) {\n        this.checkUserNotificationIsEnabled()\n      }\n      window.OneSignal.on('subscriptionChange', function(isSubscribed) {\n        console.log('The user\\'s subscription state is now:', isSubscribed)\n        // 允許推播\n        if (self.$store.getters.AgentCode) {\n          if (isSubscribed) {\n            // console.log('用戶允許')\n            window.OneSignal.getUserId().then(res => {\n              // console.log('取得推播ID', res)\n              // 防止1秒內的連打\n              if (self.isSubscribeLoading) {\n                console.log('訂閱裝置碼讀取中, 已擋下')\n                return\n              }\n              self.isSubscribeLoading = true\n              var formData = {\n                Provider: 'OneSignal',\n                APPID: process.env.VUE_APP_ONE_SIGNAL_APP_ID,\n                PlayerID: res\n              }\n              // console.log('儲存推播裝置碼 FormData===>', formData)\n              var customRequest = self.$store.getters.Token ? API.Notification.SubscribeHasLogin : API.Notification.SubscribeNoLogin\n              customRequest(formData).then(res => {\n                self.isSubscribeLoading = false\n                // console.log('儲存推播裝置碼', res)\n              }).catch(() => {\n                self.isSubscribeLoading = false\n                console.log('error')\n              })\n            })\n          } else {\n            // 否則\n            // console.log('用戶拒絕')\n          }\n        }\n      })\n    },\n    checkUserNotificationIsEnabled() {\n      var self = this\n      window.OneSignal.isPushNotificationsEnabled().then(function(isEnabled) {\n        if (isEnabled) {\n          console.log('Push notifications are enabled!')\n          window.OneSignal.push(['getNotificationPermission', function(permission) {\n            // console.log('Site Notification Permission:', permission)\n            // (Output) Site Notification Permission: default\n            switch (permission) {\n              case 'granted': // 用戶本來就同意推播\n                window.OneSignal.getUserId().then(res => {\n                  // console.log('取得推播ID', res)\n                  if (self.isSubscribeLoading) {\n                    console.log('訂閱裝置碼讀取中, 已擋下')\n                    return\n                  }\n                  self.isSubscribeLoading = true\n                  var formData = {\n                    Provider: 'OneSignal',\n                    APPID: process.env.VUE_APP_ONE_SIGNAL_APP_ID,\n                    PlayerID: res\n                  }\n                  // console.log('儲存推播裝置碼 FormData===>', formData)\n                  var customRequest = self.$store.getters.Token ? API.Notification.SubscribeHasLogin : API.Notification.SubscribeNoLogin\n                  customRequest(formData).then(res => {\n                    self.isSubscribeLoading = false\n                    // console.log('儲存推播裝置碼', res)\n                  }).catch(() => {\n                    self.isSubscribeLoading = false\n                    console.log('error')\n                  })\n                })\n                break\n              case 'denied': // 用戶本身就拒絕了\n                window.OneSignal.showSlidedownPrompt()\n                break\n              default: // 用戶設定是預設詢問\n                window.OneSignal.showSlidedownPrompt()\n                break\n            }\n          }])\n        } else {\n          console.log('Push notifications are not enabled yet.')\n          window.OneSignal.showSlidedownPrompt()\n        }\n      })\n    },\n    handleLoaded() {\n      this.$nextTick(() => {\n        this.$store.commit('app/SET_ISLOADING', false)\n      })\n    },\n    async checkQuery() {\n      // query 有 ac 則檢查正確並儲存, 如果是推薦人連結不做換頁\n      const qs = new URLSearchParams(window.location.search)\n      const AgentCode = qs.get('ac')\n      if (AgentCode) {\n        var formData = {\n          AgentCode\n        }\n        API.System.CheckAgentCode(formData).then(async res => {\n          if (res.ErrorCode === 0) {\n            await this.$store.dispatch('user/setAgentCode', AgentCode)\n            await this.$store.dispatch('app/setLanguage', res.Data.LanguageCode)\n            await this.$store.dispatch('app/setLocationCode', res.Data.LocationCode.toLowerCase())\n            await this.$store.dispatch('app/setLocationID', res.Data.LocationID)\n            if (this.$i18n.locale !== res.Data.LanguageCode) {\n              this.$i18n.locale = res.Data.LanguageCode\n            }\n            this.isQueryChecked = true\n            if (qs.cmd === 'referrer') return\n            this.$router.replace('/')\n          } else {\n            await this.$store.dispatch('user/setAgentCode', '')\n            this.isQueryChecked = true\n            this.$router.replace('/')\n          }\n        }).catch((err) => {\n          console.log('error' + err)\n        })\n      } else {\n        this.isQueryChecked = true\n      }\n    },\n    enableNoSleep() {\n      document.addEventListener('click',\n        function enableNoSleep () {\n          noSleep.enable()\n          document.removeEventListener('click', enableNoSleep, false)\n        },\n        false)\n      document.addEventListener('touchstart',\n        function enableNoSleep () {\n          noSleep.enable()\n          document.removeEventListener('touchstart', enableNoSleep, false)\n        },\n        false)\n    },\n    async dismiss() {\n      this.deferredPrompt = null\n      this.isPromptShow = false\n    },\n    async install() {\n      this.$track('點擊Android安裝PWA按鈕', {\n        event_category: 'click',\n        event_label: '點擊Android安裝PWA按鈕'\n      })\n      this.deferredPrompt.prompt()\n    },\n    handleDrawerClose() {\n      this.dismiss()\n    },\n    handleSafariDrawerClose() {\n      this.isSafariHintShow = false\n    },\n    handleTriggerPrompt(e) {\n      if (this.deferredPrompt) {\n        this.isPromptShow = true\n        document.querySelector('#app').removeEventListener('click', this.handleTriggerPrompt)\n      }\n    },\n    runWebSocket() {\n      if (this.$socket && this.$socket.connected) {\n        return\n      }\n      const uri = this.$store.getters.Domains?.SocketServer + '/v1/frontend'\n      const SocketManagerOptions = {\n        // path: 'socket.io', // string 在服務器端捕獲的路徑的名稱\n        reconnection: true, // boolean 是否自動重新連接\n        // reconnectionAttempts: 10, // number 放棄之前重新連接嘗試的次數\n        reconnectionDelay: 1500, // number 嘗試重新連接(1000)之前最初等待的時間。受+/-影響randomizationFactor,例如,默認的初始延遲將在500到1500ms之間\n        randomizationFactor: 0.5, // number  0 <= randomizationFactor <= 1\n        reconnectionDelayMax: 5000, // number 兩次重新連接之間要等待的最長時間(5000)。每次嘗試都會使重新連接延遲增加2倍,並如上所述進行隨機分配\n        timeout: 180000, // number 發出connect_error 和connect_timeout事件之前的(Number)連接超時(20000)\n        autoConnect: false, // boolean 將此值設置為false,則您必須manager.open 在確定合適的時間進行調用\n        withCredentials: false,\n        auth: {\n          env: process.env.VUE_APP_SOCKET_ENV,\n          source: process.env.VUE_APP_KEYWORD,\n          tn: this.$store.getters.Token\n        }\n        // query: '',// 連接名稱空間時發送的其他查詢參數(然後在socket.handshake.query服務器端的對像中找到)\n        // parser: '' // 要使用的解析器。默認為Parsersocket.io隨附的的實例。參見socket.io-parser。\n      }\n      this.$socket = io(uri, SocketManagerOptions)\n      // Socket連線 之後 五秒沒打 login 會斷線\n      this.$socket.connect()\n      this.$socket.on('connect', () => {\n        console.log('Socket connected')\n        this.$socket.emit('cmd', {\n          time: Number(this.moment().format('x')),\n          action: 'check',\n          channel: 'version',\n          data: {\n            version: this.$store.getters.SocketVersion\n          },\n          extension: {},\n          page: { pageIndex: 0, pageSize: 0 }\n        })\n      })\n\n      this.$socket.on('cmd', msg => {\n        console.log('msg: ', msg)\n        if (!msg) return false\n        if (msg.action === 'check' && msg.channel === 'version') {\n          if (msg.data?.version === this.$store.getters.SocketVersion) return false\n          if (!this.$store.getters.SocketVersion) {\n            // 首次登入直接覆寫\n            this.$store.dispatch('app/setSocketVersion', msg.data.version)\n            return\n          }\n          this.$store.dispatch('app/setSocketVersion', msg.data.version)\n          MessageBox.alert(this.$t('Message.Msg.VersionUpdatedMsg'), this.$t('Message.Msg.VersionUpdated'), {\n            confirmButtonText: this.$t('Shared.Confirm'),\n            callback: async action => {\n              location.reload(true)\n            }\n          })\n        } else if (msg.action === 'logout' && msg.channel === 'unauthorized') {\n          console.log('server refuse connect')\n          this.$socket.disconnect()\n        } else if (msg.action === 'refresh' && msg.channel === 'wallet') {\n          if (msg.data && msg.data.type === 'deposit') {\n            this.$message(this.$t('Shared.Deposit') + this.$t('Shared.Success'))\n            this.$store.dispatch('dailyMission/getHasReward')\n            const amount = +msg.data.amount\n            if (amount && amount > 0) {\n              this.$track('上分成功', {\n                event_category: 'Deposit',\n                event_label: '上分成功',\n                value: amount\n              })\n            }\n          } else {\n            this.$message(this.$t('Shared.Withdraw') + this.$t('Shared.Success'))\n          }\n          this.$store.dispatch('user/getWallet')\n        } else if (msg.action === 'refresh' && msg.channel === 'diamond') {\n          this.$store.commit('user/SET_DIAMONDAMOUNT', msg.data.amount)\n        } else if (msg.action === 'accomplish' && msg.channel === 'mission') {\n          this.$store.commit('user/SET_HASDAILYREWARD', true)\n        } else if (msg.channel === 'promotionFinish') {\n          this.$store.dispatch('wallet/getCheckPromotion')\n          this.$store.dispatch('promotion/getPromotions')\n        } else if (msg.channel === 'level') {\n          this.$store.dispatch('user/getMemberInfo')\n          this.$store.dispatch('promotion/getPromotions')\n          this.$store.dispatch('dailyMission/getAllData')\n        }\n      })\n\n      this.$socket.on('disconnect', reason => {\n        if (reason === 'io client disconnect') {\n          console.log(reason)\n          return false\n        } else {\n          console.log('socket disconnect', reason)\n          // this.$socket.disconnect()\n          return false\n        }\n      })\n\n      this.$socket.on('reconnect', () => {\n        console.log('socket reconnect')\n        this.$socket.connect()\n      })\n\n      this.$socket.on('connect_error', reason => {\n        console.log('Server error, reconnecting...')\n        return true\n      })\n\n      return this.$socket\n    },\n    closeSocket() {\n      if (this.$socket && this.$socket.connected) {\n        this.$socket.close()\n        this.$socket.off('login')\n        this.$socket.off('disconnect')\n        this.$socket.off('reconnect')\n        this.$socket.off('ping')\n        this.$socket.off('connect_error')\n        this.$socket.off('cmd')\n      }\n      if (this.WebSocket.HeartsInterval !== null) {\n        this.ClearSocketHearts()\n      }\n    },\n    async checkMaintain() {\n      const res = await API.System.CheckMaintain()\n      if (res.ErrorCode === 0) {\n        this.$store.dispatch('app/setIsMaintainence', false)\n      } else if (res.ErrorCode === 999999) {\n        await this.$store.dispatch('user/setAgentCode', '')\n      }\n      return Promise.resolve(res.ErrorCode === 0 || res.ErrorCode === 900012)\n    },\n    fetchData() {\n      if (!this.isQueryChecked) { // 等待query檢查完才執行\n        setTimeout(() => {\n          this.fetchData()\n        }, 500)\n        return\n      }\n      const { dispatch } = this.$store\n      dispatch('user/resetLoading')\n      dispatch('wallet/resetLoading')\n      dispatch('dailyMission/resetLoading')\n      dispatch('promotion/resetLoading')\n      dispatch('systemMail/resetLoading')\n      if (this.token) {\n        dispatch('user/getAllData')\n        dispatch('wallet/getAllData')\n        dispatch('dailyMission/getAllData')\n        dispatch('promotion/getAllData')\n        dispatch('systemMail/getAllData')\n        /* 預設五分鐘輪詢 */\n        // this.timer = setInterval(() => {\n        //   dispatch('user/getAllData')\n        //   dispatch('wallet/getAllData')\n        //   dispatch('dailyMission/getAllData')\n        //   dispatch('promotion/getAllData')\n        //   dispatch('systemMail/getAllData')\n        // }, 1000 * 60 * 5)\n      } else {\n        if (this.timer) clearInterval(this.timer)\n      }\n    },\n    createManifest() {\n      const ac = this.$store.getters.AgentCode\n      const manifest = {\n        ...Manifest,\n        start_url: ac ? `${window.location.origin}/?ac=${ac}` : window.location.origin,\n        scope: window.location.origin,\n        icons: [\n          ...Manifest.icons.map(item => {\n            return {\n              ...item,\n              src: `${window.location.origin}${item.src}`\n            }\n          })\n        ]\n      }\n      const stringManifest = JSON.stringify(manifest)\n      const blob = new Blob([stringManifest], { type: 'application/json' })\n      const manifestURL = URL.createObjectURL(blob)\n      const manifestNode = document.createElement('link')\n      manifestNode.rel = 'manifest'\n      manifestNode.href = manifestURL\n      document.head.appendChild(manifestNode)\n    },\n    checkCrossDay() { // 30秒檢查一次時間 檢查到時間=UTC+0 00:01則重打每日任務觸發掛任務\n      this.timer = setInterval(() => {\n        const currentTime = this.moment().local().format('HH:mm') // 當前當地時間\n        if (currentTime === this.localTime) {\n          this.$store.dispatch('dailyMission/getAllData')\n        }\n      }, 1000 * 30)\n    },\n    startHintTimer() {\n      this.hintTimer = setInterval(() => {\n        if (this.isContentLoaded && !this.isRotateShow && !this.isYoutubePlayerShow) {\n          this.hintCountDown = this.hintCountDown - 1\n        }\n        if (this.hintCountDown <= 0) {\n          clearInterval(this.hintTimer)\n        }\n      }, 1000)\n    },\n    handleTutorialClose() {\n      this.isIosTutorialShow = false\n      this.isSafariHintShow = false\n    }\n  }\n}\n","/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validEnAndNum(str) {\n  return /^[a-zA-Z0-9]*$/g.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validTrueName(str) {\n  return !/[0-9`~!@#$%^&*()_+<>?:\"{},.\\/;'[\\]]/g.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validExcSpecChar(str) {\n  return /^[a-zA-Z0-9\\u4e00-\\u9fa5\\u0E00-\\u0E7F]*$/g.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validChinese(str) {\n  return /^[\\u4e00-\\u9fa5]*$/g.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validEnglish(str) {\n  return /^[a-zA-Z]+$/.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validDecimal(str) {\n  return /^[0-9]+.[0-9]{0,2}$/.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function isNumberOrEnglish(str) {\n  return /^[0-9A-z]+$/.test(str)\n}\n\n/**\n * @param {string} path\n * @returns {Boolean}\n */\nexport function isExternal(path) {\n  return /^(https?:|mailto:|tel:)/.test(path)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validUsername(str) {\n  const valid_map = ['admin', 'editor', 'topagent']\n  return valid_map.indexOf(str.trim()) >= 0\n}\n\n/**\n * @param {string} url\n * @returns {Boolean}\n */\nexport function validURL(url) {\n  const reg = /^(https?|ftp|http):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/\n  return reg.test(url)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validLowerCase(str) {\n  const reg = /^[a-z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validUpperCase(str) {\n  const reg = /^[A-Z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validAlphabets(str) {\n  const reg = /^[A-Za-z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} email\n * @returns {Boolean}\n */\nexport function validEmail(email) {\n  const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n  return reg.test(email)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function isString(str) {\n  if (typeof str === 'string' || str instanceof String) {\n    return true\n  }\n  return false\n}\n\n/**\n * @param {Array} arg\n * @returns {Boolean}\n */\nexport function isArray(arg) {\n  if (typeof Array.isArray === 'undefined') {\n    return Object.prototype.toString.call(arg) === '[object Array]'\n  }\n  return Array.isArray(arg)\n}\n\n/**\n * @param {String} country\n * @param {Number} Phone\n * @returns {Boolean}\n */\nexport function validePhone(country, phone) {\n  var phones = {\n    'ar-DZ': /^(\\+?213|0)(5|6|7)\\d{8}$/,\n    'ar-SY': /^(!?(\\+?963)|0)?9\\d{8}$/,\n    'ar-SA': /^(!?(\\+?966)|0)?5\\d{8}$/,\n    'en-US': /^(\\+?1)?[2-9]\\d{2}[2-9](?!11)\\d{6}$/,\n    'cs-CZ': /^(\\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,\n    'de-DE': /^(\\+?49[ \\.\\-])?([\\(]{1}[0-9]{1,6}[\\)])?([0-9 \\.\\-\\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/,\n    'da-DK': /^(\\+?45)?(\\d{8})$/,\n    'el-GR': /^(\\+?30)?(69\\d{8})$/,\n    'en-AU': /^(\\+?61|0)4\\d{8}$/,\n    'en-GB': /^(\\+?44|0)7\\d{9}$/,\n    'en-HK': /^(\\+?852\\-?)?[569]\\d{3}\\-?\\d{4}$/,\n    'en-IN': /^(\\+?91|0)?[789]\\d{9}$/,\n    'en-NZ': /^(\\+?64|0)2\\d{7,9}$/,\n    'en-ZA': /^(\\+?27|0)\\d{9}$/,\n    'en-ZM': /^(\\+?26)?09[567]\\d{7}$/,\n    'en-th': /^(\\+?66\\-?|0)+[689]\\d{8}$/,\n    'es-ES': /^(\\+?34)?(6\\d{1}|7[1234])\\d{7}$/,\n    'fi-FI': /^(\\+?358|0)\\s?(4(0|1|2|4|5)?|50)\\s?(\\d\\s?){4,8}\\d$/,\n    'fr-FR': /^(\\+?33|0)[67]\\d{8}$/,\n    'he-IL': /^(\\+972|0)([23489]|5[0248]|77)[1-9]\\d{6}/,\n    'hu-HU': /^(\\+?36)(20|30|70)\\d{7}$/,\n    'it-IT': /^(\\+?39)?\\s?3\\d{2} ?\\d{6,7}$/,\n    'ja-JP': /^(\\+?81|0)\\d{1,4}[ \\-]?\\d{1,4}[ \\-]?\\d{4}$/,\n    'ms-MY': /^(\\+?6?01){1}(([145]{1}(\\-|\\s)?\\d{7,8})|([236789]{1}(\\s|\\-)?\\d{7}))$/,\n    'nb-NO': /^(\\+?47)?[49]\\d{7}$/,\n    'nl-BE': /^(\\+?32|0)4?\\d{8}$/,\n    'nn-NO': /^(\\+?47)?[49]\\d{7}$/,\n    'pl-PL': /^(\\+?48)? ?[5-8]\\d ?\\d{3} ?\\d{2} ?\\d{2}$/,\n    'pt-BR': /^(\\+?55|0)\\-?[1-9]{2}\\-?[2-9]{1}\\d{3,4}\\-?\\d{4}$/,\n    'pt-PT': /^(\\+?351)?9[1236]\\d{7}$/,\n    'ru-RU': /^(\\+?7|8)?9\\d{9}$/,\n    'sr-RS': /^(\\+3816|06)[- \\d]{5,9}$/,\n    'tr-TR': /^(\\+?90|0)?5\\d{9}$/,\n    'vi-VN': /^(\\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$/,\n    'zh-CN': /^(\\+?0?86\\-?)?1[345789]\\d{9}$/,\n    'zh-TW': /^(\\+?886\\-?|0)?9\\d{8}$/\n  }\n  if (phones[country]) {\n    var regex = new RegExp(phones[country])\n    return regex.test(phone)\n  }\n}\n\nexport function check24hr(minDate, maxDate) {\n  var oneTime = new Date().setTime(new Date(minDate).getTime())\n  var twoTime = new Date().setTime(new Date(maxDate).getTime())\n  if (oneTime + 3600 * 1000 * 24 < twoTime) {\n    return false\n  }\n  return true\n}\n\nexport function check7day(minDate, maxDate) {\n  var oneTime = new Date().setTime(new Date(minDate).getTime())\n  var twoTime = new Date().setTime(new Date(maxDate).getTime())\n  if (oneTime + 3600 * 1000 * 24 * 7 < twoTime) {\n    return false\n  }\n  return true\n}\n\nexport function check30day(minDate, maxDate) {\n  var oneTime = new Date().setTime(new Date(minDate).getTime())\n  var twoTime = new Date().setTime(new Date(maxDate).getTime())\n  if (oneTime + 3600 * 1000 * 24 * 30 < twoTime) {\n    return false\n  }\n  return true\n}\n\nexport function check60day(minDate, maxDate) {\n  var oneTime = new Date().setTime(new Date(minDate).getTime())\n  var twoTime = new Date().setTime(new Date(maxDate).getTime())\n  if (oneTime + 3600 * 1000 * 24 * 60 < twoTime) {\n    return false\n  }\n  return true\n}\n\nexport function check90day(minDate, maxDate) {\n  var oneTime = new Date().setTime(new Date(minDate).getTime())\n  var twoTime = new Date().setTime(new Date(maxDate).getTime())\n  if (oneTime + 3600 * 1000 * 24 * 90 < twoTime) {\n    return false\n  }\n  return true\n}\n\n/**\n * 依據地區ID驗證電話正則\n * @param LocationID\n * @param phone\n * @returns {boolean}\n */\nexport function validateCellPhone(LocationID, phone) {\n  var phones = {\n    0: /^\\d+$/,\n    1: /^(\\+?66\\-?|0)[689]\\d{8}$/, // TH 泰國\n    2: /^(\\+?84|0)[1-9]{1}[0-9]{8}$/, // VI 越南\n    3: /^(\\+?95|0)9[0-9]{7,9}$/, // MY 緬甸\n    4: /^(\\+?82|0)10[0-9]{8}$/, // KO 韓國\n    5: /^(\\+?60|0)[1][0-9]{8,9}$/ // MR 馬來西亞\n  }\n  if (phones[LocationID]) {\n    var regex = new RegExp(phones[LocationID])\n    return regex.test(phone)\n  }\n}\n\n/**\n * 依據地區ID驗證銀行帳號正則\n * @param LocationID\n * @param bankAccount\n * @returns {boolean}\n */\nexport function validateBank(LocationID, bankAccount) {\n  var banks = {\n    0: /^\\d+$/,\n    1: /^[0-9]{10,12}$/, // TH 泰國\n    2: /^[0-9]{6,18}$/, // VI 越南\n    3: /^[0-9]{9}$|^[0-9]{11}$|^[0-9]{16,17}$/, // MY 緬甸\n    4: /^\\d+$/, // KO 韓國\n    5: /^[0-9]{10,16}$/ // MR 馬來西亞\n  }\n\n  if (banks[LocationID]) {\n    var regex = new RegExp(banks[LocationID])\n    return regex.test(bankAccount)\n  }\n}\n\n/**\n * 過濾Emoji表情符號\n * @param str\n * @returns {boolean}\n */\nexport function validateEmoji(str) {\n  if (/(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|\\ud83c[\\ude32-\\ude3a]|\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/g.test(str)) {\n    return false\n  }\n  return true\n}\n\n/**\n * 英數字 and 至少包含1個數字\n * @param str\n * @returns {boolean}\n */\nexport function validateContainLeastNumber(str) {\n  return /^(?=.*[a-zA-Z])(?=.*\\d)[^]{6,12}$/g.test(str)\n}\n\nexport function validateBirthday(str) {\n  return /^(19|20)\\d{2}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2][0-9]|3[0-1])$/g.test(str)\n}\n\n/**\n * 6 ~ 12 字元 至少包含一個英文和一個數字\n * @param str\n * @returns {boolean}\n */\nexport function validateContainLeastNumberAndLetter(str) {\n  return /^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z0-9]{6,12}$/g.test(str)\n}\n","import API from '../../api'\n\nexport default {\n  inject: ['moment', 'Precision'],\n  name: 'BetRecord',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  data() {\n    return {\n      isDataLoading: false,\n      isProviderLoading: false,\n      isGameTypeLoading: false,\n      result: {\n        itemObject: null\n      },\n      search: {\n        params: {\n          ProviderID: -1,\n          GameTypeID: -1,\n          PageIndex: 1,\n          PageSize: 30\n        }\n      },\n      ProviderList: [],\n      GameTypeList: [],\n      table: {\n        Data: [],\n        headers: [\n          {\n            label: 'ProviderName',\n            locale: this.$t('BettingRecord.Fields.ProviderName')\n          },\n          {\n            label: 'GameType',\n            locale: this.$t('BettingRecord.Fields.GameType')\n          },\n          {\n            label: 'Turnover',\n            locale: this.$t('BettingRecord.Fields.Turnover')\n          },\n          {\n            label: 'Netwin',\n            locale: this.$t('BettingRecord.Fields.Netwin')\n          },\n          {\n            label: 'BetTime',\n            locale: this.$t('BettingRecord.Fields.BetTime')\n          }\n        ],\n        columns: [\n          {\n            key: 'ProviderName',\n            value: null\n          },\n          {\n            key: 'GameType',\n            value: null\n          },\n          {\n            key: 'Turnover',\n            value: null\n          },\n          {\n            key: 'Netwin',\n            value: null\n          },\n          {\n            key: 'BetTime',\n            value: null\n          }\n        ],\n        TotalCount: 0\n      }\n    }\n  },\n  mounted() {\n    this.getProviderList()\n    this.getGameTypeList(-1)\n  },\n  computed: {\n    ProviderOptions() {\n      return [\n        { value: -1, label: this.$t('Shared.All') },\n        ...this.ProviderList.map(lang => ({\n          value: lang.ProviderID,\n          label: lang.ProviderName\n        }))\n      ]\n    },\n    GameTypeOptions() {\n      return [\n        { value: -1, label: this.$t('Shared.All') },\n        ...this.GameTypeList.map(lang => ({\n          value: lang.GameTypeIDs,\n          label: this.$t(`GameType.${lang.GameTypeName}`)\n        }))\n      ]\n    }\n  },\n  methods: {\n    close() {\n      if (this.isDataLoading || this.isProviderLoading || this.isGameTypeLoading) return\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    clearTable() {\n      this.table.Data = []\n      this.table.headers = []\n      this.table.columns = []\n    },\n    setTable(headers, fields) {\n      this.table.headers = headers\n      this.table.columns = fields\n    },\n    formatter(row, column, cellValue, index) {\n      switch (column.key) {\n        case 'BetTime':\n          if (cellValue !== null) {\n            cellValue = this.moment(cellValue).format('YYYY-MM-DD HH:mm:ss')\n          }\n          break\n        case 'Turnover':\n        case 'Netwin':\n          if (cellValue !== null) {\n            cellValue = this.$options.filters.toThousandFilter(this.Precision.divide(cellValue, this.$store.getters.CurrencyRate))\n          }\n          break\n        case 'GameType':\n          if (cellValue) {\n            cellValue = this.$t(`GameType.${cellValue}`)\n          }\n          break\n        default:\n          break\n      }\n      return cellValue\n    },\n    pagination(data) {\n      if (this.isDataLoading) return\n      this.search.params.PageIndex = data.page\n      this.search.params.PageSize = data.limit\n      this.$nextTick(async () => {\n        await this.getGameBetRecord()\n      })\n    },\n    async getGameBetRecord() {\n      var formData = {\n        ProviderID: this.search.params.ProviderID,\n        GameTypeIDs: this.search.params.GameTypeID === -1 ? null : this.search.params.GameTypeID,\n        PageIndex: this.search.params.PageIndex,\n        PageSize: this.search.params.PageSize\n      }\n      this.isDataLoading = true\n      this.$nextTick(async () => {\n        const result = await API.Game.Get_GameBetRecord(formData)\n        if (result.ErrorCode === 0 && result.Data) {\n          this.table.Data = result.Data\n          this.table.TotalCount = result.Pagination.TotalCount\n        }\n        this.isDataLoading = false\n      })\n    },\n    async getProviderList() {\n      const result = await API.Game.Get_GameProviderList({ GameTypeID: null })\n      if (result.ErrorCode === 0 && result.Data) {\n        this.ProviderList = result.Data\n      }\n    },\n    async getGameTypeList(ProviderID) {\n      var formData = {\n        GameProviderID: ProviderID\n      }\n      this.isGameTypeLoading = true\n      const result = await API.Game.Get_GameTypeList(formData)\n      this.isGameTypeLoading = false\n      if (result.ErrorCode === 0 && result.Data) {\n        this.GameTypeList = result.Data\n      }\n    },\n    async onProviderSelectChange() {\n      this.search.params.GameTypeID = -1\n      await this.getGameTypeList(this.search.params.ProviderID)\n    },\n    submit() {\n      if (this.isDataLoading) return\n      this.search.params.PageIndex = 1\n      this.getGameBetRecord()\n    }\n  }\n}\n","import API from '../../api'\nimport { handleScreenlock } from '../../utils'\nimport { isEqual } from 'lodash'\n\nexport default {\n  inject: ['_', 'isSafari', 'playSound'],\n  name: 'Lobby',\n  data() {\n    return {\n      isLoading: false,\n      isProviderLoading: false,\n      isMenuExpand: false,\n      gameList: [],\n      GameTypeList: [],\n      GameProviderList: [],\n      logo: require(`@/assets/images/${process.env.VUE_APP_KEYWORD}/logo.webp`)\n    }\n  },\n  computed: {\n    token() {\n      return this.$store.getters.Token\n    },\n    favGames() {\n      return this.$store.getters.favGames\n    },\n    memberInfo() {\n      return this.$store.getters.MemberInfo\n    },\n    gameFilter() {\n      return this.$store.getters.GameFilter\n    },\n    ProviderInfo() {\n      return this.$store.getters.ProviderInfo\n    },\n    language() {\n      return this.$store.getters.language\n    }\n  },\n  watch: {\n    token: {\n      handler(val) {\n        if (val) {\n          this.getGameType()\n          this.initGameProviderList()\n          this.getGameList()\n        }\n      },\n      immediate: true\n    },\n    memberInfo: {\n      handler(newVal, oldVal) {\n        if (newVal && oldVal && newVal.Level !== oldVal.Level && oldVal.Type && this.token) {\n          this.getGameType()\n          this.initGameProviderList()\n          this.getGameList()\n        }\n      }\n    },\n    gameFilter: {\n      deep: true,\n      immediate: true,\n      handler(newVal, oldVal) {\n        if (!this.token) return\n        if (!oldVal) return\n        if (newVal?.gameType === oldVal?.gameType && newVal?.provider === oldVal?.provider) return\n\n        this.getGameList()\n      }\n    },\n    language(v) {\n      this.getGameList()\n    }\n  },\n  methods: {\n    getGameList() {\n      let ProviderID = this.gameFilter.providerId\n      const ProviderName = this.gameFilter.provider\n      let isTop50 = false\n      let isFav = false\n      if (ProviderName === 'all') {\n        ProviderID = undefined\n      }\n      if (ProviderName === 'top50') {\n        ProviderID = undefined\n        isTop50 = true\n      }\n      if (ProviderName === 'fav') {\n        ProviderID = undefined\n        isFav = true\n      }\n      var formData = {\n        ProviderID: ProviderID || null,\n        GameTypeIDs: this.gameFilter.gameType\n      }\n      this.gameList = []\n      this.isLoading = true\n      if (isTop50) {\n        API.Game.GetTop50Game({ GameTypeID: this.gameFilter.gameType ? this.gameFilter.gameType : undefined }).then(res => {\n          this.gameList = res.Data\n        }).finally(() => {\n          this.isLoading = false\n        })\n      } else {\n        API.Game.Get_GameList(formData).then(res => {\n          const { Data } = res\n          if (Data && Array.isArray(Data)) {\n            let list = []\n            if (isFav) list = this.handleFavData(Data)\n            else list = Data\n            this.gameList = list\n          }\n        }).finally(() => {\n          this.isLoading = false\n        })\n      }\n    },\n    openGame(obj) {\n      this.$track('開啟遊戲', {\n        event_category: 'click',\n        event_label: '開啟遊戲',\n        value: obj.GameID\n      })\n      var formData = {\n        GameID: obj.GameID,\n        IsDemo: obj.IsDemo\n      }\n      this.$store.commit('app/SET_ISLOADING', true)\n      API.Game.OpenGame(formData).then(res => {\n        this.$store.commit('app/SET_ISLOADING', false)\n        if (res.Data && res.Data.GameUrl !== '') {\n          handleScreenlock({\n            open: true,\n            orientation: obj.Orientation\n          })\n          this.$store.dispatch('app/setLaunchGame', res.Data)\n          this.$router.push({\n            // path: '/gameview',\n            name: 'GameView',\n            query: {\n              Orientation: obj.Orientation\n            }\n          })\n        }\n      }).catch(() => {\n        this.$store.commit('app/SET_ISLOADING', false)\n        console.log('error')\n      })\n    },\n    handleFavData(data) {\n      return this.favGames.reduce((acc, curr) => {\n        const findGame = data.find(game => game.GameID === curr)\n        if (findGame) return [...acc, findGame]\n        return acc\n      }, [])\n    },\n    handleAddFav(item) {\n      if (this.favGames.includes(item.GameID)) {\n        this.$store.dispatch('app/setFavGame', this.favGames.filter(id => id !== item.GameID))\n      } else {\n        this.$store.dispatch('app/setFavGame', [...this.favGames, item.GameID])\n      }\n    },\n    handleHeartClass(item) {\n      return {\n        active: this.favGames.includes(item.GameID)\n      }\n    },\n    handleGameTypeClass(type) {\n      switch (type) {\n        case 'Table Game':\n        case 'Card Game':\n          return 'table'\n        case 'Arcade Game Fisher':\n          return 'fisher'\n        case 'Arcade Game':\n          return 'arcade'\n        case 'Live Game':\n          return 'live'\n        case 'Slot Game':\n        default:\n          return 'slot'\n      }\n    },\n    handleMenuExpand() {\n      this.isMenuExpand = !this.isMenuExpand\n      this.playSound()\n    },\n    getGameType() {\n      this.isLoading = true\n      API.Game.Get_GameType().then(({ Data }) => {\n        if (Data) {\n          this.GameTypeList = Data\n          if (!Data.some(v => isEqual(v.GameTypeIDs, this.gameFilter.gameType))) {\n            this.$store.dispatch('app/setGameFilter', { ...this.gameFilter, gameType: null })\n          }\n        }\n      }).catch(() => {\n        console.log('error')\n      }).finally(() => {\n        this.isLoading = false\n      })\n    },\n    handleGameTypeIcon(type) {\n      if (type === 'Slot Game') return require('@/assets/images/lobby/slot.webp')\n      if (type === 'Arcade Game Fisher') return require('@/assets/images/lobby/fisher.webp')\n      if (type === 'Arcade Game') return require('@/assets/images/lobby/arcade.webp')\n      if (type === 'Live Game') return require('@/assets/images/lobby/LIVE.webp')\n      return require('@/assets/images/lobby/table.webp')\n    },\n    async onGameProviderClick(data) {\n      this.$track('GameFilter切換GameProvider', {\n        event_category: 'GameFilter',\n        event_label: 'GameFilter切換GameProvider',\n        value: this._.isString(data) ? data : data.ProviderName\n      })\n      this.$store.dispatch('app/setGameFilter', {\n        gameType: this._.isString(data) ? null : this.gameFilter.gameType,\n        provider: this._.isString(data) ? data : data.ProviderName,\n        providerId: this._.isString(data) ? null : data.ProviderID\n      })\n      this.isMenuExpand = false\n      this.playSound()\n    },\n    initGameProviderList() {\n      if (this.isProviderLoading) return\n      var formData = {\n        GameTypeIDs: this.gameFilter.gameType\n      }\n      this.isProviderLoading = true\n      API.Game.Get_GameProviderList(formData).then(res => {\n        if (res.Data && Array.isArray(res.Data) && res.Data.length > 0) {\n          this.GameProviderList = res.Data\n          this.$store.dispatch('app/setProviderList', res.Data)\n        } else {\n          this.GameProviderList = []\n          this.$store.dispatch('app/setProviderList', [])\n        }\n        if (this.gameFilter.providerId !== null && !res.Data.some(v => v.ProviderID === this.gameFilter.providerId)) {\n          this.$store.dispatch('app/setGameFilter', { ...this.gameFilter, provider: 'top50', providerId: null })\n        }\n      }).catch(() => {\n        console.log('error')\n      }).finally(() => {\n        this.isProviderLoading = false\n      })\n    },\n    onGameTypeClick(id) {\n      this.$track('GameFilter切換Gametype', {\n        event_category: 'GameFilter',\n        event_label: 'GameFilter切換Gametype',\n        value: id\n      })\n      this.$store.dispatch('app/setGameFilter', {\n        gameType: id,\n        provider: 'all',\n        providerId: null\n      })\n      if (!id) {\n        this.isMenuExpand = false\n      }\n      this.initGameProviderList()\n      this.playSound()\n    },\n    checkGameTypeActive(item) {\n      return isEqual(this.gameFilter.gameType, item.GameTypeIDs)\n    }\n  }\n}\n","export function track(name, options = {}) {\n  this.$gtag.event(name, options)\n  // this.$gtm.trackEvent({\n  //   event: null, // Event type [default = 'interaction'] (Optional)\n  //   category: options.event_category,\n  //   action: options.event_category,\n  //   label: name,\n  //   value: options.value,\n  // });\n}\n","import io from 'socket.io-client'\nimport store from '@/store'\n\nconst SocketManagerOptions = {\n  // path: 'socket.io', // string 在服務器端捕獲的路徑的名稱\n  reconnection: true, // boolean 是否自動重新連接\n  reconnectionAttempts: 10, // number 放棄之前重新連接嘗試的次數\n  reconnectionDelay: 1500, // number 嘗試重新連接(1000)之前最初等待的時間。受+/-影響randomizationFactor,例如,默認的初始延遲將在500到1500ms之間\n  randomizationFactor: 0.5, // number  0 <= randomizationFactor <= 1\n  reconnectionDelayMax: 5000, // number 兩次重新連接之間要等待的最長時間(5000)。每次嘗試都會使重新連接延遲增加2倍,並如上所述進行隨機分配\n  timeout: 180000, // number 發出connect_error 和connect_timeout事件之前的(Number)連接超時(20000)\n  autoConnect: false, // boolean 將此值設置為false,則您必須manager.open 在確定合適的時間進行調用\n  withCredentials: false\n  // query: '',// 連接名稱空間時發送的其他查詢參數(然後在socket.handshake.query服務器端的對像中找到)\n  // parser: '' // 要使用的解析器。默認為Parsersocket.io隨附的的實例。參見socket.io-parser。\n}\n\nconst install = function(Vue, options) {\n  var socket = io('', SocketManagerOptions)\n  Vue.prototype.$socket = socket\n}\n\nexport default { install }\n","import { validateEmoji } from '../../../validate'\nimport i18n from '@/language'\n\nconst emoji = {\n  validate(value, {}) {\n    return validateEmoji(value)\n  },\n  params: [],\n  message: () => i18n.t('Not Support Emoji')\n}\n\nconst strlength = {\n  validate(value, { min, max }) {\n    console.log(min, max)\n    return value.length >= min && value.length <= max\n  },\n  params: ['min', 'max'],\n  message: (fieldName, { min, max, _value_ }) => {\n    if (Number(min) === 0) {\n      min = 1\n    }\n    if (Number(max) === 0) {\n      max = 9999999\n    }\n\n    if (Number(min) !== 0) {\n      if (Number(_value_) < Number(min)) {\n        return i18n.t('Message.Msg.AmountLessThen', { Amount: min })\n      }\n    }\n    if (Number(max) !== 0) {\n      if (Number(_value_) > Number(max)) {\n        return i18n.t('Message.Msg.AmountGreaterThen', { Amount: max })\n      }\n    }\n  }\n}\n\nconst required = {\n  validate(value, {}) {\n    try {\n      value = value.toString()\n      return !!value\n    } catch (e) {\n      return false\n    }\n  },\n  params: [],\n  message: () => i18n.t('Shared.Required')\n}\n\nconst IntegerOnly = {\n  validate(value, {}) {\n    return /^[0-9]*$/g.test(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nexport {\n  emoji,\n  strlength,\n  required,\n  IntegerOnly\n}\n","import { validateContainLeastNumberAndLetter } from '../../../validate'\nimport i18n from '@/language'\n\nconst LoginAccount = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.AccountFormat')\n}\n\nconst LoginPassword = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.PwdFormat')\n}\n\nexport {\n  LoginAccount,\n  LoginPassword\n}\n","import { validateContainLeastNumberAndLetter } from '../../../validate'\nimport i18n from '@/language'\n\nconst RegisterAccount = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.AccountFormat')\n}\n\nconst RegisterPassword = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.PwdFormat')\n}\n\nconst Register_ReferrerAccount = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + i18n.t('Shared.Error')\n}\n\nexport {\n  RegisterAccount,\n  RegisterPassword,\n  Register_ReferrerAccount\n}\n","import { validator } from 'agmp-utility'\nimport { validateContainLeastNumberAndLetter } from '../../../validate'\nimport store from '@/store'\nimport i18n from '@/language'\n\n\nconst Account = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.AccountFormat')\n}\n\nconst PhoneNumber = {\n  validate(value, {}) {\n    return validator.validPhone(store.getters.LocationCode, value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nexport {\n  Account,\n  PhoneNumber\n}\n","import { validateContainLeastNumberAndLetter } from '../../../validate'\nimport i18n from '@/language'\n\nconst NewPassword = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.PwdFormat')\n}\n\nexport {\n  NewPassword\n}\n","import { validateEmoji } from '../../../validate'\nimport i18n from '@/language'\nimport _ from 'lodash'\n\nconst DepositBankAccount = {\n  validate(value, {}) {\n    return true\n  },\n  params: [],\n  message: ''\n}\n\nconst DepositMemo = {\n  validate(value, {}) {\n    return validateEmoji(value)\n  },\n  params: [],\n  message: ''\n}\n\nconst Deposit_Amount = {\n  validate(value, { min, max }) {\n    if (!/^[+-]?(?=.)(?:\\d+,)*\\d*(?:\\.\\d+)?$/g.test(value)) return false\n    if (Number(min) === 0) {\n      min = 1\n    }\n    if (Number(max) === 0) {\n      max = 9999999\n    }\n    var reg = Number(value) >= min && Number(value) <= max\n\n    return reg\n  },\n  params: ['min', 'max'],\n  message: (fieldName, { min, max, _value_ }) => {\n    if (!/^[+-]?(?=.)(?:\\d+,)*\\d*(?:\\.\\d+)?$/g.test(_value_)) return i18n.t('Shared.Amount') + i18n.t('Shared.Error')\n    if (Number(min) === 0) {\n      min = 1\n    }\n    if (Number(max) === 0) {\n      max = 9999999\n    }\n\n    if (Number(min) !== 0) {\n      if (Number(_value_) < Number(min)) {\n        return i18n.t('Message.Msg.AmountLessThen', { Amount: min })\n      }\n    }\n    if (Number(max) !== 0) {\n      if (Number(_value_) > Number(max)) {\n        return i18n.t('Message.Msg.AmountGreaterThen', { Amount: max })\n      }\n    }\n  }\n}\n\nexport {\n  DepositBankAccount,\n  DepositMemo,\n  Deposit_Amount\n}\n","import { validateEmoji } from '../../../validate'\nimport i18n from '@/language'\nimport _ from 'lodash'\n\nconst WithdrawBankAccount = {\n  validate(value, {}) {\n    return true\n  },\n  params: [],\n  message: ''\n}\n\nconst WithdrawMemo = {\n  validate(value, {}) {\n    return validateEmoji(value)\n  },\n  params: [],\n  message: ''\n}\n\nconst Withdraw_Amount = {\n  validate(value, { min, max }) {\n    if (!/^[+-]?(?=.)(?:\\d+,)*\\d*(?:\\.\\d+)?$/g.test(value)) return false\n    if (Number(min) === 0) {\n      min = 1\n    }\n    if (Number(max) === 0) {\n      max = 9999999\n    }\n    var reg = Number(value) >= min && Number(value) <= max\n    return reg\n  },\n  params: ['min', 'max'],\n  message: (fieldName, { min, max, _value_ }) => {\n    if (!/^[+-]?(?=.)(?:\\d+,)*\\d*(?:\\.\\d+)?$/g.test(_value_)) return i18n.t('Shared.Amount') + i18n.t('Shared.Error')\n    if (Number(min) === 0) {\n      min = 1\n    }\n    if (Number(max) === 0) {\n      max = 9999999\n    }\n\n    if (Number(min) !== 0) {\n      if (Number(_value_) < Number(min)) {\n        return i18n.t('Message.Msg.AmountLessThen', { Amount: min })\n      }\n    }\n    if (Number(max) !== 0) {\n      if (Number(_value_) > Number(max)) {\n        return i18n.t('Message.Msg.AmountGreaterThen', { Amount: max })\n      }\n    }\n  }\n}\n\nexport {\n  WithdrawBankAccount,\n  WithdrawMemo,\n  Withdraw_Amount\n}\n","import { validEnAndNum, validateContainLeastNumberAndLetter } from '../../../validate'\nimport i18n from '@/language'\n\nconst BindAccount_Account = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.AccountFormat')\n}\n\nconst BindAccount_Password = {\n  validate(value, {}) {\n    return validateContainLeastNumberAndLetter(value)\n  },\n  params: [],\n  message: () => i18n.t('Message.Msg.PwdFormat')\n}\n\nexport {\n  BindAccount_Account,\n  BindAccount_Password\n}\n","import {\n  validateBirthday,\n  validEmail,\n  validateEmoji,\n  validTrueName\n} from '../../../validate'\nimport i18n from '@/language'\nimport store from '@/store'\nimport { validator } from 'agmp-utility'\n\nconst DetailInfo_Name = {\n  validate(value, {}) {\n    return validTrueName(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_Birthday = {\n  validate(value, {}) {\n    return validateBirthday(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_IDNumber = {\n  validate(value, {}) {\n    return validateEmoji(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_Phone = {\n  validate(value, {}) {\n    return validator.validPhone(store.getters.LocationCode, value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_Verify = {\n  validate(value, {}) {\n    return /^[0-9]{6,6}$/g.test(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_BankAccount = {\n  validate(value, {}) {\n    return validator.validBankAccount(store.getters.LocationCode, value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nconst DetailInfo_Email = {\n  validate(value, {}) {\n    return validEmail(value)\n  },\n  params: [],\n  message: () => i18n.t('Shared.Format') + ' ' + i18n.t('Shared.Error')\n}\n\nexport {\n  DetailInfo_Name,\n  DetailInfo_Birthday,\n  DetailInfo_IDNumber,\n  DetailInfo_Phone,\n  DetailInfo_Verify,\n  DetailInfo_BankAccount,\n  DetailInfo_Email\n}\n","import API from '../../api'\n\nimport { v4 as uuidV4 } from 'uuid'\n\nimport { MessageBox } from 'element-ui'\n\nimport ClickOutside from 'vue-click-outside'\n\nexport default {\n  inject: ['checkUserNotificationIsEnabled', '_'],\n  directives: {\n    ClickOutside\n  },\n  name: 'LogIn',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  data() {\n    return {\n      isLogin: false,\n      keyword: process.env.VUE_APP_KEYWORD,\n      result: {\n        itemObject: null\n      },\n      form: {\n        Account: '',\n        Password: '',\n        email: ''\n      },\n      login: {},\n      isPwdShow: false,\n      eyeIcon: require('@/assets/images/common/eye.svg'),\n      eyeOpenIcon: require('@/assets/images/common/eye-open.svg'),\n      dialog: {\n        register: {\n          name: 'register',\n          locale: 'Register',\n          show: false,\n          itemObject: null\n        },\n        forgotPassword: {\n          name: 'forgotPassword',\n          locale: 'ForgotPassword',\n          show: false,\n          itemObject: null\n        }\n      },\n      isContactShow: false,\n      contactInfo: [],\n      isLivechatOpen: false,\n      isZendeskLoaded: false\n    }\n  },\n  computed: {\n    isMemberInfoLoading() {\n      return this.$store.state.user.isMemberInfoLoading\n    },\n    contactList() {\n      return this.contactInfo.filter(item => ['Line@', 'LiveChat', 'Zendesk', 'Viber', 'Tawk', 'JivoChat', 'Telegram', 'Custom'].includes(item.Name) && item.Status === 1)\n    },\n    liveChatInfo() {\n      if (!this.contactInfo) return {}\n      const find = this.contactInfo.find(item => item.Name === 'LiveChat')\n      return (find && find.Status === 1 ? find : {})\n    }\n  },\n  watch: {\n    isMemberInfoLoading(val) {\n      if (val) {\n        this.$store.commit('app/SET_ISLOADING', true)\n      } else {\n        this.$store.commit('app/SET_ISLOADING', false)\n        this.close()\n      }\n    },\n    zendeskInfo: {\n      deep: true,\n      handler(val) {\n        if (this._.isEmpty(val)) return\n\n        this.$zendesk.load(val.ContactInfo)\n        this.$zendesk.$on('loaded', () => {\n          this.$zendesk.zE('webWidget:on', 'close', () => {\n            this.$zendesk.hide()\n          })\n        })\n      }\n    }\n  },\n  created() {\n  },\n  mounted() {\n    if (!this.$store.getters.AgentCode) {\n      this.$message.error({\n        message: 'No Agent Code'\n      })\n      this.$router.push('/')\n    }\n    if (this.itemObject && this.itemObject.cmd !== undefined && this.itemObject.cmd === 'referrer') {\n      this.openDialog(this.itemObject, 'register')\n    }\n    this.getContactInfo()\n  },\n  methods: {\n    openDialog(entry, action) {\n      switch (action) {\n        case 'register':\n          this.dialog.register.show = true\n          this.dialog.register.itemObject = entry\n          break\n        case 'forgotPassword':\n          this.dialog.forgotPassword.show = true\n          break\n      }\n    },\n    async getContactInfo() {\n      const res = await API.Community.Get_CommunityLink()\n      if (res.ErrorCode === 0) {\n        this.contactInfo = res.Data\n      }\n    },\n    closeDialog(dialogName, result) {\n      switch (dialogName) {\n        case 'register':\n          var self = this\n          if (result.itemObject && result.itemObject.type === 'register') {\n            this.form.Account = result.itemObject.Account\n            this.form.Password = result.itemObject.Password\n            // loading\n            this.$nextTick(async () => {\n              await this.normalLogin()\n            })\n          }\n          break\n        case 'forgotPassword':\n          break\n      }\n    },\n    close() {\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    normalLogin() {\n      this.$refs.form.validate().then(async valid => {\n        if (valid) {\n          var formData = {\n            Action: 'Account',\n            AccountInfo: {\n              Account: this.form.Account,\n              Password: this.form.Password\n            },\n            OauthInfo: {\n              Token: ''\n            },\n            DeviceInfo: {\n              DeviceID: ''\n            },\n            AgentCode: this.$store.getters.AgentCode\n          }\n          // loading\n          this.$store.commit('app/SET_ISLOADING', true)\n          const result = await API.User.Login(formData)\n          if (result.ErrorCode === 0) {\n            this.$track('一般登入', {\n              event_category: 'Login',\n              event_label: '一般登入'\n            })\n            await this.$store.dispatch('user/setToken', result.Data.tn)\n            this.checkUserNotificationIsEnabled()\n          } else if (result.ErrorCode === 900065) {\n            this.$store.commit('app/SET_ISLOADING', false)\n            MessageBox.confirm(result.Data.Tips, '', {\n              confirmButtonText: this.$t('Shared.Confirm'),\n              cancelButtonText: this.$t('Shared.Cancel')\n            }).then(res => {\n              // 執行切換 並自動登入\n              const agent = result.Data.AgentCode\n              this.$store.dispatch('user/setAgentCode', agent)\n              console.log('切換渠道的AgentCode ===> ', agent)\n              API.System.CheckAgentCode({ AgentCode: result.Data.AgentCode })\n                .then(res => {\n                  this.$store.dispatch('app/setLocationID', res.Data.LocationID)\n                  this.$store.dispatch('app/setLocationCode', res.Data.LocationCode.toLowerCase())\n                  this.normalLogin()\n                })\n            }).catch(() => {\n              // 不執行 維持原樣\n            })\n          } else {\n            this.$store.commit('app/SET_ISLOADING', false)\n          }\n        } else {\n          console.log('error')\n        }\n      })\n    },\n    lineLogin() {\n    },\n    faceBookLogin() {\n      this.$track('Facebook登入', {\n        event_category: 'Login',\n        event_label: 'Fackbook登入'\n      })\n      const vm = this\n      // 檢查登入狀態\n      this.$store.commit('app/SET_ISLOADING', true)\n      try {\n        window.FB.getLoginStatus(function(response) {\n          // 登入狀態 - 已登入\n          if (response.status === 'connected') {\n            // 獲取用戶個人資料\n            vm.getFBProfile()\n            // 登入\n            // console.log(window.localStorage.getItem('FBInfo'))\n            var accessToken = window.FB.getAccessToken()\n            var formData = {\n              Action: 'FB',\n              AccountInfo: {\n                Account: '',\n                Password: ''\n              },\n              OauthInfo: {\n                Token: accessToken\n              },\n              DeviceInfo: {\n                DeviceID: ''\n              },\n              AgentCode: vm.$store.getters.AgentCode\n            }\n            vm.$nextTick(async () => {\n              const result = await API.User.Login(formData)\n              if (result.ErrorCode === 0) {\n                await vm.$store.dispatch('user/setToken', result.Data.tn)\n                // 撈取個人資訊\n                // 獲取用戶個人資料\n                vm.getFBProfile()\n                vm.$message.success({\n                  message: 'Facebook ' + vm.$t('Shared.Login') + ' ' + vm.$t('Shared.Success')\n                })\n                if (result.Data?.isNewMember) {\n                  vm.$router.replace(\n                    {\n                      query: {\n                        register: true\n                      }\n                    }\n                  )\n                }\n              } else if (result.ErrorCode === 900065) {\n                vm.$store.commit('app/SET_ISLOADING', false)\n                console.log('login, AccessToken:', accessToken)\n                await vm.FBCreateCheck(result.Data.IsCreate, accessToken, result.Data.AgentCode, result.Data.Tips)\n              } else {\n                vm.$store.commit('app/SET_ISLOADING', false)\n                // 失敗跑FB logout\n                vm.faceBookLogout()\n              }\n            })\n          } else {\n            // 登入狀態 - 未登入\n            // 用戶登入(確認授權)\n            window.FB.login(\n              function(res) {\n                console.log(res)\n                const { authResponse } = res\n                if (!authResponse?.accessToken) {\n                  vm.$message.error(`Facebook ${vm.$t('Shared.Login')} ${vm.$t('Shared.Fail')}`)\n                  vm.$store.commit('app/SET_ISLOADING', false)\n                  vm.faceBookLogout()\n                  return\n                }\n                var formData = {\n                  Action: 'FB',\n                  AccountInfo: {\n                    Account: '',\n                    Password: ''\n                  },\n                  OauthInfo: {\n                    Token: authResponse.accessToken\n                  },\n                  DeviceInfo: {\n                    DeviceID: ''\n                  },\n                  AgentCode: vm.$store.getters.AgentCode\n                }\n                vm.$nextTick(async () => {\n                  const result = await API.User.Login(formData)\n                  if (result.ErrorCode === 0) {\n                    await vm.$store.dispatch('user/setToken', result.Data.tn)\n                    // 撈取個人資訊\n                    // 獲取用戶個人資料\n                    vm.getFBProfile()\n                    vm.$message.success({\n                      message: 'Facebook ' + vm.$t('Shared.Login') + ' ' + vm.$t('Shared.Success')\n                    })\n                    if (result.Data?.isNewMember) {\n                      vm.$router.replace(\n                        {\n                          query: {\n                            register: true\n                          }\n                        }\n                      )\n                    }\n                  } else if (result.ErrorCode === 900065) {\n                    console.log('Not login, AccessToken:', authResponse.accessToken)\n                    await vm.FBCreateCheck(result.Data.IsCreate, authResponse.accessToken, result.Data.AgentCode, result.Data.Tips)\n                    vm.$store.commit('app/SET_ISLOADING', false)\n                  } else {\n                    // 失敗跑FB logout\n                    vm.faceBookLogout()\n                    vm.$store.commit('app/SET_ISLOADING', false)\n                  }\n                })\n              },\n              // 授權 - 個人資料&Email\n              { scope: 'public_profile,email' }\n            )\n          }\n        })\n      } catch (err) {\n        console.log('FB Login Error', err)\n        this.$message.error(`Facebook ${this.$t('Shared.Login')} ${this.$t('Shared.Fail')}`)\n        this.$store.commit('app/SET_ISLOADING', false)\n        this.faceBookLogout()\n      }\n    },\n    faceBookLogout() {\n      // 檢查登入狀態\n      window.FB.getLoginStatus(function(response) {\n        // 檢查登入狀態\n        if (response.status === 'connected') {\n          // 移除授權\n          // window.FB.api('/me/permissions', 'DELETE', function(res) {\n          // 用戶登出\n          window.FB.logout(function(response) {\n            console.log(response)\n          })\n          // })\n        } else {\n          // do something\n        }\n      })\n    },\n    async FBCreateCheck(IsCreate, Token, AgentCode, msg) {\n      var vm = this\n      if (IsCreate) {\n        MessageBox.confirm(msg, '', {\n          confirmButtonText: vm.$t('Shared.Confirm'),\n          cancelButtonText: vm.$t('Shared.Create') + vm.$t('Shared.Account'),\n          showClose: false,\n          closeOnClickModal: false,\n          closeOnPressEscape: false\n        }).then(async res => {\n          // 執行切換 並自動登入\n          vm.$store.dispatch('user/setAgentCode', AgentCode)\n          API.System.CheckAgentCode({ AgentCode })\n            .then(res => {\n              this.$store.dispatch('app/setLocationID', res.Data.LocationID)\n              this.$store.dispatch('app/setLocationCode', res.Data.LocationCode.toLowerCase())\n              vm.faceBookLogin()\n            })\n        }).catch(async () => {\n          // 執行建立帳號\n          vm.$store.commit('app/SET_ISLOADING', true)\n          const FBCreateResult = await API.User.FBAccountCreate({\n            Token: Token\n          })\n          if (FBCreateResult.ErrorCode === 0) {\n            // 不執行切換渠道但要跑FBLogin\n            vm.$router.replace(\n              {\n                query: {\n                  register: true\n                }\n              }\n            )\n            vm.faceBookLogin()\n          }\n          vm.$store.commit('app/SET_ISLOADING', false)\n        })\n      } else {\n        MessageBox.confirm(msg, '', {\n          confirmButtonText: vm.$t('Shared.Confirm'),\n          cancelButtonText: vm.$t('Shared.Cancel')\n        }).then(res => {\n          // 執行切換 並自動登入\n          vm.$store.dispatch('user/setAgentCode', AgentCode)\n          // console.log('切換渠道的AgentCode ===> ', agent)\n          vm.faceBookLogin()\n        }).catch(() => {\n          // 不執行 維持原樣\n          vm.$store.commit('app/SET_ISLOADING', false)\n        })\n      }\n    },\n    getFBProfile() {\n      var self = this\n      window.FB.api('/me?fields=name,id,email,picture', function(res) {\n        self.$store.dispatch('user/setFBInfo', res)\n      })\n    },\n    autoGetFBProfile() {\n      const vm = this\n      window.FB.getLoginStatus(res => {\n        if (res.status === 'connected') {\n          console.log('connected:', res)\n          vm.$nextTick(async () => {\n            vm.getFBProfile()\n          })\n        } else {\n          window.FB.login(\n            function(res) {\n              const { authResponse } = res\n              if (authResponse.userID === vm.$store.getters.MemberInfo.FBID) {\n                vm.$nextTick(async () => {\n                  vm.getFBProfile()\n                })\n              }\n            },\n            { scope: 'public_profile,email' }\n          )\n        }\n      })\n    },\n    quickLogin() {\n      this.$track('快速登入', {\n        event_category: 'Login',\n        event_label: '快速登入'\n      })\n      this.$nextTick(async () => {\n        var deviceID = uuidV4()\n        var formData = {\n          Action: 'Quick',\n          AccountInfo: {\n            Account: this.form.Account,\n            Password: this.form.Password\n          },\n          OauthInfo: {\n            Token: ''\n          },\n          DeviceInfo: {\n            DeviceID: deviceID\n          },\n          AgentCode: this.$store.getters.AgentCode\n        }\n        // loading\n        this.$store.commit('app/SET_ISLOADING', true)\n        const result = await API.User.Login(formData)\n        if (result.ErrorCode === 0) {\n          await this.$store.dispatch('user/setDeviceID', deviceID)\n          await this.$store.dispatch('user/setToken', result.Data.tn)\n          // 撈取個人資訊\n          this.checkUserNotificationIsEnabled()\n          // get wallet\n          this.close()\n        } else {\n          console.log('error')\n        }\n        this.$store.commit('app/SET_ISLOADING', false)\n      })\n    },\n    openSignUp() {\n      this.$track('打開註冊頁', {\n        event_category: 'click',\n        event_label: '打開註冊頁'\n      })\n      this.openDialog(null, 'register')\n    },\n    openForgotPwd() {\n      this.$track('打開忘記密碼頁', {\n        event_category: 'click',\n        event_label: '打開忘記密碼頁'\n      })\n      this.openDialog(null, 'forgotPassword')\n    },\n    handleOpenLiveChat() {\n      if (window.LiveChatWidget && window.LiveChatWidget.call) {\n        if (this.isLivechatOpen) {\n          console.log('close live chat')\n          window.LiveChatWidget.call('hide')\n          this.isLivechatOpen = false\n          window.LiveChatWidget.off('visibility_changed', this.handleLiveChatChange)\n        } else {\n          console.log('open live chat')\n          window.LiveChatWidget.call('maximize')\n          this.isLivechatOpen = true\n          window.LiveChatWidget.on('visibility_changed', this.handleLiveChatChange)\n        }\n      }\n    },\n    handleLiveChatChange(params) {\n      console.log('live chat change', params)\n      if (params.visibility === 'minimized') {\n        console.log('close live chat', params)\n        window.LiveChatWidget.call('hide')\n        this.isLivechatOpen = false\n        window.LiveChatWidget.off('visibility_changed', this.handleLiveChatChange)\n      }\n    },\n    handleContactShow() {\n      this.isContactShow = !this.isContactShow\n    },\n    hide(e) {\n      if (e.target.className === 'contact') return\n      this.isContactShow = false\n    },\n    handleContactImage(data) {\n      switch (data.Name) {\n        case 'Line@':\n          return require('@/assets/images/common/line@.webp')\n        case 'LiveChat':\n          return require('@/assets/images/common/livechat.webp')\n        case 'Zendesk':\n          return require('@/assets/images/common/zendesk.webp')\n        case 'Viber':\n          return require('@/assets/images/common/Viber.webp')\n        case 'Tawk':\n          return require('@/assets/images/common/Tawk.webp')\n        case 'JivoChat':\n          return require('@/assets/images/common/jivochat.webp')\n        case 'Telegram':\n          return require('@/assets/images/common/tg.webp')\n        case 'Custom':\n          return data.ContactImage\n      }\n    },\n    handleContact(data) {\n      switch (data.Name) {\n        case 'Line@':\n        case 'Viber':\n        case 'Tawk':\n        case 'JivoChat':\n        case 'Telegram':\n        case 'Custom':\n          window.open(data.ContactUrl || '')\n          break\n        case 'LiveChat':\n          this.handleOpenLiveChat()\n          break\n        case 'Zendesk':\n          this.$zendesk.show()\n          this.$zendesk.zE('webWidget', 'open')\n      }\n      this.isContactShow = false\n    }\n  }\n}\n\n","import API from '../../api'\nimport { handleScreenlock, isAndroid } from '../../utils'\nimport screenfull from 'screenfull'\nimport { MessageBox } from 'element-ui'\nexport default {\n  inject: ['getVersion', 'BGMPlay', 'BGMPause', '_', 'runWebSocket', 'closeSocket'],\n  name: 'Lobby',\n  data() {\n    return {\n      keyword: process.env.VUE_APP_KEYWORD,\n      isFullscreen: true,\n      isMusicPlay: true,\n      otherParams: null,\n      LetItSnowShow: false,\n      dialog: {\n        login: {\n          name: 'login',\n          locale: 'Login',\n          show: false,\n          itemObject: null\n        },\n        setting: {\n          name: 'setting',\n          locale: 'Setting',\n          show: false,\n          itemObject: null\n        },\n        promotion: {\n          name: 'promotion',\n          locale: 'Promotion',\n          show: false,\n          itemObject: null\n        },\n        mission: {\n          name: 'mission',\n          locale: 'Mission',\n          show: false,\n          itemObject: null\n        },\n        champion: {\n          name: 'champion',\n          locale: 'Champion',\n          show: false,\n          itemObject: null\n        },\n        announcement: {\n          name: 'announcement',\n          locale: 'announcement',\n          show: false,\n          itemObject: null\n        },\n        wallet: {\n          name: 'wallet',\n          locale: 'Wallet',\n          show: false,\n          itemObject: null\n        },\n        betRecord: {\n          name: 'betRecord',\n          locale: 'BetRecord',\n          show: false,\n          itemObject: null\n        },\n        specialOfferOverview: {\n          name: 'specialOfferOverview',\n          locale: 'specialOfferOverview',\n          show: false,\n          itemObject: null\n        },\n        advertisement: {\n          name: 'advertisement',\n          locale: 'Advertisement',\n          show: false,\n          itemObject: null\n        },\n        profile: {\n          name: 'profile',\n          locale: 'Profile',\n          show: false,\n          itemObject: null\n        },\n        leaderboard: {\n          name: 'leaderboard',\n          locale: 'LeaderBoard',\n          show: false,\n          itemObject: null\n        },\n        lottery: {\n          name: 'lottery',\n          locale: 'Lottery',\n          show: false,\n          itemObject: null\n        },\n        diamondshop: {\n          name: 'diamondshop',\n          locale: 'diamondshop',\n          show: false,\n          itemObject: null\n        },\n        otpvertify: {\n          name: 'otpvertify',\n          locale: 'otpvertify',\n          show: false,\n          itemObject: null\n        },\n        promoCode: {\n          name: 'promoCode',\n          locale: 'promoCode',\n          show: false,\n          itemObject: null\n        }\n      }\n    }\n  },\n  computed: {\n    token() {\n      return this.$store.getters.Token\n    },\n    memberInfo() {\n      return this.$store.getters.MemberInfo\n    }\n  },\n  watch: {\n    $route: {\n      handler: function(route) {\n        const params = route.params\n        if (params) {\n          this.otherParams = this.getOtherParams(params)\n          if (this.$store.getters.Token && this.otherParams.To === 'Advertisement') {\n            var formData = {}\n            API.Message.Get_AdvertisementList(formData).then(res => {\n              const { Data } = res\n              if (Data && Array.isArray(Data) && Data.length > 0) {\n                // 登入視窗關閉 打開廣告視窗\n                this.openDialog(Data, 'advertisement')\n              }\n            }).catch(() => {\n              console.log('error')\n            })\n          }\n        }\n      },\n      immediate: true\n    },\n    isFullscreen(val) {\n      if (!val && isAndroid()) {\n        MessageBox.alert(this.$t('Shared.FullScreenMode'), '', {\n          confirmButtonText: this.$t('Shared.Confirm'),\n          callback: async action => {\n            handleScreenlock()\n          }\n        })\n      }\n    },\n    memberInfo: {\n      handler: function(newVal, oldVal) {\n        if (this.token) {\n          if (newVal.PhoneNumber !== oldVal?.PhoneNumber && !newVal.PhoneNumber) {\n            this.openDialog(null, 'otpvertify')\n          }\n        }\n      },\n      immediate: true,\n      deep: true\n    }\n  },\n  created() {\n  },\n  mounted() {\n    var self = this\n    // 檢查音樂\n    if (Number(this.$store.state.app.isBGMEnable)) {\n      this.BGMPlay()\n    } else {\n      this.BGMPause()\n    }\n\n    this.$nextTick(async () => {\n      // 檢查有無推薦人QueryString\n      await this.checkReferrerUrl()\n    })\n\n    screenfull.on('change', this.handleScreenChange)\n    if (isAndroid() && screenfull.isEnabled && screen.orientation.angle === 0 && screen.orientation.angle === 180) {\n      MessageBox.alert(this.$t('Shared.FullScreenMode'), '', {\n        confirmButtonText: this.$t('Shared.Confirm'),\n        callback: async action => {\n          handleScreenlock()\n        }\n      })\n    }\n  },\n  beforeDestroy() {\n    screenfull.off('change', this.handleScreenChange)\n  },\n  methods: {\n    checkToken() {\n      if (this.$store.getters.Token === null || this.$store.getters.Token === '') {\n        this.openDialog(null, 'login')\n      }\n    },\n    getOtherParams(params) {\n      return Object.keys(params).reduce((acc, cur) => {\n        if (cur !== 'redirect') {\n          acc[cur] = params[cur]\n        }\n        return acc\n      }, {})\n    },\n    async checkReferrerUrl() {\n      var qs = this.$route.query\n      if (qs.cmd !== undefined && qs.cmd === 'referrer') {\n        const item = {\n          ac: qs.ac,\n          m: qs.m,\n          cmd: qs.cmd,\n          token: qs.token\n        }\n        await this.$store.dispatch('user/setRefLinkData', item)\n        await this.$router.push('/slots')\n        this.openDialog(item, 'login')\n      } else {\n        // 檢查Token\n        this.checkToken()\n      }\n    },\n    openDialog(entry, action) {\n      // var self = this\n      switch (action) {\n        case 'login':\n          this.dialog.login.show = true\n          this.dialog.login.itemObject = entry\n          break\n        case 'setting':\n          this.dialog.setting.show = true\n          this.dialog.setting.itemObject = entry\n          this.$track('打開設定頁', {\n            event_category: 'click',\n            event_label: '打開設定頁'\n          })\n          break\n        case 'promotion':\n          this.dialog.promotion.show = true\n          this.dialog.promotion.itemObject = entry\n          this.$track('打開活動看板', {\n            event_category: 'click',\n            event_label: '打開活動看板'\n          })\n          break\n        case 'mission':\n          this.dialog.mission.show = true\n          this.$track('打開每日任務', {\n            event_category: 'click',\n            event_label: '打開每日任務'\n          })\n          break\n        case 'champion':\n          this.dialog.champion.show = true\n          break\n        case 'announcement':\n          this.dialog.announcement.show = true\n          this.$track('打開系統公告', {\n            event_category: 'click',\n            event_label: '打開系統公告'\n          })\n          break\n        case 'wallet':\n          if (this.$store.getters.IsAvoidFlow) return\n          this.dialog.wallet.show = true\n          this.dialog.wallet.itemObject = entry\n          this.$track('打開錢包', {\n            event_category: 'click',\n            event_label: '打開錢包'\n          })\n          break\n        case 'betRecord':\n          this.dialog.betRecord.show = true\n          this.$track('打開下注紀錄', {\n            event_category: 'click',\n            event_label: '打開下注紀錄'\n          })\n          break\n        case 'specialOfferOverview':\n          this.dialog.specialOfferOverview.show = true\n          this.dialog.specialOfferOverview.itemObject = entry\n          this.$track('打開存款贈總覽', {\n            event_category: 'click',\n            event_label: '打開存款贈總覽'\n          })\n          break\n        case 'profile':\n          this.dialog.profile.show = true\n          this.dialog.profile.itemObject = entry\n          this.$track('打開個人資料', {\n            event_category: 'click',\n            event_label: '打開個人資料'\n          })\n          break\n        case 'lottery':\n          this.dialog.lottery.show = true\n          this.$track('打開抽獎頁', {\n            event_category: 'click',\n            event_label: '打開抽獎頁'\n          })\n          break\n        case 'diamondshop':\n          this.dialog.diamondshop.show = true\n          this.$track('打開鑽石商城', {\n            event_category: 'click',\n            event_label: '打開鑽石商城'\n          })\n          break\n        case 'advertisement':\n          this.dialog.advertisement.show = true\n          this.dialog.advertisement.itemObject = entry\n          break\n        case 'leaderboard':\n          this.dialog.leaderboard.show = true\n          break\n        case 'otpvertify':\n          this.dialog.otpvertify.show = true\n          break\n        case 'promoCode':\n          this.$track('打開優惠碼頁面', {\n            event_category: 'click',\n            event_label: '打開優惠碼頁面'\n          })\n          this.dialog.promoCode.show = true\n          break\n      }\n    },\n    closeDialog(dialogName, result) {\n      var obj = {}\n      switch (dialogName) {\n        case 'login':\n          var formData = {}\n          this.$store.commit('app/SET_ISLOADING', true)\n          API.Message.Get_AdvertisementList(formData).then(res => {\n            this.$store.commit('app/SET_ISLOADING', false)\n            const { Data } = res\n            if (Data && Array.isArray(Data) && Data.length > 0) {\n              // 登入視窗關閉 打開廣告視窗\n              this.openDialog(Data, 'advertisement')\n            }\n          }).catch(() => {\n            this.$store.commit('app/SET_ISLOADING', false)\n            console.log('error')\n          })\n          break\n        case 'setting':\n          break\n        case 'promotion':\n          obj = result.itemObject\n          if (obj && obj.action === 'openDialog' && obj.from === 'promotion' && obj.to === 'DetailInfo') {\n            this.openDialog(obj, 'profile')\n            break\n          }\n          if (obj && obj.action === 'openDialog' && obj.from === 'SpecialOffer' && obj.to === 'Deposit') {\n            this.openDialog(obj, 'wallet')\n            break\n          }\n          if (obj && obj.action === 'openDialog' && obj.from === 'promotion' && obj.to === 'lottery') {\n            this.openDialog(obj, 'lottery')\n            break\n          }\n          this.$store.dispatch('wallet/getCheckPromotion')\n          break\n        case 'mission':\n          obj = result.itemObject\n          if (obj && obj.action === 'openDialog' && obj.from === 'mission' && obj.to === 'DetailInfo') {\n            this.openDialog(obj, 'profile')\n            break\n          }\n          this.$store.dispatch('dailyMission/getHasReward')\n          break\n        case 'champion':\n          break\n        case 'announcement':\n          this.$store.dispatch('systemMail/getHasNoRead')\n          break\n        case 'leaderboard':\n          break\n        case 'wallet':\n          obj = result.itemObject\n          if (obj && obj.action === 'openDialog' && obj.from === 'wallet' && obj.to === 'DetailInfo') {\n            this.openDialog(obj, 'profile')\n          }\n          if (obj && obj.action === 'openDialog' && obj.from === 'wallet' && obj.to === 'promotion') {\n            this.openDialog(obj, 'promotion')\n          }\n          if (obj && obj.action === 'openDialog' && obj.from === 'wallet' && obj.to === 'specialOfferOverview') {\n            this.openDialog(obj, 'specialOfferOverview')\n          }\n          break\n        case 'betRecord':\n          break\n        case 'specialOfferOverview':\n          obj = result.itemObject\n          if (obj && obj.action === 'openDialog' && obj.from === 'SpecialOffer' && obj.to === 'Deposit') {\n            this.openDialog(obj, 'wallet')\n            break\n          }\n          if (obj && obj.action === 'openDialog' && obj.from === 'SpecialOffer' && obj.to === 'DetailInfo') {\n            this.openDialog(obj, 'setting')\n            break\n          }\n          break\n        case 'advertisement':\n          if (result.itemObject !== null && result.itemObject !== undefined) {\n            this.$track('點擊廣告', {\n              event_category: 'click',\n              event_label: '點擊廣告'\n            })\n            switch (result.itemObject.keyword) {\n              case 'activityboard':\n                // 活動看板\n                this.openDialog(null, 'promotion')\n                break\n              case 'missionboard':\n                // 任務看板\n                this.openDialog(null, 'mission')\n                break\n              case 'depositpackage':\n                // 存款頁\n                this.openDialog(null, 'wallet')\n                break\n              case 'service':\n                // 客服中心\n                // TODO:還沒有客服中心\n                this.openDialog(null, '')\n                break\n              case 'depositactivity':\n                // 存款贈\n                this.openDialog({ type: 7 }, 'promotion')\n                break\n              case 'lottery':\n                // 抽獎活動\n                this.openDialog(null, 'lottery')\n                break\n              case 'link':\n                // 開啟鏈結\n                window.open(result.itemObject.url, '_blank')\n                break\n            }\n          }\n          break\n        case 'profile':\n          obj = result\n          if (['wallet', 'Deposit'].includes(obj?.to)) {\n            this.openDialog(obj, 'wallet')\n            break\n          }\n          if (result?.to === 'Promotion') {\n            this.openDialog(result, 'promotion')\n            break\n          }\n          if (result?.to === 'Lottery') {\n            this.openDialog(result, 'lottery')\n            break\n          }\n          if (obj?.to === 'diamondShop') {\n            this.openDialog(obj, 'diamondshop')\n            break\n          }\n          break\n        case 'lottery':\n          this.$store.dispatch('user/getHasLottery')\n          break\n        case 'diamondshop':\n          this.$store.dispatch('user/getHasDiamondShop')\n          break\n        case 'promoCode':\n          if (result?.to === 'Deposit') {\n            this.openDialog(result, 'wallet')\n          } else if (result?.to === 'Promotion') {\n            this.openDialog(result, 'promotion')\n          } else if (result?.to === 'Lottery') {\n            this.openDialog(result, 'lottery')\n          }\n          break\n      }\n      if (this.$store.getters.Token !== null && this.$store.getters.Token !== '' && dialogName !== 'login') {\n        this.$store.dispatch('user/getWallet')\n      }\n    },\n    handleScreenChange() {\n      this.isFullscreen = screenfull.isFullscreen\n    }\n  }\n}\n","import API from '../../api'\nimport imageCompression from 'browser-image-compression'\nimport { validator } from 'agmp-utility'\n\nexport default {\n  inject: ['moment'],\n  name: 'DetailInfo',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  data() {\n    return {\n      form: {\n        Name: null,\n        Birthday: '0000-00-00',\n        // IdNumber: null,\n        PhoneNumber: null,\n        OTP: null,\n        BankID: null,\n        BankAccount: null,\n        BankImage: null,\n        Email: null\n      },\n      BankList: [],\n      accept: 'image/jpeg,image/png',\n      image: null,\n      lastTime: 180,\n      isPhoneNumberLock: false,\n      isFirstClick: false,\n      myInterval: null\n    }\n  },\n  computed: {\n    AgentMode() {\n      return {\n        AgentMode: 1,\n        IsBind: false,\n        ...this.$store.state.user.IsBind.data\n      }\n    }\n  },\n  mounted() {\n    const memberInfo = this.$store.getters.MemberInfo\n    if (!memberInfo?.PhoneNumber) {\n      this.$message.error({\n        message: this.$t('Message.Msg.PleaseEnterCellPhone')\n      })\n      this.close()\n    }\n    this.form.Name = this.itemObject.Name\n    this.form.Birthday = this.itemObject.Birth\n    // this.form.IdNumber = this.itemObject.IdNumber\n    // 計時器是否為第一次點擊\n    this.isFirstClick = this.$store.getters.TimerFirstClick\n    // 鎖住phone欄位\n    this.isPhoneNumberLock = this.$store.getters.TimerLock\n    // 暫存phone\n    var tempPhone = this.$store.getters.TimerTempData ? this.$store.getters.TimerTempData.phoneNumber : ''\n    this.form.PhoneNumber = this.itemObject.PhoneNumber || tempPhone\n    this.form.Email = this.itemObject.Email\n    if (this.$store.getters.TimerCount > 0 && this.$store.getters.TimerLock) {\n      this.InitTimer(this.$store.getters.TimerCount)\n    }\n    this.$nextTick(async () => {\n      await this.BindCheck()\n    })\n    if (this.itemObject && this.itemObject.Type === 3) {\n      this.getMemberBank()\n    }\n  },\n  beforeDestroy() {\n    this.ClearTimer()\n  },\n  methods: {\n    close() {\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    async BindCheck() {\n      this.$store.dispatch('user/getIsBind')\n    },\n    getMemberBank() {\n      // 審核中在用的\n      var formData = {\n        Action: 'Member'\n      }\n      API.Bank.getList(formData).then(res => {\n        const { Data } = res\n        if (Data && Array.isArray(Data.BankList) && Data.BankList.length > 0) {\n          this.form.BankAccount = Data.BankList[0].MemberBankAccount\n          this.form.BankID = Data.BankList[0].MemberBankID\n          // this.image = Data.BankList[0].MemberBankIcon\n          this.image = Data.BankList[0].MemberBankImage // type === 3 前台需看到送審的那張銀行圖片\n        }\n      }).catch(() => {\n        console.log('error')\n      })\n    },\n    async getOTP() {\n      if (!this.form.PhoneNumber) {\n        this.$message.error({\n          message: this.$t('Message.Msg.PleaseEnterCellPhone')\n        })\n        return false\n      }\n\n      if (!validator.validPhone(this.$store.getters.LocationCode, this.form.PhoneNumber)) {\n        this.$message.error({\n          message: this.$t('Shared.PhoneNumber') + this.$t('Shared.Format') + ' ' + this.$t('Shared.Error')\n        })\n        return false\n      }\n\n      var formData = {\n        CellPhoneNumber: this.form.PhoneNumber\n      }\n      this.$store.commit('app/SET_ISLOADING', true)\n      const { ErrorCode, Data } = await API.User.BindPhone(formData)\n      this.$store.commit('app/SET_ISLOADING', false)\n      if (ErrorCode === 0 && Data) {\n        this.$message.success({\n          message: this.$t('Get OTP..., please wait for message')\n        })\n        await this.$store.dispatch('timer/setFirstClick', true)\n        await this.$store.dispatch('timer/setTimerLock', true)\n        await this.$store.dispatch('timer/setTimerTempData', {\n          phoneNumber: this.form.PhoneNumber\n        })\n        this.InitTimer()\n      }\n    },\n    submit() {\n      this.$refs.form.validate().then(async valid => {\n        if (valid) {\n          // var isotp =\n          var formData = {\n            IsOTP: false,\n            BankID: this.form.BankID,\n            BankAccount: this.form.BankAccount,\n            BankImg: this.form.BankImage,\n            VerificationCode: this.form.OTP,\n            // IDCardNo: this.form.IdNumber,\n            Name: this.form.Name,\n            Birthday: this.form.Birthday,\n            Email: this.form.Email\n          }\n          this.$store.commit('app/SET_ISLOADING', true)\n          const { ErrorCode, Data } = await API.User.BindMember(formData)\n          this.$store.commit('app/SET_ISLOADING', false)\n          if (ErrorCode === 0 && Data) {\n            this.$message.success({\n              message: this.$t('Shared.Success')\n            })\n            this.$track('綁定會員資料成功', {\n              event_category: 'BindInfo',\n              event_label: '綁定會員資料成功'\n            })\n            this.$emit('updateInfo', true)\n            this.ClearTimer()\n            this.$store.dispatch('timer/setTimerLock', false)\n            this.$store.dispatch('timer/setFirstClick', false)\n            this.close()\n          }\n        } else {\n          console.log('error')\n          return false\n        }\n      })\n    },\n    onFileChange(e) {\n      var files = e.target.files || e.dataTransfer.files\n      if (!files.length) {\n        return\n      }\n      const isIMAGE = (files[0].type === 'image/jpeg' || files[0].type === 'image/png')\n      const isLt1M = files[0].size / 1024 / 1024 < 0.8\n      // console.log(files[0].size)\n      // const isLt1M = files[0].size / 1024 <= 8000\n\n      if (!isIMAGE) {\n        this.$message.error('Only Upload jpg/png !')\n        e.target.files = null\n        return\n      }\n      if (!isLt1M) {\n        this.compressImage(files[0])\n      } else {\n        this.createImage(files[0])\n        const reader = new FileReader()\n        reader.readAsDataURL(files[0])\n        reader.onload = this.openFile\n      }\n    },\n    compressImage(file) {\n      const self = this\n      const options = {\n        maxSizeMB: 0.7,\n        initialQuality: 0.6\n      }\n      this.$store.commit('app/SET_ISLOADING', true)\n      imageCompression(file, options)\n        .then(res => {\n          console.log(res)\n          this.$store.commit('app/SET_ISLOADING', false)\n          const reader = new FileReader()\n          reader.readAsDataURL(res)\n          reader.onloadend = function() {\n            const base64data = reader.result\n            self.form.BankImage = base64data\n            self.image = base64data\n          }\n        })\n        .catch(err => {\n          console.log(err)\n          this.$store.commit('app/SET_ISLOADING', false)\n        })\n    },\n    openFile(event) {\n      this.form.BankImage = event.target.result\n      // this.$emit('getFile', event.target.result, this.formIndex)\n    },\n    createImage(file) {\n      // var image = new Image()\n      var reader = new FileReader()\n      var vm = this\n\n      reader.onload = (e) => {\n        vm.image = e.target.result\n      }\n      reader.readAsDataURL(file)\n    },\n    InitTimer(reloadTime = 180) {\n      if (this.myInterval) {\n        clearInterval(this.myInterval)\n      }\n      this.myInterval = setInterval(() => {\n        reloadTime--\n        this.$store.dispatch('timer/setTimerCount', reloadTime)\n        this.$store.dispatch('timer/setTimerLock', true)\n        if (reloadTime === 0) {\n          reloadTime = 180\n          this.$store.dispatch('timer/setTimerLock', false)\n          this.$store.dispatch('timer/setFirstClick', false)\n          clearInterval(this.myInterval)\n        }\n      }, 1000)\n    },\n    ClearTimer() {\n      if (this.myInterval) {\n        this.lastTime = 180\n        clearInterval(this.myInterval)\n      }\n    }\n  }\n}\n","import otpVertify from './otp-vertify'\nimport login from './login'\nimport lobby from './lobby'\nimport detailInfo from './detail-info'\nimport setting from './setting'\nimport app from './app'\nimport contentBox from './content-box'\nimport betRecord from './bet-record'\nimport promotion from './promotion'\n\nexport { default as otpVertify } from './otp-vertify'\nexport { default as login } from './login'\nexport { default as lobby } from './lobby'\nexport { default as detailInfo } from './detail-info'\nexport { default as setting } from './setting'\nexport { default as app } from './app'\nexport { default as contentBox } from './content-box'\nexport { default as betRecord } from './bet-record'\nexport { default as promotion } from './promotion'\n\nexport default {\n  otpVertify,\n  login,\n  lobby,\n  detailInfo,\n  setting,\n  app,\n  contentBox,\n  betRecord,\n  promotion\n}","import axios from 'axios'\n\nimport store from '@/store'\n\nimport router from '@/router'\n\nimport { Message, MessageBox } from 'element-ui'\n\nimport i18n from '@/language'\n\nconst map = []\n\nconst service = axios.get(`${process.env.VUE_APP_SPOT}/domains/url`, { params: { version: process.env.VUE_APP_KEYWORD, env: process.env.VUE_APP_SOCKET_ENV }})\n  .then(res => {\n    if (res.data?.Api) {\n      window.domains = res.data\n      store.dispatch('app/setDomains', res.data)\n      const instanse = axios.create({\n        baseURL: res.data.Api,\n        timeout: 3 * 1000 * 60\n      })\n      instanse.interceptors.request.use(\n        async config => {\n          config.headers['Content-Type'] = 'application/json'\n          config.headers.source = process.env.VUE_APP_KEYWORD\n          config.headers.platform = 'OCMS'\n          config.headers.device = store.getters.Device\n          config.headers['accept-language'] = store.getters.language\n          config.headers['agmp-lang'] = store.getters.language || 'en'\n          config.headers.ac = store.getters.AgentCode\n          config.headers.tn = store.getters.Token\n          config.headers.version = store.getters.Version\n          return config\n        },\n        error => {\n          console.log('error=====>', error)\n          return Promise.reject(error)\n        }\n      )\n      instanse.interceptors.response.use(\n        async response => {\n          if (response.status === 200) {\n            // 統一回傳 api 發生錯誤的自定義response Data\n            if (response.data.ErrorCode !== 0) {\n              const urlSearchParams = new URLSearchParams(window.location.search)\n              const params = Object.fromEntries(urlSearchParams.entries())\n              switch (response.data.ErrorCode) {\n                case 900012:\n                  console.log('系統維護')\n                  await store.dispatch('app/setIsMaintainence', true)\n                  await store.dispatch('app/setMaintainContent', response.data.Data?.MaintainContent)\n                  router.push({ path: '/', query: params })\n                  break\n                case 900014:\n                case 900015:\n                case 900016:\n                case 900017:\n                case 900018:\n                  if (!store.getters.isAlertShow) {\n                    await store.dispatch('app/setIsAlertShow', true)\n                    MessageBox.alert(response.data.ErrorMsg, {\n                      confirmButtonText: 'Confirm',\n                      callback: async () => {\n                        await store.dispatch('user/logout')\n                        await store.dispatch('app/setIsAlertShow', false)\n                        router.push('/')\n                      }\n                    })\n                  }\n                  break\n                case 900019: // Token 過期\n                  console.log('Token 過期')\n                  if (!store.getters.isAlertShow) {\n                    await store.dispatch('app/setIsAlertShow', true)\n                    MessageBox.alert(i18n.t('Message.Msg.TokenExpiredMsg'), i18n.t('Message.Msg.TokenExpired'), {\n                      confirmButtonText: i18n.t('Shared.Confirm'),\n                      callback: async () => {\n                        await store.dispatch('user/logout')\n                        await store.dispatch('app/setIsAlertShow', false)\n                        router.push('/')\n                      }\n                    })\n                  }\n                  break\n                case 900047: // 多平台登入\n                  console.log('多平台登入')\n                  if (!store.getters.isAlertShow) {\n                    await store.dispatch('app/setIsAlertShow', true)\n                    MessageBox.alert(i18n.t('Message.Msg.RepeatLoginMsg'), i18n.t('Message.Msg.RepeatLogin'), {\n                      confirmButtonText: i18n.t('Shared.Confirm'),\n                      callback: async () => {\n                        await store.dispatch('user/logout')\n                        await store.dispatch('app/setIsAlertShow', false)\n                        router.push('/')\n                      }\n                    })\n                  }\n                  break\n                case 900060: // 版本需要更新\n                  console.log('版本需要更新')\n                  if (!store.getters.isAlertShow) {\n                    await store.dispatch('app/setIsAlertShow', true)\n                    MessageBox.alert(i18n.t('Message.Msg.VersionUpdatedMsg'), i18n.t('Message.Msg.VersionUpdated'), {\n                      confirmButtonText: i18n.t('Shared.Confirm'),\n                      callback: async action => {\n                        await store.dispatch('app/setIsAlertShow', false)\n                        location.reload(true)\n                      }\n                    })\n                  }\n                  break\n                case 900065: // 切換渠道碼\n                  await store.dispatch('user/logout')\n                  console.log('切換渠道碼')\n                  break\n                case 900067:\n                  console.log('api連打')\n                  break\n                default:\n                  Message.error({\n                    message: response.data.ErrorMsg\n                  })\n                  break\n              }\n              return Promise.resolve(response.data)\n            }\n            return Promise.resolve(response.data)\n          } else {\n            return Promise.reject(response.data)\n          }\n        },\n        async error => {\n          console.log(error)\n          // 斷網 或者 請求超時 狀態\n          if (!error.response) {\n            // 请求超时状态\n            if (error.message.includes('timeout')) {\n              console.log('Time Out')\n            } else {\n              // 可以展示斷網組件\n              console.log('Disconnect')\n            }\n            return\n          }\n          if (error && error.response) {\n            switch (error.response.status) {\n              case 204:\n                console.log('204 No Content')\n                break\n              case 401:\n                router.push('/401')\n                break\n              case 403:\n                router.push('/login')\n                break\n              case 404:\n                router.push('/404')\n                break\n              case 500:\n                router.push('/login')\n                break\n              default:\n                console.log(`connection error${error.response.status}`)\n            }\n          } else {\n            console.log('error ====>', error)\n          }\n          return Promise.resolve(error.response)\n        }\n      )\n\n      const callAPI = async (requestData) => {\n        var findItem = map.find(f => f === requestData.url)\n        if (findItem) {\n          return new Promise((resolve, reject) => setTimeout(async () => {\n            resolve(await callAPI(requestData))\n          }, 1000))\n        } else {\n          map.push(requestData.url)\n          const result = await instanse(requestData).catch(async error => {\n            var findItemIndex = map.findIndex(m => m === requestData.url)\n            map.splice(findItemIndex, 1)\n            switch (error.ErrorCode) {\n              case 900067:\n                return await callAPI(requestData)\n            }\n            return Promise.reject(error)\n          })\n          // 清map\n          var findItemIndex = map.findIndex(m => m === requestData.url)\n          map.splice(findItemIndex, 1)\n          // 判斷是否為reject\n          if (result.status === undefined || result.status === null) {\n            // 正常resolve\n            return result\n          } else {\n            // reject\n            return Promise.reject(result)\n          }\n        }\n      }\n\n      return callAPI\n    }\n  })\n\nexport default service\n","import API from '../../api'\nimport { validator } from 'agmp-utility'\nexport default {\n  name: 'Verify',\n  props: {\n    title: {\n      type: String,\n      default: ''\n    },\n    dialogName: {\n      type: String,\n      default: ''\n    },\n    show: {\n      type: Boolean,\n      default: false\n    },\n    itemObject: {\n      type: Object || Array,\n      default: () => {\n        return []\n      }\n    }\n  },\n  data() {\n    return {\n      keyword: process.env.VUE_APP_KEYWORD,\n      isLoading: false,\n      isOTPByPass: false,\n      result: {\n        itemObject: null\n      },\n      verifyForm: {\n        Phone: '',\n        VerificationCode: ''\n      },\n      myInterval: null\n    }\n  },\n  computed: {\n    timer() {\n      return {\n        count: this.$store.getters.TimerCount,\n        lock: this.$store.getters.TimerLock,\n        data: this.$store.getters.TimerTempData\n      }\n    }\n  },\n  created() {\n  },\n  async mounted() {\n    this.isLoading = true\n    const { Data, ErrorCode } = await API.System.getSkipSmsOTP().catch(err => {\n      console.log(err)\n      this.isLoading = false\n    })\n    this.isLoading = false\n    if (ErrorCode === 0) {\n      this.isOTPByPass = Data.skipSmsOTP\n    }\n    if (this.timer.lock) {\n      this.verifyForm.Phone = this.timer.data.phoneNumber\n      this.InitTimer(this.timer.count)\n    }\n  },\n  methods: {\n    close() {\n      this.$emit('closeDialog', this.dialogName, this.result)\n      this.$emit('update:show', false)\n    },\n    async getOTP() {\n      if (!validator.validPhone(this.$store.getters.LocationCode, this.verifyForm.Phone)) {\n        this.$message.error({\n          message: this.$t('Message.Msg.PleaseEnterCellPhone')\n        })\n        return false\n      }\n\n      this.$store.commit('app/SET_ISLOADING', true)\n      const { ErrorCode, Data } = await API.User.BindPhone({ CellPhoneNumber: this.verifyForm.Phone })\n      this.$store.commit('app/SET_ISLOADING', false)\n      if (ErrorCode === 0 && Data) {\n        this.$message.success({\n          message: this.$t('Message.Msg.OTPMsg')\n        })\n        this.$store.dispatch('timer/setTimerLock', true)\n        this.$store.dispatch('timer/setTimerTempData', {\n          phoneNumber: this.verifyForm.Phone\n        })\n        this.InitTimer()\n      }\n    },\n    InitTimer(reloadTime = 180) {\n      if (this.myInterval) {\n        clearInterval(this.myInterval)\n      }\n      this.myInterval = setInterval(() => {\n        reloadTime--\n        this.$store.dispatch('timer/setTimerCount', reloadTime)\n        this.$store.dispatch('timer/setTimerLock', true)\n        if (reloadTime === 0) {\n          this.$store.dispatch('timer/setTimerCount', 180)\n          this.$store.dispatch('timer/setTimerLock', false)\n          clearInterval(this.myInterval)\n        }\n      }, 1000)\n    },\n    async submit() {\n      this.$refs.verifyForm.validate().then(async valid => {\n        if (!valid) {\n          return\n        }\n        if (!this.isOTPByPass) {\n          if ((!this.timer.data?.phoneNumber) || this.verifyForm.Phone !== this.timer.data.phoneNumber) {\n            this.$message.error(this.$t('Message.OTPPhoneNotSame'))\n            return\n          }\n        }\n        const formData = this.isOTPByPass\n          ? { CellPhoneNumber: this.verifyForm.Phone }\n          : \n            {\n              Phone: this.verifyForm.Phone,\n              VerificationCode: this.verifyForm.VerificationCode\n            }\n        const request = this.isOTPByPass\n          ? API.User.updatePhone\n          : API.User.UserVerifyPhone\n\n        this.isLoading = true\n        const { ErrorCode } = await request(formData).catch(err => {\n          console.log(err)\n          this.isLoading = false\n        })\n        if (ErrorCode === 0) {\n          this.$message.success(this.$t('Shared.Success'))\n          this.$store.dispatch('timer/setTimerTempData', {})\n          const { ErrorCode, Data } = await API.User.getInfo().catch(e => {\n            console.log(e)\n            this.$store.commit('app/SET_ISLOADING', false)\n          })\n          if (ErrorCode === 0) {\n            this.$store.commit('user/SET_MEMBERINFO', Data)\n          }\n          this.close()\n        }\n        this.isLoading = false\n      })\n    },\n    faceBookLogout() {\n      // 檢查登入狀態\n      window.FB.getLoginStatus(function(response) {\n        // 檢查登入狀態\n        if (response.status === 'connected') {\n          // 移除授權\n          // window.FB.api('/me/permissions', 'DELETE', function(res) {\n          // 用戶登出\n          window.FB.logout(function(response) {\n            console.log(response)\n          })\n          // })\n        } else {\n          // do something\n          console.log('logout connected else something')\n        }\n      })\n    },\n    logout() {\n      this.$store.dispatch('timer/setTimerCount', 180)\n      this.$store.dispatch('timer/setTimerLock', false)\n      this.$store.dispatch('timer/setTimerTempData', {})\n      this.$store.commit('app/SET_ISLOADING', true)\n      this.$store.dispatch('user/setToken', '')\n      this.$store.dispatch('user/setDevice', '')\n      this.$store.dispatch('user/setMemberInfo', {})\n      this.$store.dispatch('user/setFBInfo', {})\n      this.$store.dispatch('timer/setTimerTempData', null)\n      this.faceBookLogout()\n      location.href = '/'\n    }\n  }\n}\n","import Decimal from 'decimal.js'\n\nfunction add(a, b) {\n  if (checkNullUndefined(a) && checkNullUndefined(b)) {\n    const result = new Decimal(a)\n    return result.plus(b).toNumber()\n  } else {\n    return 0\n  }\n}\n\nfunction subtract(a, b) {\n  if (checkNullUndefined(a) && checkNullUndefined(b)) {\n    const result = new Decimal(a)\n    return result.minus(b).toNumber()\n  } else {\n    return 0\n  }\n}\n\nfunction multiply(a, b) {\n  if (checkNullUndefined(a) && checkNullUndefined(b)) {\n    const result = new Decimal(a)\n    return result.times(b).toNumber()\n  } else {\n    return 0\n  }\n}\n\nfunction divide(a, b) {\n  if (checkNullUndefined(a) && checkNullUndefined(b)) {\n    const result = new Decimal(a)\n    return result.div(b).toNumber()\n  } else {\n    return 0\n  }\n}\n\nfunction checkNullUndefined(val) {\n  return (val !== undefined && val !== '' && val !== null && isNumber(val))\n}\n\nfunction isNumber(val) {\n  return !Number.isNaN(Number(val))\n}\n\nvar decimalObj = {\n  add,\n  subtract,\n  multiply,\n  divide\n}\nexport default decimalObj\n"],"sourceRoot":""}