12 text-overflow: ellipsis;
17 .topbar-left .btn-menu {
21 .topbar-left .btn-menu i {
30 .topbar .topbar-right {
34 border: 2px solid #fff;
42 display: inline-block;
46 background-color: #02f823;
57 .content .token-icon {
67 .content .token-amount {
71 .token-amount .asset {
77 vertical-align: middle;
84 .transaction-title h3 {
102 border-bottom: 1px solid #5e5e5e;
121 <section class="bg-green">
123 <div class="topbar-right">
125 <select v-model="network" @change="networkToggle">
126 <option value="mainnet">{{ $t('main.mainNet') }}</option>
127 <option value="testnet">{{ $t('main.testNet') }}</option>
130 <div class="topbar-left">
131 <a class="btn-menu" @click="openMenu">
132 <i class="iconfont icon-menu"></i>
134 <span class="alias">{{currentAccount.alias}}</span>
137 <div class="content">
138 <img src="@/assets/logo.png" class="token-icon">
139 <div v-if="currentAccount.address!=undefined" class="amount">
140 <div class="token-amount">
142 <span class="asset">BTM</span>
144 <p class="account-address">
145 <span class="address-text" :title="addressTitle" :data-clipboard-text="currentAccount.address">{{shortAddress}}</span>
146 <i class="iconfont qrcode" @click="showQrcode"></i>
149 <a v-if="currentAccount.address!=undefined" class="btn btn-primary btn-transfer" @click="transferOpen">{{ $t('main.transfer') }}</a>
153 <div v-if="currentAccount.address!=undefined">
154 <section class="transaction-title">
155 <h3 class="bg-gray">{{ $t('main.record') }}</h3>
157 <section class="transactions">
158 <vue-scroll @handle-scroll="handleScroll">
160 <li class="list-item" v-for="(transcation, index) in transactions" :key="index" @click="$router.push({name: 'transfer-info', params: {transcation: transcation, address: currentAccount.address}})">
161 <div class="value">{{transcation.direct}} {{transcation.val.toFixed(2)}} BTM</div>
163 <div v-if="transcation.is_confirmed" class="time">{{transcation.block_timestamp | moment}}</div>
164 <div v-else class="time">{{transcation.submission_timestamp | moment}}</div>
165 <div class="addr">{{transcation.address}}</div>
173 <p style="width: 250px; margin: 30px auto; text-align: center;">{{ $t('main.noAccount') }}</p>
174 <router-link :to="{name: 'menu-account-creation'}">
175 <a class="btn btn-primary btn-creation bg-green">{{ $t('main.create') }}</a>
180 <div class="mask" v-show="maskShow"></div>
181 <transition :enter-active-class="enterActive" :leave-active-class="leaveActive">
182 <router-view></router-view>
186 <Qrcode ref="qrcode"></Qrcode>
191 import ClipboardJS from "clipboard";
192 import Menu from "@/views/homeMenu";
193 import Qrcode from "@/views/qrcode";
194 import Transfer from "@/views/transfer";
195 import TxInfo from "@/views/transferDetail";
196 import address from "@/utils/address";
197 import account from "@/models/account";
198 import transaction from "@/models/transaction";
199 import { BTM } from "@/utils/constants";
201 const EnterActive = 'animated faster fadeInLeft';
202 const LeaveActive = 'animated faster fadeOutLeft';
211 clipboard: new ClipboardJS(".address-text"),
212 addressTitle: this.$t("main.copy"),
219 enterActive: EnterActive,
220 leaveActive: LeaveActive,
225 if (to.name.startsWith('menu')) {
227 } else if (from.name.startsWith('menu')) {
228 this.maskShow = false
231 //account toggle by the list from menu
232 if (to.name == 'home' && to.params.selectedAccount != undefined) {
233 this.currentAccount = to.params.selectedAccount
234 this.refreshAccounts();
237 // remove transition for some page
238 this.enterActive = EnterActive
239 this.leaveActive = LeaveActive
240 if (to.name == 'transfer-confirm' || from.name == 'transfer-confirm') {
241 this.enterActive = ''
242 this.leaveActive = ''
245 currentAccount(newVal, oldVal) {
246 if (newVal.guid == undefined) return;
247 localStorage.currentAccount = JSON.stringify(newVal);
249 this.refreshTransactions(newVal.guid, newVal.address).then(transactions => {
250 this.transactions = transactions
253 'currentAccount.guid'(guid) {
254 if (guid == undefined) return;
256 this.refreshBalance(guid);
260 shortAddress: function () {
261 return address.short(this.currentAccount.address)
263 accountBalance: function () {
264 return this.currentAccount.balance != 0 ? this.currentAccount.balance : '0.00'
269 this.clipboard.on("success", e => {
271 header: this.$t("dialog.header"),
272 body: this.$t("dialog.copy.success")
275 this.clipboard.on("error", e => {
277 header: this.$t("dialog.header"),
278 body: this.$t("dialog.copy.fail")
282 setupRefreshTimer() {
283 // todo refresh all accounts
286 this.refreshBalance(this.currentAccount.guid)
290 this.network = localStorage.bytomNet;
291 account.setupNet(this.network);
293 networkToggle: function (val) {
294 localStorage.bytomNet = this.network;
295 account.setupNet(this.network);
296 this.currentAccount = {}
297 this.refreshAccounts();
299 showQrcode: function () {
300 this.$refs.qrcode.open(this.currentAccount.address);
302 openMenu: function () {
303 this.$router.push({ name: 'menu', params: { accounts: this.accounts, selected: this.currentAccount } })
305 transferOpen: function () {
306 this.$router.push({ name: 'transfer', params: { account: this.currentAccount } })
308 handleScroll(vertical, horizontal, nativeEvent) {
309 if (vertical.process == 0) {
311 this.refreshTransactions(this.currentAccount.guid, this.currentAccount.address).then(transactions => {
312 this.transactions = transactions
317 if (vertical.process == 1) {
318 this.start += this.limit;
319 this.refreshTransactions(this.currentAccount.guid, this.currentAccount.address, this.start, this.limit).then(transactions => {
320 transactions.forEach(transaction => {
321 this.transactions.push(transaction);
326 refreshAccounts: function () {
327 account.list().then(accounts => {
328 this.accounts = accounts;
329 if (accounts.length == 0) {
333 if (this.currentAccount.guid == undefined) {
334 this.currentAccount = accounts[0];
338 refreshBalance: function (guid) {
339 account.balance(guid).then(balance => {
340 this.currentAccount.balance = balance;
341 this.currentAccount = Object.assign({}, this.currentAccount);
346 refreshTransactions: function (guid, address, start, limit) {
347 return new Promise((resolve, reject) => {
348 transaction.list(guid, address, start, limit).then(ret => {
349 let transactions = ret.result.data;
350 if (transactions == null) {
354 const formattedTx = this.transactionsFormat(transactions);
355 console.log("formatTx", formattedTx);
363 transactionsFormat: function (transactions) {
364 const formattedTransactions = []
367 transactions.forEach(transaction => {
368 const balanceObject = transaction.balances
369 .filter(b => b.asset === assetID);
371 if(balanceObject.length ===1 ){
373 const inputAddresses = transaction.inputs
374 .filter(input => input.asset === assetID && input.address !== this.currentAccount.address)
375 .map(input => input.address)
377 const outputAddresses = transaction.outputs
378 .filter(output => output.asset === assetID && output.address !== this.currentAccount.address)
379 .map(output => output.address)
382 const val = assetID===BTM ? Number(balanceObject[0].amount)/ 100000000 : Number(balanceObject[0].amount);
385 transaction.direct = "+";
386 transaction.address = address.short(inputAddresses.pop());
388 transaction.direct = "-";
389 transaction.address = address.short(outputAddresses.pop());
392 transaction.val = Math.abs(val);
393 transaction.fee = transaction.fee / 100000000;
395 formattedTransactions.push(transaction);
398 return formattedTransactions;
402 this.currentAccount = JSON.parse(localStorage.currentAccount);
404 this.setupClipboard();
405 this.setupRefreshTimer();
406 this.refreshAccounts();
409 this.clipboard.destroy();