<!-- eslint-disable vue/no-deprecated-filter --> <template> <div class="payment"> <!-- 选择支付方式 --> <template v-if="step === 1"> <div class="moneyInfo"> <div class="tips">You Neet to Pay</div> <div class="money" v-if="salePlans"> <FontZoom width="300" :unColor="true" v-if="salePlans && salePlans.price"> <template v-if="salePlans && salePlans.currencyCode && salePlans.currencyCode !== 'USD'"> <template v-if="salePlans.price.length + salePlans.currencyInfo.tokenSymbol.length >= 30"> <div style="text-align: center"> <div><img class="icon" :src="salePlans.currencyInfo.iconPath" /> {{ salePlans.price | floatPrice(4) }}</div> <div>{{ salePlans.currencyInfo.tokenSymbol }} (${{ salePlans.usdPrice | floatPrice(2) }})</div> </div> </template> <template v-else> <img class="icon" :src="salePlans.currencyInfo.iconPath" /> {{ salePlans.price | floatPrice(4) }} {{ salePlans.currencyInfo.tokenSymbol }} (${{ salePlans.usdPrice | floatPrice(2) }}) </template> </template> <template v-else> <span class="info usd">${{ salePlans.usdPrice | floatPrice(2) }}</span> </template> </FontZoom> </div> </div> <div class="payList"> <div class="detail" v-if="salePlans && salePlans.currencyCode && salePlans.currencyCode !== 'USD'"> <div class="title">Crypto Wallet</div> <div class="item denet" @click="deNetPay"> <div> <img src="../../static/payment/icon_wallet.png" /> <span>DeNet Pay</span> </div> <div class="wallet"> <FontZoom width="300" :unColor="true"> Balance:{{ currencyInfoData.balance | floatPrice(4) }} {{ currencyInfoData.tokenSymbol }} </FontZoom> </div> </div> <div v-if="ifShowMetaMask" class="item" @click="maskPay"> <a class="maskLink" :href="maskUrlLink" v-if="Number(usdAmountData.rechargeAmountValue) > 0"></a> <img src="../../static/payment/icon_meta_mask.png" /> <span>MetaMask</span> </div> </div> <div class="detail" v-if="salePlans && salePlans.currencyCode && salePlans.currencyCode === 'USD'"> <div class="title">Credit/Debit Card</div> <div class="item denet" @click="deNetPay"> <div> <img src="../../static/payment/icon_wallet.png" /> <span>DeNet Pay</span> </div> <div class="wallet">Balance:{{ currencyInfoData.balance | floatPrice(2) }} {{ currencyInfoData.tokenSymbol }}</div> </div> <div v-if="ifShowAch" class="item" @click="achPay(true, Report.objectType.mastercardPayButton)"> <img src="../../static/payment/icon_master_card.png" /> <span>MasterCard</span> </div> <div v-if="ifShowAch" class="item" @click="achPay(true, Report.objectType.visaPayButton)"> <img src="../../static/payment/icon_visa.png" /> <span>VISA</span> </div> </div> <div class="detail"> <div class="title">Redemption Code</div> <div class="item" @click="showRedeem"> <img src="../../static/payment/icon_enter_code.png" /> <span>Enter Code</span> </div> </div> </div> </template> <!-- 余额足够 --> <template v-else-if="step === 2"> <div class="balanceTop"> <img class="balance" src="../../static/img/icon_balance.svg" /> <div class="text">Balance</div> <div class="money"> <FontZoom width="300" :unColor="true"> <template v-if="salePlans.currencyCode === 'USD'"> <img class="icon" :src="currencyInfoData.iconPath" /> {{ currencyInfoData.balance | floatPrice(2) }} {{ currencyInfoData.tokenSymbol }} </template> <template v-else> <img class="icon" :src="currencyInfoData.iconPath" /> {{ currencyInfoData.balance | floatPrice(4) }} {{ currencyInfoData.tokenSymbol }} </template> </FontZoom> </div> <template v-if="waitRefresh"> <div class="waitFont">It may take some time to credit the funds into your account.</div> <div @click="checkWaitInfo" class="waitBtn"> <img :class="{ 'icon-refresh-rotate': refreshRotate }" src="../../static/img/icon_refresh.svg" /> </div> </template> </div> <div class="balanceBot"> <div class="l"> <div class="neet">You Neet to Pay</div> <div class="money"> <FontZoom width="190" :unColor="true"> <span class="text"> <template v-if="salePlans.currencyCode === 'USD'"> {{ salePlans.price | floatPrice(2) }} {{ salePlans.currencyInfo.tokenSymbol }} </template> <template v-else> {{ salePlans.price | floatPrice(4) }} {{ salePlans.currencyInfo.tokenSymbol }} </template> </span> </FontZoom> </div> </div> <div> <div class="btn" :class="{ disable: Number(usdAmountData.rechargeAmountValue) > 0 || payDisabled }" @click="pay">Pay Now</div> </div> </div> </template> <!-- 余额不足 --> <template v-else-if="step === 3"> <template v-if="salePlans && salePlans.currencyCode && salePlans.currencyCode !== 'USD'"> <div class="balanceInfo"> <div class="top"> <div class="item title"> <img src="../../static/img/icon_deposit.png" /> <span>Deposit to Buy</span> </div> <div class="item column"> <div class="l">Deposit</div> <div class="r"> <FontZoom width="260" :unColor="true"> <img :src="currencyInfoData.iconPath" /> <span ><span v-if="Number(usdAmountData.rechargeAmountValue) > 0">{{ usdAmountData.rechargeAmountValue | floatPrice(4) }} </span>{{ currencyInfoData.tokenSymbol }}</span > </FontZoom> </div> </div> <div class="item column"> <div class="l">Network</div> <div class="r"> <FontZoom width="260" :unColor="true"> <img :src="currencyInfoData.chainInfo.iconPath" /> <span>{{ currencyInfoData.chainInfo.chainName }}</span> </FontZoom> </div> </div> <div class="address"> <div class="title">Address</div> <QrCode :tokenChain="currencyInfoData.tokenChain" :rechargeAddress="rechargeAddress" @copy="copyErCode"></QrCode> </div> <div class="notice"> <div class="icon"><img src="../../static/img/icon_warning.svg" /></div> <div class="text"> Make sure you also selected <Br /><strong>{{ currencyInfoData.chainInfo.chainName }}</strong> <br />as the Network on the platform where you are withdrawing funds for this deposit. Otherwise, you'll lose your assets. </div> </div> </div> <div class="line"></div> <div class="balance"> <div class="icon"> <img src="../../static/img/icon_balance_blue.svg" /> </div> <div class="text"> <FontZoom width="260" :unColor="true"> <span>Balance: {{ currencyInfoData.balance | floatPrice(4) }} {{ currencyInfoData.tokenSymbol }}</span> </FontZoom> </div> <div class="refresh" @click="checkCurrencyInfo"> <img :class="{ 'icon-refresh-rotate': refreshRotate }" src="../../static/img/icon_refresh.svg" /> </div> </div> </div> <div class="balanceBot"> <div class="l"> <div class="neet">You Neet to Pay</div> <div class="money"> <FontZoomMobile width="220" :unColor="true"> {{ salePlans.price | floatPrice(4) }} {{ salePlans.currencyInfo.tokenSymbol }} </FontZoomMobile> </div> </div> <div> <div class="btn" :class="{ disable: Number(usdAmountData.rechargeAmountValue) > 0 || payDisabled }" @click="payToken">Pay Now</div> </div> </div> </template> <template v-if="salePlans && salePlans.currencyCode && salePlans.currencyCode === 'USD'"> <div class="balanceInfo"> <div class="top"> <div class="item usd"> <div class="l">Payment amount</div> <div class="r fontPayment">${{ usdAmountData.orderAmountValue | floatPrice(2) }}</div> </div> <div class="item usd"> <div class="l">Balance</div> <div class="r font">${{ usdAmountData.balance | floatPrice(2) }}</div> </div> <div class="item usd" v-if="Number(usdAmountData.rechargeAmountValue) > 0"> <div class="l">{{ usdAmountData.feeDesc }}</div> <div class="r font">${{ usdAmountData.feeAmountValue | floatPrice(2) }}</div> </div> <div class="item usd" v-if="Number(usdAmountData.rechargeAmountValue) > 0"> <div class="l">Deposit Amount</div> <div class="r fontDeposit">${{ usdAmountData.rechargeAmountValue }}</div> </div> <div class="deposit" @click="achPay(false, '')">Deposit</div> </div> <div class="line"></div> <div class="balance"> <div class="icon"> <img src="../../static/img/icon_balance_blue.svg" /> </div> <div class="text">Balance: ${{ currencyInfoData.balance | floatPrice(2) }}</div> <div class="refresh" @click="checkUsdCurrencyInfo"> <img :class="{ 'icon-refresh-rotate': refreshRotate }" src="../../static/img/icon_refresh.svg" /> </div> </div> </div> <div class="balanceBot"> <div class="l"> <div class="neet">You Neet to Pay</div> <div class="money"> <FontZoomMobile width="220" :unColor="true"> {{ Number(usdAmountData.rechargeAmountValue) > 0 ? usdAmountData.rechargeAmountValue : usdAmountData.orderAmountValue }} {{ salePlans.currencyInfo.tokenSymbol }} </FontZoomMobile> </div> </div> <div> <div class="btn" :class="{ disable: Number(usdAmountData.rechargeAmountValue) > 0 || payDisabled }" @click="payUSD">Pay Now</div> </div> </div> </template> </template> <!-- 成功支付 --> <template v-else-if="step === 4"> <div class="payInfo"> <div class="picShow" v-if="buyData"> <div class="tip">Wow, NFT in the Mystery box is</div> <img class="pic" :src="buyData.imagePath" /> <div class="name">{{ buyData.nftItemName }}</div> </div> </div> <div class="payBtn"> <button class="btn" @click="goNext">Done</button> </div> </template> <!-- loading --> <div class="loading" v-if="loading"> <van-loading color="#1D9BF0"></van-loading> </div> <div class="loadingBg" v-if="loading"></div> <!-- redeem --> <van-popup round v-model="redeemLayer" position="bottom"> <div class="redeem"> <div class="tips">Enter Redemption Code</div> <div class="footer"> <div class="input"> <input type="text" ref="input" v-model="redeemStr" @input="textInput" @blur="textBlur" @focus="textFocus" @keydown.enter="redeemPayment" /> </div> <button class="enter" :class="{ disable: !redeemNext }" @click="redeemPayment">Redeem</button> </div> </div> </van-popup> </div> </template> <script> import FontZoom from '../../components/FontZoom.vue'; import FontZoomMobile from '../../components/FontZoomMobile.vue'; import QrCode from '../../components/qrcode.vue'; import { postRequest } from '../../http/index'; import { maskUrl, setStorage, storageKey, OSDetect } from '../../utils/help'; import { Dialog } from 'vant'; import Api from '../../http/api'; import Report from '../../log-center/log'; export default { name: 'payment', data() { return { step: 1, // 1: 支付方式列表 2: 余额支付 3: 充值支付 4: 支付完成 loading: true, salePlans: null, rechargeAddress: '', redeemStr: '', redeemNext: false, redeemLayer: false, buyData: {}, payDisabled: false, waitRefresh: false, refreshRotate: false, currencyInfoData: {}, currencyTimer: 0, achTimer: 0, maskUrlLink: ``, usdAmountData: {}, Report: Report, ifShowMetaMask: false, ifShowAch: false, }; }, head() { return { title: 'Buy NFT Mystery Box', }; }, components: { QrCode, FontZoom, FontZoomMobile, }, mounted() { this.saleInfo(); this.showMetaMask(); this.reportView(Report.pageSource.nftPaymentPage); }, beforeUnmount() { clearTimeout(this.currencyTimer); }, filters: { floatPrice(price, num) { if (!price) return; if (price.indexOf('.') >= 0) { let reg = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,${num}})?).*$`, 'g'); price = price.replace(reg, '$1'); } return price; }, }, methods: { saleInfo() { postRequest(Api.getNftMysteryBoxSaleInfo, { params: { nftProjectId: this.$route.query.nftProjectId, }, }) .then((res) => { let { code, data } = res; if (code === 0) { this.salePlans = data.salePlans[0]; this.getCurrencyInfoByCode(); // 获取充值地址 if (this.rechargeAddress === '') { this.getAddress(); } } }) .finally(() => { setTimeout(() => { this.loading = false; }, 600); }); }, showMetaMask() { if (OSDetect() === 'ios') { this.ifShowMetaMask = true; } }, getCurrencyInfoByCode() { let where = this.salePlans && this.salePlans.currencyCode; if (!where) return; postRequest(Api.getCurrencyInfoByCode, { params: { currencyCode: this.salePlans.currencyCode, }, }).then((res) => { let { code, data } = res; if (code === 0) { this.currencyInfoData = data; } }); // 计算金额 postRequest(Api.calcRechargePayAmount, { params: { currencyCode: this.salePlans.currencyCode, orderAmountValue: this.salePlans.price, payChannel: 'ach', }, }).then((res) => { let { code, data } = res; if (code === 0) { this.usdAmountData = data; } }); }, getTokenRechargeRecord() { postRequest(Api.syncChainTokenRechargeRecord, { params: { currencyCode: this.salePlans.currencyCode, }, }).then((res) => { let { code, data } = res; if (code === 0) { if (data.length > 0) { let currencyInfo = data[0]; if (currencyInfo.currencyCode == this.currencyInfoData.currencyCode) { this.currencyInfoData.balance = currencyInfo.balance; } } else { this.currencyInfoData.balance = 0; } } }); }, currencyInfoTimer() { clearTimeout(this.currencyTimer); this.currencyTimer = setTimeout(() => { this.currencyInfoTimer(); this.getCurrencyInfoByCode(); }, 10000); }, checkUsdCurrencyInfo() { if (!this.refreshRotate) { this.refreshRotate = true; this.getCurrencyInfoByCode(); setTimeout(() => { this.refreshRotate = false; }, 1000); // report this.reportDepositCashPageClick(Report.objectType.refreshBalanceButton); } }, checkCurrencyInfo() { if (!this.refreshRotate) { this.refreshRotate = true; this.getTokenRechargeRecord(); setTimeout(() => { this.refreshRotate = false; }, 1000); // report this.reportDepositTokenPageClick(Report.objectType.refreshBalanceButton); } }, checkWaitInfo(isReport = true) { if (!this.refreshRotate) { this.refreshRotate = true; this.getCurrencyInfoByCode(); setTimeout(() => { this.refreshRotate = false; }, 1000); } if (isReport) { this.reportBalanceRefresh(); } }, showRedeem() { this.redeemStr = ''; this.redeemNext = false; this.redeemLayer = true; this.$nextTick(() => { this.$refs.input.focus(); }); this.reportView(Report.pageSource.nftRedeemPage); this.reportPaymentBtnClick(Report.objectType.redeemButton); }, textInput() { let len = 16; let str = this.redeemStr.replace(/[^a-zA-Z0-9]/g, ''); str = str.toUpperCase(); str = str.slice(0, len); // set this.redeemStr = str; this.redeemNext = str !== '' && str.length === len; }, textBlur() { let isiOS = !!window.navigator.userAgent.match(/\(i\[^;]+;( U;)? CPU.+Mac OS X/); if (isiOS) { setTimeout(() => { const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0; window.scrollTo(0, Math.max(scrollHeight - 1, 0)); }, 100); } }, textFocus() { let isiOS = !!window.navigator.userAgent.match(/\(i\[^;]+;( U;)? CPU.+Mac OS X/); if (isiOS) { setTimeout(() => { const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0; window.scrollTo(0, Math.max(scrollHeight - 1, 0)); }, 100); } }, redeemPayment() { if (!this.redeemNext) return; let params = { redeemCode: this.redeemStr, nftProjectId: this.$route.query.nftProjectId, }; this.redeemNext = false; postRequest(Api.redeemNft, { params, }) .then((res) => { let { code, data } = res; if (code === 0) { this.redeemLayer = false; if (data.length > 0) { this.buyData = data[0]; } // 购买成功 this.step = 4; this.reportSuccessView(); } else { this.payError(code); } }) .finally(() => { this.redeemNext = true; }); this.reportRedeemBtnClick(); }, getAddress() { let where = this.salePlans && this.salePlans.currencyInfo && this.salePlans.currencyInfo.tokenChain; if (!where) return; postRequest(Api.getTokenRechargeAddress, { params: { tokenChain: this.salePlans.currencyInfo?.tokenChain, }, }).then((res) => { let { code, data } = res; if (code === 0) { this.rechargeAddress = data.rechargeAddress; this.maskUrlToLink(); } }); }, maskUrlToLink() { // MetaMask Link let url; let price = this.usdAmountData.rechargeAmountValue; if (this.salePlans.currencyInfo?.contractAddress) { // 代币 url = maskUrl( { target_address: this.salePlans.currencyInfo.contractAddress, parameters: { address: this.rechargeAddress, uint256: `${price}e${this.salePlans.currencyInfo?.decimalLength || 18}`, }, }, false ); } else { // 主币 url = maskUrl({ target_address: this.rechargeAddress, parameters: { value: `${price}e${this.salePlans.currencyInfo?.decimalLength || 18}`, }, }); } this.maskUrlLink = url; }, goNext() { this.reportSuccessClick(); setTimeout(() => { this.$router.push({ path: `/nft/${this.$route.query.nftProjectId}/${this.$route.query.account}/show`, }); }, 300); }, pay(isReport = true) { if (this.payDisabled || Number(this.usdAmountData.rechargeAmountValue) > 0) return; this.payDisabled = true; postRequest(Api.payNftMysteryBoxWithBalance, { params: { nftProjectId: this.$route.query.nftProjectId, salePlanId: this.salePlans.salePlanId, }, }) .then((res) => { let { code, data } = res; if (code == 0) { if (data && data.buyItems.length > 0) { this.buyData = data.buyItems[0]; } // 购买成功 this.step = 4; this.reportSuccessView(); } else { this.payError(code); } }) .finally(() => { this.payDisabled = false; }); // report if (isReport) { this.reportBalanceBuy(); } }, payUSD() { if (Number(this.usdAmountData.rechargeAmountValue) <= 0) { this.pay(false); this.reportDepositCashPageClick(Report.objectType.purchaseNftButton); } }, payToken() { if (Number(this.currencyInfoData.balance) >= Number(this.salePlans.price)) { this.pay(false); this.reportDepositTokenPageClick(Report.objectType.purchaseNftButton); } }, payError(code) { let msg; switch (code.toString()) { case '5001': msg = 'nft project not exist'; break; case '5002': msg = 'nft project not available'; break; case '5101': msg = 'nft sale plan not exist'; break; case '5102': msg = 'nft sold out'; break; case '5103': msg = 'Purchase limit reached'; break; case '5104': case '5105': case '5106': msg = 'Invalid redemption code'; break; default: msg = 'Payment failed, please try again'; break; } // Dialog Dialog({ message: msg, confirmButtonText: 'OK', confirmButtonColor: '#1D9BF0', }); }, deNetPay() { if (!this.salePlans) return; let pageSource; if (this.salePlans.currencyCode === 'USD') { pageSource = Report.pageSource.nftDepositCashPage; } else { pageSource = Report.pageSource.nftDepositTokenPage; } if (Number(this.usdAmountData.rechargeAmountValue) > 0) { // 余额不够 this.step = 3; this.currencyInfoTimer(); // Report this.reportView(pageSource); } else { // 余额足够 this.step = 2; this.reportView(Report.pageSource.nftBalancePage); } this.reportPaymentBtnClick(Report.objectType.denetPayButton); }, maskPay() { if (Number(this.usdAmountData.rechargeAmountValue) > 0) { this.step = 2; this.waitRefresh = true; this.currencyInfoTimer(); Dialog({ message: `Was the pament successful?`, showCancelButton: true, confirmButtonText: 'YES', confirmButtonColor: '#1D9BF0', cancelButtonText: 'NO', cancelButtonColor: '#1D9BF0', }) .then(() => { this.checkWaitInfo(false); }) .catch(() => { this.checkWaitInfo(false); }); this.reportView(Report.pageSource.nftPaymentBalancePage); } else { this.step = 2; this.reportView(Report.pageSource.nftBalancePage); } this.reportPaymentBtnClick(Report.objectType.metamaskPayButton); }, achPay(modifyStep = true, objectType = '') { if (Number(this.usdAmountData.rechargeAmountValue) > 0) { if (modifyStep) { this.step = 2; this.reportView(Report.pageSource.nftPaymentBalancePage); } this.waitRefresh = true; this.currencyInfoTimer(); Dialog({ message: `Was the pament successful?`, showCancelButton: true, confirmButtonText: 'YES', confirmButtonColor: '#1D9BF0', cancelButtonText: 'NO', cancelButtonColor: '#1D9BF0', }) .then(() => { this.checkWaitInfo(false); }) .catch(() => { this.checkWaitInfo(false); }); // setUrl setStorage(storageKey.paymentUrl, window.location.href); this.$nextTick(() => { let win = window.open(); win.opener = null; win.location.href = `${location.protocol}//${location.host}/payment_ach/${this.usdAmountData.rechargeAmountValue}`; this.achTimer = setInterval(() => { console.log('pay'); if (win && win.closed) { console.log('done'); clearInterval(this.achTimer); } }, 500); }); } else { if (modifyStep) { this.step = 2; this.reportView(Report.pageSource.nftBalancePage); } } if (objectType !== '') { this.reportPaymentBtnClick(objectType); } else { this.reportDepositCashPageClick(Report.objectType.depositButtion); } }, copyErCode() { this.reportDepositTokenPageClick(Report.objectType.copyButtion); }, reportView(pageSource) { Report.log({ pageSource, params: { eventData: { businessType: Report.businessType.pageView, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportPaymentBtnClick(objectType) { Report.log({ pageSource: Report.pageSource.nftPaymentPage, params: { eventData: { objectType, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportRedeemBtnClick() { Report.log({ pageSource: Report.pageSource.nftRedeemPage, params: { eventData: { objectType: Report.objectType.redeemButton, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportDepositCashPageClick(objectType) { Report.log({ pageSource: Report.pageSource.nftDepositCashPage, params: { eventData: { objectType, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportDepositTokenPageClick(objectType) { Report.log({ pageSource: Report.pageSource.nftDepositTokenPage, params: { eventData: { objectType, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportBalanceRefresh() { let pageSource = this.waitRefresh ? Report.pageSource.nftPaymentBalancePage : Report.pageSource.nftBalancePage; Report.log({ pageSource: pageSource, params: { eventData: { objectType: Report.objectType.refreshBalanceButton, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportBalanceBuy() { let pageSource = this.waitRefresh ? Report.pageSource.nftPaymentBalancePage : Report.pageSource.nftBalancePage; Report.log({ pageSource: pageSource, params: { eventData: { objectType: Report.objectType.purchaseNftButton, businessType: Report.businessType.buttonClick, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportSuccessView() { Report.log({ pageSource: Report.pageSource.nftPurchaseSuccessPage, params: { eventData: { businessType: Report.businessType.pageView, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, reportSuccessClick() { Report.log({ pageSource: Report.pageSource.nftPurchaseSuccessPage, params: { eventData: { businessType: Report.businessType.buttonClick, objectType: Report.objectType.finishPurchaseButton, }, extParams: { userAgent: window.navigator.userAgent, }, }, }); }, }, }; </script> <style lang="scss"> html, body, #__nuxt, #__layout { width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden; } .payment { width: 100%; height: 100%; } .moneyInfo { display: flex; align-items: center; justify-content: center; flex-direction: column; height: 90px; border-bottom: solid 8px rgba($color: #f5f5f5, $alpha: 0.6); .tips { font-size: 12px; font-weight: 500; } .money { display: flex; align-items: center; justify-content: center; margin-top: 10px; color: #000; font-size: 20px; font-weight: 700; .icon { overflow: hidden; width: 26px; height: 26px; border-radius: 50%; margin-right: 10px; vertical-align: middle; background-color: #f5f5f5; } .info { &.usd { margin-top: -5px; } } } } .payList { overflow-y: auto; height: calc(100% - 90px); .detail { padding: 18px 16px; .title { color: #adadad; height: 26px; font-size: 12px; font-weight: 500; } .item { position: relative; display: flex; align-items: center; justify-content: center; font-weight: 500; font-size: 16px; height: 50px; margin-bottom: 14px; border-radius: 100px; border: 1px solid #ececec; &:last-child { margin-bottom: 0; } img { width: 24px; height: 24px; margin-right: 4px; } &.denet { flex-direction: column; img { margin-top: -6px; } } .wallet { width: 100%; overflow: hidden; color: #adadad; font-size: 11px; text-align: center; margin-top: -2px; } .maskLink { position: absolute; z-index: 10; width: 100%; height: 100%; } } } } .loading { position: absolute; z-index: 3; display: flex; align-items: center; justify-content: center; top: 0; left: 0; width: 100%; height: 100%; } .loadingBg { position: absolute; z-index: 2; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba($color: #000, $alpha: 0.1); } .redeem { padding: 18px 16px 38px; .tips { height: 31px; font-size: 15px; font-weight: 500; } .footer { display: flex; justify-content: space-between; .input { display: flex; align-items: center; justify-content: center; width: calc(100% - 93px); height: 45px; border-radius: 5px; border: 1px solid #e0e0e0; input { width: 94%; border: 0; outline: 0; } } .enter { width: 83px; height: 45px; border: 0; padding: 0; color: #ffffff; font-size: 17px; font-weight: 500; border-radius: 5px; background: #1d9bf0; &.disable { background: #dedede; } } } } .payInfo { width: 100%; height: calc(100% - 88px); .picShow { padding: 54px 48px; .tip { height: 44px; font-size: 18px; font-weight: 600; text-align: center; } .pic { display: block; margin: auto; width: 280px; height: 280px; border-radius: 3px; margin-bottom: 20px; } .name { font-size: 18px; font-weight: 600; line-height: 21px; text-align: center; } } } .payBtn { padding: 0 16px 38px; .btn { width: 100%; height: 50px; color: #ffffff; font-size: 18px; font-weight: 700; border-radius: 50px; background: #1d9bf0; } } .balanceTop { display: flex; align-items: center; justify-content: center; flex-direction: column; height: calc(100% - 100px); background-color: #f5f5f5; .balance { width: 66px; height: 66px; margin-bottom: 6px; } .text { font-size: 15px; font-weight: 500; line-height: 18px; color: #9d9d9d; } .money { font-size: 22px; font-weight: 700; line-height: 26px; margin-top: 6px; .icon { width: 22px; height: 22px; margin-right: 6px; } .font { color: #000; } } } .balanceInfo { overflow-y: auto; height: calc(100% - 100px); background-color: #f5f5f5; .top { padding: 0 16px 17px 16px; background-color: #ffffff; .item { display: flex; align-items: center; height: 54px; border-bottom: solid 1px #f2f2f2; &.title { font-size: 16px; font-weight: 600; line-height: 19px; img { width: 26px; height: 26px; margin-right: 6px; } } &.column { color: rgba($color: #5e5e5e, $alpha: 0.7); font-size: 14px; font-weight: 400; .l { width: 70px; } .r { img { width: 21px; height: 21px; margin-right: 4px; } span { color: rgba($color: #5e5e5e, $alpha: 0.7); } } } &.usd { font-size: 14px; font-weight: 500; justify-content: space-between; .fontPayment { font-size: 18px; font-weight: 600; } .font { color: #9a9a9a; font-size: 16px; font-weight: 500; } .fontDeposit { color: #1d9bf0; font-size: 18px; font-weight: 600; } } } .deposit { display: flex; align-items: center; justify-content: center; height: 54px; color: #ffffff; font-weight: 600; font-size: 18px; margin-top: 16px; border-radius: 54px; background: #1d9bf0; } .address { color: rgba($color: #5e5e5e, $alpha: 0.7); .title { height: 42px; font-size: 14px; font-weight: 400; line-height: 42px; } } .notice { display: flex; justify-content: space-between; padding: 10px; margin-top: 12px; border-radius: 8px; background: #f9f6ee; .icon { width: 20px; margin-right: 10px; img { width: 20px; height: 20px; } } .text { flex: 1; color: rgba($color: #5e5e5e, $alpha: 0.7); font-size: 14px; font-weight: 400; line-height: 19px; word-break: break-all; strong { color: #ff0000; font-weight: bold; } } } } .line { height: 8px; } .balance { display: flex; align-items: center; padding: 0 16px; height: 54px; background-color: #ffffff; .icon { width: 24px; margin-right: 6px; img { width: 24px; } } .text { flex: 1; font-size: 14px; font-weight: 500; line-height: 17px; span { color: #000; margin-right: auto; } } .refresh { width: 24px; height: 24px; img { width: 24px; transform-origin: center center; } } } } .balanceBot { display: flex; justify-content: space-between; width: 100%; padding: 17px 16px 38px; border-top: solid 1px #ececec; .l { display: flex; flex-direction: column; justify-content: center; } .neet { font-size: 12px; font-weight: 500; line-height: 14px; } .money { height: 22px; line-height: 22px; font-size: 18px; font-weight: 700; margin-top: 4px; .text { margin-right: auto; } } .btn { display: flex; align-items: center; justify-content: center; width: 110px; height: 46px; color: #ffffff; font-size: 18px; font-weight: 700; line-height: 21px; border-radius: 46px; background: #1d9bf0; &.disable { background: #d2d2d2; } } } .waitFont { margin-top: 16px; padding: 0 20px; font-size: 14px; font-weight: 500; line-height: 17px; text-align: center; } .waitBtn { display: flex; align-items: center; justify-content: center; width: 50px; height: 50px; margin: 50px auto 0; border-radius: 50%; background-color: #ffffff; img { width: 24px; height: 24px; } } .icon-refresh-rotate { transform: rotate(360deg); transition-duration: 1s; } </style>