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 {
101 border-bottom: 1px solid #5e5e5e;
120 <section class="bg-green">
122 <div class="topbar-right">
124 <select v-model="network" @change="networkToggle">
125 <option value="mainnet">{{ $t('main.mainNet') }}</option>
126 <option value="testnet">{{ $t('main.testNet') }}</option>
129 <div class="topbar-left">
130 <a class="btn-menu" @click="openMenu">
131 <i class="iconfont icon-menu"></i>
133 <span class="alias">{{currentAccount.alias}}</span>
136 <div class="content">
137 <img src="@/assets/logo.png" class="token-icon">
138 <div v-if="currentAccount.address!=undefined" class="amount">
139 <div class="token-amount">
141 <span class="asset">BTM</span>
143 <p class="account-address">
144 <span class="address-text" :title="addressTitle" :data-clipboard-text="currentAccount.address">{{shortAddress}}</span>
145 <i class="iconfont qrcode" @click="showQrcode"></i>
148 <a v-if="currentAccount.address!=undefined" class="btn btn-primary btn-transfer" @click="transferOpen">{{ $t('main.transfer') }}</a>
152 <div v-if="currentAccount.address!=undefined">
153 <section class="transaction-title">
154 <h3 class="bg-gray">{{ $t('main.record') }}</h3>
156 <section class="transactions">
157 <vue-scroll @handle-scroll="handleScroll">
159 <li class="list-item" v-for="(transcation, index) in transactions" :key="index" @click="$router.push({name: 'transfer-info', params: {transcation: transcation, address: currentAccount.address}})">
160 <div class="value">{{transcation.direct}} {{transcation.val.toFixed(2)}} BTM</div>
162 <div v-if="transcation.is_confirmed" class="time">{{transcation.block_timestamp | moment}}</div>
163 <div v-else class="time">{{transcation.submission_timestamp | moment}}</div>
164 <div class="addr">{{transcation.address}}</div>
172 <p style="width: 250px; margin: 30px auto; text-align: center;">{{ $t('main.noAccount') }}</p>
173 <a class="btn btn-primary btn-creation bg-green" @click="$refs.menu.open('creation')">{{ $t('main.create') }}</a>
177 <div class="mask" v-show="maskShow"></div>
178 <transition :enter-active-class="enterActive" :leave-active-class="leaveActive">
179 <router-view></router-view>
183 <Qrcode ref="qrcode"></Qrcode>
188 import ClipboardJS from "clipboard";
189 import Menu from "@/views/homeMenu";
190 import Qrcode from "@/views/qrcode";
191 import Transfer from "@/views/transfer";
192 import TxInfo from "@/views/transferDetail";
193 import address from "@/utils/address";
194 import account from "@/models/account";
195 import transaction from "@/models/transaction";
196 const EnterActive = 'animated faster fadeInLeft';
197 const LeaveActive = 'animated faster fadeOutLeft';
206 clipboard: new ClipboardJS(".address-text"),
207 addressTitle: this.$t("main.copy"),
214 enterActive: EnterActive,
215 leaveActive: LeaveActive,
220 if (to.name.startsWith('menu')) {
222 } else if (from.name.startsWith('menu')) {
223 this.maskShow = false
226 //account toggle by the list from menu
227 if (to.name == 'home' && to.params.selectedAccount != undefined && from.name == 'menu') {
228 this.currentAccount = to.params.selectedAccount
231 // remove transition for some page
232 this.enterActive = EnterActive
233 this.leaveActive = LeaveActive
234 if (to.name == 'transfer-confirm' || from.name == 'transfer-confirm') {
235 this.enterActive = ''
236 this.leaveActive = ''
239 currentAccount(newVal, oldVal) {
240 if (newVal.guid == undefined) {
244 this.refreshTransactions(newVal.guid, newVal.address).then(transactions => {
245 this.transactions = transactions
250 shortAddress: function () {
251 return address.short(this.currentAccount.address)
253 accountBalance: function () {
254 return this.currentAccount.balance
258 setupShortAddr(rawAddress) {
259 this.currentAccount.address_short = address.short(rawAddress);
262 this.clipboard.on("success", e => {
264 header: this.$t("dialog.header"),
265 body: this.$t("dialog.copy.success")
268 this.clipboard.on("error", e => {
270 header: this.$t("dialog.header"),
271 body: this.$t("dialog.copy.fail")
275 setupRefreshTimer() {
276 // todo refresh all accounts
279 this.refreshBalance(this.currentAccount.guid)
283 this.network = localStorage.bytomNet;
284 account.setupNet(this.network);
286 networkToggle: function (val) {
287 localStorage.bytomNet = this.network;
288 account.setupNet(this.network);
289 this.refreshAccounts();
291 showQrcode: function () {
292 this.$refs.qrcode.open(this.currentAccount.address);
294 openMenu: function () {
295 this.$router.push({ name: 'menu', params: { accounts: this.accounts, selected: this.currentAccount } })
297 transferOpen: function () {
298 this.$router.push({ name: 'transfer', params: { account: this.currentAccount } })
300 handleScroll(vertical, horizontal, nativeEvent) {
301 if (vertical.process == 0) {
303 this.refreshTransactions(this.currentAccount.guid, this.currentAccount.address).then(transactions => {
304 this.transactions = transactions
309 if (vertical.process == 1) {
310 this.start += this.limit;
311 this.refreshTransactions(this.currentAccount.guid, this.currentAccount.address, this.start, this.limit).then(transactions => {
312 transactions.forEach(transaction => {
313 this.transactions.push(transaction);
318 refreshAccounts: function () {
319 account.list().then(accounts => {
320 this.accounts = accounts;
321 if (accounts.length == 0) {
325 if (localStorage.currentAccount != undefined) {
326 this.currentAccount = JSON.parse(localStorage.currentAccount);
328 this.currentAccount = accounts[0];
332 refreshBalance: function (guid) {
333 account.balance(guid).then(balance => {
334 this.currentAccount.balance = balance;
335 this.currentAccount = Object.assign({}, this.currentAccount);
340 refreshTransactions: function (guid, address, start, limit) {
341 return new Promise((resolve, reject) => {
342 transaction.list(guid, address, start, limit).then(ret => {
343 let transactions = ret.result.data;
344 if (transactions == null) {
348 this.transactionsFormat(transactions);
349 console.log("formatTx", transactions);
350 resolve(transactions)
357 transactionsFormat: function (transactions) {
358 transactions.forEach(transaction => {
361 let selfInputSum = 0;
362 let selfoutputSum = 0;
363 let inputAddresses = [];
364 let outputAddresses = [];
365 transaction.inputs.forEach(input => {
366 inputSum += input.amount;
367 if (input.address == this.currentAccount.address) {
368 selfInputSum += input.amount;
372 inputAddresses.push(input.address);
374 transaction.outputs.forEach(output => {
375 outputSum += output.amount;
376 if (output.address == this.currentAccount.address) {
377 selfoutputSum += output.amount;
381 outputAddresses.push(output.address);
384 let val = selfoutputSum - selfInputSum;
386 transaction.direct = "+";
387 transaction.address = address.short(inputAddresses.pop());
389 val = selfInputSum - selfoutputSum;
390 transaction.direct = "-";
391 transaction.address = address.short(outputAddresses.pop());
393 transaction.val = Number(val / 100000000);
394 transaction.fee = Number(inputSum - outputSum) / 100000000;
400 this.setupClipboard();
401 this.setupRefreshTimer();
402 this.refreshAccounts();
405 this.clipboard.destroy();