OSDN Git Service

refactor: update code
authormonky <monky@it709.com>
Fri, 28 Dec 2018 17:14:18 +0000 (01:14 +0800)
committermonky <monky@it709.com>
Fri, 28 Dec 2018 17:14:18 +0000 (01:14 +0800)
44 files changed:
build/webpack.base.conf.js
package-lock.json
package.json
src/app/common/bytom.js [deleted file]
src/app/entry/home.vue
src/app/home/menu-backup.vue
src/app/home/menu-creation.vue
src/app/home/menu-recovery.vue
src/app/home/menu.vue
src/app/index.js
src/app/transfer/confirm.vue
src/app/transfer/transfer.vue
src/app/welcome/form-addon.vue
src/app/welcome/form-recover.vue
src/background.js [new file with mode: 0644]
src/background/account.js [deleted file]
src/background/bytom.js [deleted file]
src/background/index.js [deleted file]
src/background/query.js [deleted file]
src/background/transaction.js [deleted file]
src/common/crun.js [deleted file]
src/components/dialog/component.vue [moved from src/app/components/dialog/component.vue with 100% similarity]
src/components/dialog/index.js [moved from src/app/components/dialog/index.js with 100% similarity]
src/components/menu-page/index.js [moved from src/app/components/menu-page/index.js with 100% similarity]
src/components/menu-page/page.vue [moved from src/app/components/menu-page/page.vue with 100% similarity]
src/components/select/index.js [moved from src/app/components/select/index.js with 100% similarity]
src/components/select/mixins/ajax.js [moved from src/app/components/select/mixins/ajax.js with 100% similarity]
src/components/select/mixins/index.js [moved from src/app/components/select/mixins/index.js with 100% similarity]
src/components/select/mixins/pointerScroll.js [moved from src/app/components/select/mixins/pointerScroll.js with 100% similarity]
src/components/select/mixins/typeAheadPointer.js [moved from src/app/components/select/mixins/typeAheadPointer.js with 100% similarity]
src/components/select/select.vue [moved from src/app/components/select/select.vue with 100% similarity]
src/content.js [new file with mode: 0644]
src/content/index.js [deleted file]
src/content/inject.js [deleted file]
src/inject.js [new file with mode: 0644]
src/models/account.js [new file with mode: 0644]
src/models/query.js [new file with mode: 0644]
src/models/transaction.js [new file with mode: 0644]
src/options/App.vue [deleted file]
src/options/index.js [deleted file]
src/popup.js [new file with mode: 0644]
src/popup/index.js [deleted file]
src/prompt.js [new file with mode: 0644]
src/prompt/index.js [deleted file]

index 09d2ef6..7bc0884 100644 (file)
@@ -1,55 +1,54 @@
-const path = require("path");
-const execa = require("execa");
-const webpack = require("webpack");
-const CopyWebpackPlugin = require("copy-webpack-plugin");
-const WebpackAutoInject = require("webpack-auto-inject-version");
-const ChromeReloadPlugin = require("wcer");
-const { resolve, page, assetsPath } = require("./util");
+const path = require('path')
+const execa = require('execa')
+const webpack = require('webpack')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const WebpackAutoInject = require('webpack-auto-inject-version')
+const ChromeReloadPlugin = require('wcer')
+const { resolve, page, assetsPath } = require('./util')
 
-var gitHash = execa.sync("git", ["rev-parse", "--short", "HEAD"]).stdout;
-console.log("gitHash:", gitHash);
+var gitHash = execa.sync('git', ['rev-parse', '--short', 'HEAD']).stdout
+console.log('gitHash:', gitHash)
 module.exports = {
   entry: {
-    popup: resolve("src/popup"),
-    prompt: resolve("src/prompt"),
-    options: resolve("src/options"),
-    content: resolve("src/content"),
-    background: resolve("src/background"),
-    inject: resolve("src/content/inject")
+    popup: resolve('src/popup.js'),
+    prompt: resolve('src/prompt.js'),
+    content: resolve('src/content.js'),
+    inject: resolve('src/inject.js'),
+    background: resolve('src/background.js')
   },
   output: {
-    path: resolve("dist"),
-    publicPath: "/",
-    filename: "js/[name].js",
-    chunkFilename: "js/[name].js"
+    path: resolve('dist'),
+    publicPath: '/',
+    filename: 'js/[name].js',
+    chunkFilename: 'js/[name].js'
   },
   module: {
     rules: [
       {
         test: /\.css$/,
-        use: ["vue-style-loader", "css-loader"]
+        use: ['vue-style-loader', 'css-loader']
       },
       {
         test: /\.scss$/,
-        use: ["vue-style-loader", "css-loader", "sass-loader"]
+        use: ['vue-style-loader', 'css-loader', 'sass-loader']
       },
       {
         test: /\.sass$/,
-        use: ["vue-style-loader", "css-loader", "sass-loader?indentedSyntax"]
+        use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
       },
       {
         test: /\.vue$/,
-        loader: "vue-loader",
+        loader: 'vue-loader',
         options: {
           loaders: {
             // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
             // the "scss" and "sass" values for the lang attribute to the right configs here.
             // other preprocessors should work out of the box, no loader config like this necessary.
-            scss: ["vue-style-loader", "css-loader", "sass-loader"],
+            scss: ['vue-style-loader', 'css-loader', 'sass-loader'],
             sass: [
-              "vue-style-loader",
-              "css-loader",
-              "sass-loader?indentedSyntax"
+              'vue-style-loader',
+              'css-loader',
+              'sass-loader?indentedSyntax'
             ]
           }
           // other vue-loader options go here
@@ -57,69 +56,69 @@ module.exports = {
       },
       {
         test: /\.js$/,
-        loader: "babel-loader",
+        loader: 'babel-loader',
         exclude: /node_modules/
       },
       {
         test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
-        loader: "url-loader",
+        loader: 'url-loader',
         options: {
           limit: 10000,
-          name: assetsPath("img/[name].[hash:7].[ext]")
+          name: assetsPath('img/[name].[hash:7].[ext]')
         }
       },
       {
         test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
-        loader: "url-loader",
+        loader: 'url-loader',
         options: {
           limit: 10000,
-          name: assetsPath("media/[name].[hash:7].[ext]")
+          name: assetsPath('media/[name].[hash:7].[ext]')
         }
       },
       {
         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
-        loader: "url-loader",
+        loader: 'url-loader',
         options: {
           limit: 10000,
-          name: assetsPath("fonts/[name].[hash:7].[ext]")
+          name: assetsPath('fonts/[name].[hash:7].[ext]')
         }
       }
     ]
   },
   resolve: {
     alias: {
-      vue$: "vue/dist/vue.esm.js",
-      "@": resolve("src")
+      vue$: 'vue/dist/vue.esm.js',
+      '@': resolve('src')
     },
-    extensions: ["*", ".js", ".vue", ".json"]
+    extensions: ['*', '.js', '.vue', '.json']
   },
   plugins: [
     page({
-      title: "popup title",
-      name: "popup",
-      chunks: ["popup"]
+      title: 'popup title',
+      name: 'popup',
+      chunks: ['popup']
     }),
     page({
-      title: "options title",
-      name: "options",
-      chunks: ["options"]
+      title: 'options title',
+      name: 'options',
+      chunks: ['options']
     }),
     page({
-      title: "转账",
-      name: "prompt",
-      chunks: ["prompt"]
+      title: '转账',
+      name: 'prompt',
+      chunks: ['prompt']
     }),
     new CopyWebpackPlugin([
       {
-        from: resolve("static")
+        from: resolve('static')
       }
     ]),
     new ChromeReloadPlugin({
       port: 23333,
-      manifest: resolve("src/manifest.js")
+      manifest: resolve('src/manifest.js')
     }),
     new webpack.DefinePlugin({
-      "version.hash": JSON.stringify(gitHash)
+      'version.hash': JSON.stringify(gitHash)
     }),
     new WebpackAutoInject({
       PACKAGE_JSON_PATH: './package.json',
@@ -136,4 +135,4 @@ module.exports = {
   performance: {
     hints: false
   }
-};
+}
index dc55495..c517a2a 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "chrome-extension-wallet",
-  "version": "0.3.0",
+  "version": "0.4.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
       "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg=="
     },
+    "aes-oop": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/aes-oop/-/aes-oop-1.0.4.tgz",
+      "integrity": "sha512-bUZIzuZg2PoYoHS6SeuLyvEmDlhOYvRVvJ23MA8j+RC+lrf4Oep7v6xmwfdZytrDAeesMhQn50kf7NQ9PgxjgA==",
+      "requires": {
+        "sjcl": "1.0.8"
+      }
+    },
     "ajv": {
       "version": "5.5.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
     },
     "ansi-escapes": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
       "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
     },
     "ansi-html": {
         }
       }
     },
+    "extension-streams": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/extension-streams/-/extension-streams-1.0.7.tgz",
+      "integrity": "sha512-AFPvzPXvdhEbbSaI0gwdq4ODmE4/yRVJsgbLsdRvk3gQOzDy2Pp9q8uC5dvJfcyCW2SSV9Uhwq6d23NZ4tflyw==",
+      "requires": {
+        "aes-oop": "1.0.4"
+      }
+    },
     "external-editor": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
       "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
     },
+    "sjcl": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.8.tgz",
+      "integrity": "sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ=="
+    },
     "slash": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
index 6651ba5..1d85009 100644 (file)
@@ -16,6 +16,7 @@
         "babel-preset-es2015": "^6.24.1",
         "bytom-js-sdk": "^1.4.0",
         "clipboard": "^2.0.1",
+        "extension-streams": "^1.0.7",
         "file-saver": "^2.0.0-rc.3",
         "iview": "^3.0.0",
         "moment": "^2.22.2",
@@ -59,4 +60,4 @@
         "webpack-dev-server": "^2.9.1",
         "webpack-merge": "^4.1.2"
     }
-}
\ No newline at end of file
+}
diff --git a/src/app/common/bytom.js b/src/app/common/bytom.js
deleted file mode 100644 (file)
index b3fb31e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-let bytom = {};
-
-var bg = chrome.extension.getBackgroundPage();
-
-bytom.Query = bg.bytomQuery;
-bytom.System = bg.bytomSystem;
-bytom.Account = bg.bytomAccount;
-bytom.Transaction = bg.bytomTransaction;
-
-export default bytom;
\ No newline at end of file
index 1c59af4..1655ef9 100644 (file)
 <style lang="" scoped>
 .warp {
-  z-index: 1;
+    z-index: 1;
 }
 
 .topbar {
-  font-size: 19px;
+    font-size: 19px;
 }
 .topbar .topbar-left {
-  width: 120px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  padding-top: 20px;
-  padding-left: 20px;
+    width: 120px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    padding-top: 20px;
+    padding-left: 20px;
 }
 .topbar-left .btn-menu {
-  float: left;
-  margin-right: 8px;
+    float: left;
+    margin-right: 8px;
 }
 .topbar-left .btn-menu i {
-  font-size: 100%;
+    font-size: 100%;
 }
 .topbar-left .alias {
-  height: 25px;
-  font-size: 19px;
-  line-height: 28px;
+    height: 25px;
+    font-size: 19px;
+    line-height: 28px;
 }
 
 .topbar .topbar-right {
-  float: right;
-  margin-top: 20px;
-  margin-right: 20px;
-  border: 2px solid #fff;
-  border-radius: 18px;
-  padding: 0 10px;
-  font: 12px system-ui;
-  text-align: center;
+    float: right;
+    margin-top: 20px;
+    margin-right: 20px;
+    border: 2px solid #fff;
+    border-radius: 18px;
+    padding: 0 10px;
+    font: 12px system-ui;
+    text-align: center;
 }
 
 .topbar-right .lamp {
-  display: inline-block;
-  width: 6px;
-  height: 6px;
-  border-radius: 50%;
-  background-color: #02f823;
-  margin-right: 2px;
-  position: relative;
-  top: -2px;
+    display: inline-block;
+    width: 6px;
+    height: 6px;
+    border-radius: 50%;
+    background-color: #02f823;
+    margin-right: 2px;
+    position: relative;
+    top: -2px;
 }
 
 .content {
-  margin-top: 20px;
-  text-align: center;
-  padding: 0 30px 20px;
+    margin-top: 20px;
+    text-align: center;
+    padding: 0 30px 20px;
 }
 .content .token-icon {
-  display: inline-flex;
-  height: 40px;
-  width: 40px;
-  padding: 8px;
-  margin: 8px;
+    display: inline-flex;
+    height: 40px;
+    width: 40px;
+    padding: 8px;
+    margin: 8px;
 }
 .content .amount {
-  padding-bottom: 10px;
+    padding-bottom: 10px;
 }
 .content .token-amount {
-  font-size: 45px;
-  line-height: 45px;
+    font-size: 45px;
+    line-height: 45px;
 }
 .token-amount .asset {
-  font-size: 18px;
-  margin-left: 2px;
+    font-size: 18px;
+    margin-left: 2px;
 }
 .qrcode {
-  margin-left: 5px;
-  vertical-align: middle;
-  cursor: pointer;
+    margin-left: 5px;
+    vertical-align: middle;
+    cursor: pointer;
 }
 .btn-transfer {
-  width: 200px;
+    width: 200px;
 }
 
 .transactions {
-  font-size: 15px;
-  height: 275px;
+    font-size: 15px;
+    height: 275px;
 }
 .transactions h3 {
-  font-size: 18px;
-  font-weight: inherit;
-  color: #cacaca;
-  text-align: center;
-  padding: 5px 0;
+    font-size: 18px;
+    font-weight: inherit;
+    color: #cacaca;
+    text-align: center;
+    padding: 5px 0;
 }
 .transactions .list {
-  padding: 0 20px;
+    padding: 0 20px;
 }
 .list-item {
-  display: block;
-  padding: 5px 10px;
-  border-bottom: 1px solid #5e5e5e;
+    display: block;
+    padding: 5px 10px;
+    border-bottom: 1px solid #5e5e5e;
 }
 
 .list-item .value {
-  float: right;
-  margin-top: 13px;
+    float: right;
+    margin-top: 13px;
 }
 .account-address {
-  cursor: pointer;
+    cursor: pointer;
 }
 .btn-creation {
-  display: block;
-  width: 200px;
-  margin: 0 auto;
+    display: block;
+    width: 200px;
+    margin: 0 auto;
 }
 </style>
 
 <template>
-  <div id="app" class="warp">
-    <section class="bg-green">
-      <div class="topbar">
-          <div class="topbar-right">
-            <i class="lamp"></i>
-            <select v-model="network" @change="netToggle">
-              <option value="mainnet">{{ $t('main.mainNet') }}</option>
-              <option value="testnet">{{ $t('main.testNet') }}</option>
-            </select>
-          </div>
-          <div class="topbar-left">
-            <a class="btn-menu" href="#"><i class="iconfont icon-menu" @click="$refs.menu.open()"></i></a>
-            <span class="alias">{{accountInfo.alias}}</span>
-          </div>
-      </div>
-      <div class="content">
-          <img src="../../assets/logo.png" class="token-icon">
-          <div v-if="accountInfo.address!=undefined" class="amount">
-              <div class="token-amount">{{accountInfo.balance}}<span class="asset">BTM</span></div>
-              <p class="account-address">
-                <span class="address-text" :title="addressTitle" :data-clipboard-text="accountInfo.address">{{accountInfo.address_short}}</span>
-                <i class="iconfont qrcode" @click="showQrcode">&#xe7dd;</i>
-              </p>
-          </div>
-          <a v-if="accountInfo.address!=undefined" class="btn btn-primary btn-transfer" @click="transferOpen">{{ $t('main.transfer') }}</a>
-      </div>
-    </section>
+    <div id="app" class="warp">
+        <section class="bg-green">
+            <div class="topbar">
+                <div class="topbar-right">
+                    <i class="lamp"></i>
+                    <select v-model="network" @change="networkToggle">
+                        <option value="mainnet">{{ $t('main.mainNet') }}</option>
+                        <option value="testnet">{{ $t('main.testNet') }}</option>
+                    </select>
+                </div>
+                <div class="topbar-left">
+                    <a class="btn-menu" href="#">
+                        <i class="iconfont icon-menu" @click="$refs.menu.open()"></i>
+                    </a>
+                    <span class="alias">{{currentAccount.alias}}</span>
+                </div>
+            </div>
+            <div class="content">
+                <img src="../../assets/logo.png" class="token-icon">
+                <div v-if="currentAccount.address!=undefined" class="amount">
+                    <div class="token-amount">
+                        {{currentAccount.balance}}
+                        <span class="asset">BTM</span>
+                    </div>
+                    <p class="account-address">
+                        <span class="address-text" :title="addressTitle" :data-clipboard-text="currentAccount.address">{{currentAccount.address_short}}</span>
+                        <i class="iconfont qrcode" @click="showQrcode">&#xe7dd;</i>
+                    </p>
+                </div>
+                <a v-if="currentAccount.address!=undefined" class="btn btn-primary btn-transfer" @click="transferOpen">{{ $t('main.transfer') }}</a>
+            </div>
+        </section>
 
-    <section v-if="accountInfo.address!=undefined" class="transactions">
-      <h3 class="bg-gray">{{ $t('main.record') }}</h3>
-      <vue-scroll @handle-scroll="handleScroll">
-        <ul class="list">
-            <li class="list-item" v-for="(transcation, index) in transcations" :key="index" @click="$refs.trxInfo.open(transcation, accountInfo.address)">
-              <div class="value">{{transcation.direct}} {{transcation.val.toFixed(2)}} BTM</div>
-              <div>
-                <div v-if="transcation.is_confirmed" class="time">{{transcation.block_timestamp | moment}}</div>
-                <div v-else class="time">{{transcation.submission_timestamp | moment}}</div>
-                <div class="addr">{{transcation.address}}</div>
-              </div>
-            </li>
-        </ul>
-      </vue-scroll>
-    </section>
-    <section v-else>
-      <p style="width: 250px; margin: 30px auto; text-align: center;">{{ $t('main.noAccount') }}</p>
-      <a class="btn btn-primary btn-creation bg-green" @click="$refs.menu.open('creation')">{{ $t('main.create') }}</a>
-    </section>
+        <section v-if="currentAccount.address!=undefined" class="transactions">
+            <h3 class="bg-gray">{{ $t('main.record') }}</h3>
+            <vue-scroll @handle-scroll="handleScroll">
+                <ul class="list">
+                    <li class="list-item" v-for="(transcation, index) in transcations" :key="index" @click="$refs.trxInfo.open(transcation, currentAccount.address)">
+                        <div class="value">{{transcation.direct}} {{transcation.val.toFixed(2)}} BTM</div>
+                        <div>
+                            <div v-if="transcation.is_confirmed" class="time">{{transcation.block_timestamp | moment}}</div>
+                            <div v-else class="time">{{transcation.submission_timestamp | moment}}</div>
+                            <div class="addr">{{transcation.address}}</div>
+                        </div>
+                    </li>
+                </ul>
+            </vue-scroll>
+        </section>
+        <section v-else>
+            <p style="width: 250px; margin: 30px auto; text-align: center;">{{ $t('main.noAccount') }}</p>
+            <a class="btn btn-primary btn-creation bg-green" @click="$refs.menu.open('creation')">{{ $t('main.create') }}</a>
+        </section>
 
-    <!-- modal -->
-    <Qrcode ref="qrcode"></Qrcode>
-    <Menu ref="menu" @on-current-account="accountLoader" @accounts-clear="accountClear"></Menu>
-    <Transfer ref="transfer" :fee="fee" :feeTypeOptions="feeTypeOptions" @on-success="refreshTransactions"></Transfer>
-    <TxInfo ref="trxInfo" @on-success="refreshTransactions"></TxInfo>
-  </div>
+        <!-- modal -->
+        <Qrcode ref="qrcode"></Qrcode>
+        <Menu ref="menu" :accounts="accounts" :selectedAccount="currentAccount" @on-account-change="accountToggle"></Menu>
+        <Transfer ref="transfer" :fee="fee" :feeTypeOptions="feeTypeOptions" @on-success="refreshAccounts"></Transfer>
+        <TxInfo ref="trxInfo" @on-success="refreshTransactions"></TxInfo>
+    </div>
 </template>
 
 <script>
@@ -178,174 +183,193 @@ import Menu from "../home/menu";
 import Qrcode from "../transfer/qrcode";
 import Transfer from "../transfer/transfer";
 import TxInfo from "../transfer/detail";
-import bytom from "../common/bytom";
+import account from "../../models/account";
+import transaction from "../../models/transaction";
 import utils from "../common/utils";
 export default {
-  name: "",
-  components: {
-    Menu,
-    Qrcode,
-    Transfer,
-    TxInfo
-  },
-  data() {
-    return {
-      feeTypeOptions: [this.$t('transfer.feeType')],
-      fee: this.$t('transfer.feeType'),
-      network: "mainnet",
-      clipboard: new ClipboardJS(".address-text"),
-      addressTitle: this.$t("main.copy"),
-      menuOpen: false,
-      maskOpen: false,
-      accountInfo: {},
-      transcations: [],
-      start: 0,
-      limit: 10
-    };
-  },
-  methods: {
-    handleScroll(vertical, horizontal, nativeEvent) {
-      if (vertical.process == 0) {
-        this.start = 0;
-        return;
-      }
-
-      if (vertical.process == 1) {
-        this.start += this.limit;
-        this.appendTransactions();
-      }
-    },
-    netToggle: function(val) {
-      bytom.System.setupNet(this.network);
-      localStorage.bytomNet = this.network;
-
-      this.$refs.menu.updateAccounts();
-    },
-    accountClear: function() {
-      this.accountInfo = {};
-      this.transcations = [];
+    name: "",
+    components: {
+        Menu,
+        Qrcode,
+        Transfer,
+        TxInfo
     },
-    accountLoader: function(accountInfo) {
-      this.accountInfo = accountInfo;
-      this.accountInfo.address_short = utils.shortAddress(
-        this.accountInfo.address
-      );
-      this.refreshTransactions();
+    data() {
+        return {
+            feeTypeOptions: [this.$t("transfer.feeType")],
+            fee: this.$t("transfer.feeType"),
+            network: "mainnet",
+            clipboard: new ClipboardJS(".address-text"),
+            addressTitle: this.$t("main.copy"),
+            menuOpen: false,
+            maskOpen: false,
+            accounts: [],
+            currentAccount: {},
+            transcations: [],
+            start: 0,
+            limit: 10
+        };
     },
-    showQrcode: function() {
-      this.$refs.qrcode.open(this.accountInfo.address);
-    },
-    transferOpen: function() {
-      this.fee = this.$t('transfer.feeType');
-      this.feeTypeOptions = [this.$t('transfer.feeType')];
-      this.$refs.transfer.open(this.accountInfo);
+    watch: {
+        currentAccount(newVal) {
+            if (newVal.guid == undefined) {
+                return;
+            }
+
+            this.setupShortAddr(newVal.address)
+            this.refreshBalance(newVal.guid);
+            this.refreshTransactions(newVal.guid, newVal.address).then(transcations => {
+                this.transcations = transcations
+            });
+        }
     },
-    transcationsFormat: function(transactions) {
-      transactions.forEach(transaction => {
-        let inputSum = 0;
-        let outputSum = 0;
-        let selfInputSum = 0;
-        let selfoutputSum = 0;
-        let inputAddresses = [];
-        let outputAddresses = [];
-        transaction.inputs.forEach(input => {
-          inputSum += input.amount;
-          if (input.address == this.accountInfo.address) {
-            selfInputSum += input.amount;
-            return;
-          }
+    methods: {
+        setupShortAddr(address) {
+            this.currentAccount.address_short = utils.shortAddress(address);
+        },
+        setupClipboard() {
+            this.clipboard.on("success", e => {
+                this.$dialog.show({
+                    header: this.$t("dialog.header"),
+                    body: this.$t("dialog.copy.success")
+                });
+            });
+            this.clipboard.on("error", e => {
+                this.$dialog.show({
+                    header: this.$t("dialog.header"),
+                    body: this.$t("dialog.copy.fail")
+                });
+            });
+        },
+        setupRefreshTimer() {
+            setInterval(() => {
+                this.refreshBalance(this.currentAccount.guid)
+            }, 10000)
+        },
+        setupNetwork() {
+            this.network = localStorage.bytomNet;
+            account.setupNet(this.network);
+        },
+        networkToggle: function (val) {
+            localStorage.bytomNet = this.network;
+            account.setupNet(this.network);
+            this.refreshAccounts();
+        },
+        accountToggle: function (selectedAccount) {
+            localStorage.currentAccount = JSON.stringify(selectedAccount);
+            this.currentAccount = selectedAccount;
+            this.refreshAccounts();
+        },
+        showQrcode: function () {
+            this.$refs.qrcode.open(this.currentAccount.address);
+        },
+        transferOpen: function () {
+            this.fee = this.$t("transfer.feeType");
+            this.feeTypeOptions = [this.$t("transfer.feeType")];
+            this.$refs.transfer.open(this.currentAccount);
+        },
+        transcationsFormat: function (transactions) {
+            transactions.forEach(transaction => {
+                let inputSum = 0;
+                let outputSum = 0;
+                let selfInputSum = 0;
+                let selfoutputSum = 0;
+                let inputAddresses = [];
+                let outputAddresses = [];
+                transaction.inputs.forEach(input => {
+                    inputSum += input.amount;
+                    if (input.address == this.currentAccount.address) {
+                        selfInputSum += input.amount;
+                        return;
+                    }
 
-          inputAddresses.push(input.address);
-        });
-        transaction.outputs.forEach(output => {
-          outputSum += output.amount;
-          if (output.address == this.accountInfo.address) {
-            selfoutputSum += output.amount;
-            return;
-          }
+                    inputAddresses.push(input.address);
+                });
+                transaction.outputs.forEach(output => {
+                    outputSum += output.amount;
+                    if (output.address == this.currentAccount.address) {
+                        selfoutputSum += output.amount;
+                        return;
+                    }
 
-          outputAddresses.push(output.address);
-        });
+                    outputAddresses.push(output.address);
+                });
 
-        let val = selfoutputSum - selfInputSum;
-        if (val > 0) {
-          transaction.direct = "+";
-          transaction.address = utils.shortAddress(inputAddresses.pop());
-        } else {
-          val = selfInputSum - selfoutputSum;
-          transaction.direct = "-";
-          transaction.address = utils.shortAddress(outputAddresses.pop());
-        }
-        transaction.val = Number(val / 100000000);
-        transaction.fee = Number(inputSum - outputSum) / 100000000;
-      });
-    },
-    refreshTransactions: function() {
-      this.transcations = [];
-      if (this.accountInfo.guid == undefined) {
-        return;
-      }
+                let val = selfoutputSum - selfInputSum;
+                if (val > 0) {
+                    transaction.direct = "+";
+                    transaction.address = utils.shortAddress(inputAddresses.pop());
+                } else {
+                    val = selfInputSum - selfoutputSum;
+                    transaction.direct = "-";
+                    transaction.address = utils.shortAddress(outputAddresses.pop());
+                }
+                transaction.val = Number(val / 100000000);
+                transaction.fee = Number(inputSum - outputSum) / 100000000;
+            });
+        },
+        refreshAccounts: function () {
+            account.list().then(accounts => {
+                this.accounts = accounts;
+                if (accounts.length == 0) {
+                    return;
+                }
 
-      bytom.Transaction.list(this.accountInfo.guid, this.accountInfo.address)
-        .then(ret => {
-          let transactions = ret.result.data;
-          if (transactions == null) {
-            return;
-          }
+                if (localStorage.currentAccount != undefined) {
+                    this.currentAccount = JSON.parse(localStorage.currentAccount);
+                } else {
+                    this.currentAccount = accounts[0];
+                }
+            });
+        },
+        refreshBalance: function (guid) {
+            account.balance(guid).then(balance => {
+                this.currentAccount.balance = balance
+            }).catch(error => {
+                console.log(error);
+            });
+        },
+        refreshTransactions: function (guid, address) {
+            return new Promise((resolve, reject) => {
+                transaction.list(guid, address).then(ret => {
+                    let transactions = ret.result.data;
+                    if (transactions == null) {
+                        return;
+                    }
 
-          this.transcationsFormat(transactions);
-          console.log("formatTx", transactions);
-          this.transcations = transactions;
-        })
-        .catch(error => {
-          console.log(error);
-        });
-    },
-    appendTransactions: function() {
-      bytom.Transaction.list(
-        this.accountInfo.guid,
-        this.accountInfo.address,
-        this.start,
-        this.limit
-      )
-        .then(ret => {
-          let transactions = ret.result.data;
-          if (transactions == null || ret._links.next == undefined) {
-            return;
-          }
+                    this.transcationsFormat(transactions);
+                    console.log("formatTx", transactions);
+                    resolve(transactions)
+                }).catch(error => {
+                    console.log(error);
+                    reject(error)
+                });
+            })
+        },
+        handleScroll(vertical, horizontal, nativeEvent) {
+            if (vertical.process == 0) {
+                this.start = 0;
+                return;
+            }
 
-          this.transcationsFormat(transactions);
-          console.log("formatTx", transactions);
-          transactions.forEach(transaction => {
-            this.transcations.push(transaction);
-          });
-        })
-        .catch(error => {
-          console.log(error);
-        });
-    }
-  },
-  mounted() {
-    if (localStorage.bytomNet != undefined) {
-      this.network = localStorage.bytomNet;
+            if (vertical.process == 1) {
+                this.start += this.limit;
+                this.refreshTransactions(this.currentAccount.guid, this.currentAccount.address).then(transcations => {
+                    transactions.forEach(transaction => {
+                        this.transcations.push(transaction);
+                    });
+                });
+            }
+        }
+    },
+    mounted() {
+        this.setupClipboard();
+        this.setupRefreshTimer();
+        this.setupNetwork();
+        this.refreshAccounts();
+    },
+    beforeDestroy() {
+        this.clipboard.destroy();
     }
-    this.refreshTransactions();
-
-    this.clipboard.on("success", e => {
-      this.$dialog.show({
-        header: this.$t("dialog.header"),
-        body: this.$t("dialog.copy.success")
-      });
-    });
-    this.clipboard.on("error", e => {
-      this.$dialog.show({
-        header: this.$t("dialog.header"),
-        body: this.$t("dialog.copy.fail")
-      });
-    });
-  },
-  beforeDestroy() {
-    this.clipboard.destroy();
-  }
 };
 </script>
\ No newline at end of file
index 9774c31..50473a9 100644 (file)
@@ -1,38 +1,37 @@
 <style scoped>
-
 </style>
 
 <template>
     <MenuPage :title="$t('backup.title')" @back="back">
-      <div style="text-align: center">
-        <div style="width: 200px;" class="btn bg-green" @click="backup">{{ $t('backup.button') }}</div>
-      </div>
+        <div style="text-align: center">
+            <div style="width: 200px;" class="btn bg-green" @click="backup">{{ $t('backup.button') }}</div>
+        </div>
     </MenuPage>
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
 import FileSaver from "file-saver";
 export default {
-  name: "",
-  data() {
-    return {};
-  },
-  methods: {
-    back: function() {
-      this.$emit("on-back");
-    },
-    close: function() {
-      this.$emit("on-exit");
+    name: "",
+    data() {
+        return {};
     },
-    backup() {
-      bytom.Account.backup().then(txt => {
-        var blob = new Blob([txt], {
-          type: "text/plain;charset=utf-8"
-        });
-        FileSaver.saveAs(blob, "bytom_chrome_wallet_backup.txt");
-      });
+    methods: {
+        back: function () {
+            this.$emit("on-back");
+        },
+        close: function () {
+            this.$emit("on-exit");
+        },
+        backup() {
+            account.backup().then(txt => {
+                var blob = new Blob([txt], {
+                    type: "text/plain;charset=utf-8"
+                });
+                FileSaver.saveAs(blob, "bytom_chrome_wallet_backup.txt");
+            });
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
index 768e5ee..fe8d2f1 100644 (file)
 <style scoped>
 .form-item {
-  background: transparent;
-  margin: 0;
+    background: transparent;
+    margin: 0;
 }
 .form-item .form-item-content {
-  padding: 0 10px;
-  background-color: #282f38;
-  border-radius: 5px;
+    padding: 0 10px;
+    background-color: #282f38;
+    border-radius: 5px;
 }
 .form-item .form-item-label {
-  float: none;
-  width: 200px;
-  line-height: 35px;
-  margin: 0 5px;
+    float: none;
+    width: 200px;
+    line-height: 35px;
+    margin: 0 5px;
 }
 .form-item .btn {
-  width: 200px;
-  margin-top: 15px;
+    width: 200px;
+    margin-top: 15px;
 }
 </style>
 
 <template>
     <MenuPage :title="$t('createAccount.title')" @back="back">
-      <div class="form">
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('createAccount.accountAlias') }}</label>
-            <div class="form-item-content">
-              <input type="text" v-model="formItem.accAlias">
+        <div class="form">
+            <div class="form-item">
+                <label class="form-item-label">{{ $t('createAccount.accountAlias') }}</label>
+                <div class="form-item-content">
+                    <input type="text" v-model="formItem.accAlias">
+                </div>
             </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('createAccount.keyAlias') }}</label>
-            <div class="form-item-content">
-              <input type="text" v-model="formItem.keyAlias">
+            <div class="form-item">
+                <label class="form-item-label">{{ $t('createAccount.keyAlias') }}</label>
+                <div class="form-item-content">
+                    <input type="text" v-model="formItem.keyAlias">
+                </div>
             </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('createAccount.keyPassword') }}</label>
-            <div class="form-item-content">
-              <input type="password" v-model="formItem.passwd1">
+            <div class="form-item">
+                <label class="form-item-label">{{ $t('createAccount.keyPassword') }}</label>
+                <div class="form-item-content">
+                    <input type="password" v-model="formItem.passwd1">
+                </div>
             </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('createAccount.confirmPassword') }}</label>
-            <div class="form-item-content">
-              <input type="password" v-model="formItem.passwd2">
+            <div class="form-item">
+                <label class="form-item-label">{{ $t('createAccount.confirmPassword') }}</label>
+                <div class="form-item-content">
+                    <input type="password" v-model="formItem.passwd2">
+                </div>
+            </div>
+            <div class="tips">{{tips}}</div>
+            <div class="form-item bg-gray" style="text-align: center">
+                <div class="btn bg-green" @click="create">{{ $t('createAccount.create') }}</div>
             </div>
-          </div>
-          <div class="tips">{{tips}}</div>
-          <div class="form-item bg-gray" style="text-align: center">
-            <div class="btn bg-green" @click="create">{{ $t('createAccount.create') }}</div>
-          </div>
         </div>
     </MenuPage>
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
 export default {
-  name: "",
-  components: {},
-  data() {
-    return {
-      formItem: {
-        accAlias: "",
-        keyAlias: "",
-        passwd1: "",
-        passwd2: ""
-      },
-      tips: ""
-    };
-  },
-  methods: {
-    back: function() {
-      this.$emit("on-back", "creation");
-    },
-    close: function() {
-      this.$emit("on-exit", "creation");
+    name: "",
+    components: {},
+    data() {
+        return {
+            formItem: {
+                accAlias: "",
+                keyAlias: "",
+                passwd1: "",
+                passwd2: ""
+            },
+            tips: ""
+        };
     },
-    create: function() {
-      if (this.formItem.accAlias == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputAlias")
-        });
-        return;
-      }
-      if (this.formItem.keyAlias == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputKey")
-        });
-        return;
-      }
-      if (this.formItem.passwd1 == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputPass")
-        });
-        return;
-      }
-      if (this.formItem.passwd1 != this.formItem.passwd2) {
-        this.tips = this.$t('createAccount.passwordAgain');
-        return;
-      }
+    methods: {
+        back: function (accountInfo) {
+            this.$emit("on-back", accountInfo);
+        },
+        close: function () {
+            this.$emit("on-exit", "creation");
+        },
+        create: function () {
+            if (this.formItem.accAlias == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputAlias")
+                });
+                return;
+            }
+            if (this.formItem.keyAlias == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputKey")
+                });
+                return;
+            }
+            if (this.formItem.passwd1 == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputPass")
+                });
+                return;
+            }
+            if (this.formItem.passwd1 != this.formItem.passwd2) {
+                this.tips = this.$t('createAccount.passwordAgain');
+                return;
+            }
 
-      let loader = this.$loading.show({
-        container: this.fullPage ? null : this.$refs.formContainer,
-        canCancel: true,
-        onCancel: this.onCancel
-      });
+            let loader = this.$loading.show({
+                container: this.fullPage ? null : this.$refs.formContainer,
+                canCancel: true,
+                onCancel: this.onCancel
+            });
 
-      bytom.Account.create(
-        this.formItem.accAlias,
-        this.formItem.keyAlias,
-        this.formItem.passwd1
-      )
-        .then(res => {
-          console.log("bytom.Account.create", res);
-          this.formItem = {};
-          loader.hide();
-          this.back();
-        })
-        .catch(err => {
-          console.log(err);
-          loader.hide();
-          this.$dialog.show({
-            body: err.message
-          });
-          // this.tips = err.message;
-        });
-    }
-  },
-  mounted() {}
+            account.create(this.formItem.accAlias, this.formItem.keyAlias, this.formItem.passwd1).then(res => {
+                console.log("bytom.Account.create", res);
+                this.formItem = {};
+                this.back(res);
+                loader.hide();
+            }).catch(err => {
+                console.log(err);
+                loader.hide();
+                this.$dialog.show({
+                    body: err.message
+                });
+                // this.tips = err.message;
+            });
+        }
+    },
+    mounted() { }
 };
 </script>
\ No newline at end of file
index 30a6533..e07d9f3 100644 (file)
@@ -1,60 +1,57 @@
 <style scoped>
 .body {
-  padding: 20px 15px;
+    padding: 20px 15px;
 }
 input {
-  width: 165px;
+    width: 165px;
 }
 </style>
 
 <template>
-  <MenuPage title="导入账户" @back="back">
-    <div class="form-item">
-        <input type="file" ref="file" @change="tirggerFile($event)">
-    </div>
-    <div class="btn bg-green" @click="recovery">从种子导入</div>
-  </MenuPage>
+    <MenuPage title="导入账户" @back="back">
+        <div class="form-item">
+            <input type="file" ref="file" @change="tirggerFile($event)">
+        </div>
+        <div class="btn bg-green" @click="recovery">从种子导入</div>
+    </MenuPage>
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
 import getLang from "../../assets/language/sdk";
 export default {
-  name: "",
-  data() {
-    return {
-      fileTxt: ""
-    };
-  },
-  methods: {
-    back: function() {
-      this.$emit("on-back");
+    name: "",
+    data() {
+        return {
+            fileTxt: ""
+        };
     },
-    close: function() {
-      this.$emit("on-exit");
-    },
-    tirggerFile: function(event) {
-      var reader = new FileReader();
-      reader.onload = e => {
-        this.fileTxt = e.target.result;
-      };
+    methods: {
+        back: function () {
+            this.$emit("on-back");
+        },
+        close: function () {
+            this.$emit("on-exit");
+        },
+        tirggerFile: function (event) {
+            var reader = new FileReader();
+            reader.onload = e => {
+                this.fileTxt = e.target.result;
+            };
 
-      var file = event.target.files[0];
-      reader.readAsText(file);
-    },
-    recovery: function() {
-      bytom
-        .restore(this.fileTxt)
-        .then(res => {
-          this.close();
-          console.log("recovery", res);
-        })
-        .catch(error => {
-          this.$dialog.show({
-            body: getLang(error.message),
-          });
-        });
+            var file = event.target.files[0];
+            reader.readAsText(file);
+        },
+        recovery: function () {
+            account.restore(this.fileTxt).then(res => {
+                this.close();
+                console.log("recovery", res);
+            }).catch(error => {
+                this.$dialog.show({
+                    body: getLang(error.message),
+                });
+            });
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
index 6cb3de1..dbf508e 100644 (file)
@@ -1,98 +1,96 @@
 <style scoped>
 .mc-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 994;
-  width: 55%;
-  height: 100%;
-  padding: 40px;
-  background-color: #3c454b;
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 994;
+    width: 55%;
+    height: 100%;
+    padding: 40px;
+    background-color: #3c454b;
 }
 .accounts {
-  width: 100%;
-  height: 200px;
-  overflow-x: hidden;
-  overflow-y: scroll;
-  margin-bottom: 25px;
+    width: 100%;
+    height: 200px;
+    overflow-x: hidden;
+    overflow-y: scroll;
+    margin-bottom: 25px;
 }
 .accounts::-webkit-scrollbar {
-  display: none;
+    display: none;
 }
 .accounts i {
-  font-size: 24px;
+    font-size: 24px;
 }
 
 .menu {
-  border-top: 1px solid #c9c9c9;
-  padding-top: 15px;
+    border-top: 1px solid #c9c9c9;
+    padding-top: 15px;
 }
 .account {
-  width: 150px;
-  display: inline-block;
-  vertical-align: middle;
+    width: 150px;
+    display: inline-block;
+    vertical-align: middle;
 }
 .account-alias {
-  width: 150px;
-  font-size: 19px;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
+    width: 150px;
+    font-size: 19px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
 }
 .account-asset {
-  font-size: 15px;
+    font-size: 15px;
 }
 </style>
 
 <template>
-<div>
-  <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
-  <div v-show="maskShow" class="mask"></div>
-    <transition name="left-menu" v-on:after-leave="close"
-        enter-active-class="animated slideInLeft faster" 
-        leave-active-class="animated slideOutLeft faster">
-      <div v-show="show" class="mc-wrap">
-        <MenuPage :title="$t('menu.title')" @back="close">
-          <div class="list accounts">
-            <div v-for="(account, index) in accounts" :key="index" @click="accountSelected(account)">
-              <div :class="(currentAccount != undefined && account.address == currentAccount.address) ? 'list-item active': 'list-item'">
-                <i class="iconfont icon-user"></i>
-                <div class="account">
-                    <div class="account-alias">{{account.alias}}</div>
-                    <div class="account-asset">{{account.balance}} BTM</div>
+    <div>
+        <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
+        <div v-show="maskShow" class="mask"></div>
+        <transition name="left-menu" v-on:after-leave="close" enter-active-class="animated slideInLeft faster" leave-active-class="animated slideOutLeft faster">
+            <div v-show="show" class="mc-wrap">
+                <MenuPage :title="$t('menu.title')" @back="close">
+                    <div class="list accounts">
+                        <div v-for="(account, index) in accounts" :key="index" @click="accountSelected(account)">
+                            <div :class="(currAccount != undefined && account.address == currAccount.address) ? 'list-item active': 'list-item'">
+                                <i class="iconfont icon-user"></i>
+                                <div class="account">
+                                    <div class="account-alias">{{account.alias}}</div>
+                                    <div class="account-asset">{{account.balance}} BTM</div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="list menu">
+                        <div class="list-item" @click="currView='creation'">
+                            <i class="iconfont icon-plusbox"></i>{{ $t('menu.createAccount') }}
+                        </div>
+                        <div class="list-item" @click="currView='backup'">
+                            <i class="iconfont icon-backup"></i>{{ $t('menu.backup') }}
+                        </div>
+                        <div class="list-item" @click="currView='help'">
+                            <i class="iconfont icon-help"></i>{{ $t('menu.help') }}
+                        </div>
+                        <div class="list-item" @click="currView='settings'">
+                            <i class="iconfont icon-settings"></i>{{ $t('menu.setting') }}
+                        </div>
+                    </div>
+                </MenuPage>
+
+                <!-- child-page -->
+                <div>
+                    <Creation key="creation" v-show="view.creation" @on-back="accountSelected" @on-exit="close"></Creation>
+                    <Recovery key="recovery" v-show="view.recovery" @on-back="goBack" @on-exit="close"></Recovery>
+                    <Bakcup key="backup" v-show="view.backup" @on-back="goBack" @on-exit="close"></Bakcup>
+                    <Help key="help" v-show="view.help" @on-back="goBack" @on-exit="close"></Help>
+                    <Settings key="settings" v-show="view.settings" @on-back="goBack" @on-exit="close"></Settings>
                 </div>
-              </div>
-            </div>
-          </div>
-          <div class="list menu">
-            <div class="list-item" @click="currView='creation'">
-              <i class="iconfont icon-plusbox"></i>{{ $t('menu.createAccount') }}
-            </div>
-            <div class="list-item" @click="currView='backup'">
-              <i class="iconfont icon-backup"></i>{{ $t('menu.backup') }}
-            </div>
-            <div class="list-item" @click="currView='help'">
-              <i class="iconfont icon-help"></i>{{ $t('menu.help') }}
             </div>
-            <div class="list-item" @click="currView='settings'">
-              <i class="iconfont icon-settings"></i>{{ $t('menu.setting') }}
-            </div>
-          </div>
-        </MenuPage>
-
-        <!-- child-page -->
-        <div>
-          <Creation key="creation" v-show="view.creation" @on-back="goBack" @on-exit="close"></Creation>
-          <Recovery key="recovery" v-show="view.recovery" @on-back="goBack" @on-exit="close"></Recovery>
-          <Bakcup key="backup" v-show="view.backup" @on-back="goBack" @on-exit="close"></Bakcup>
-          <Help key="help" v-show="view.help" @on-back="goBack" @on-exit="close"></Help>
-          <Settings key="settings" v-show="view.settings" @on-back="goBack" @on-exit="close"></Settings>
-        </div>
-      </div>
-    </transition>
-  </div>
+        </transition>
+    </div>
 </template>
 
 <script>
@@ -101,88 +99,64 @@ import Recovery from "./menu-recovery";
 import Bakcup from "./menu-backup";
 import Help from "./menu-help";
 import Settings from "./menu-settings";
-import bytom from "../common/bytom";
 export default {
-  name: "",
-  components: {
-    Creation,
-    Recovery,
-    Bakcup,
-    Help,
-    Settings
-  },
-  data() {
-    return {
-      show: false,
-      maskShow: false,
-      currView: "",
-      accounts: [],
-      currentAccount: ""
-    };
-  },
-  computed: {
-    view() {
-      const { currView } = this;
-      return {
-        creation: currView === "creation",
-        recovery: currView === "recovery",
-        backup: currView === "backup",
-        help: currView === "help",
-        settings: currView === "settings"
-      };
-    }
-  },
-  watch: {
-    currView: function() {
-      //
-    }
-  },
-  methods: {
-    open: function(child) {
-      this.show = true;
-      this.maskShow = true;
-      this.currView = child;
-    },
-    close: function() {
-      this.show = false;
-      this.maskShow = false;
-      this.currView = "";
+    props: {
+        accounts: "",
+        selectedAccount: ""
     },
-    goBack: function(from) {
-      this.currView = "";
-      if (from == "creation") {
-        this.updateAccounts();
-      }
+    name: "",
+    components: {
+        Creation,
+        Recovery,
+        Bakcup,
+        Help,
+        Settings
     },
-    accountSelected: function(accountInfo) {
-      localStorage.currentAccount = JSON.stringify(accountInfo);
-      this.currentAccount = accountInfo;
-      this.$emit("on-current-account", this.currentAccount);
-      this.close();
+    data() {
+        return {
+            show: false,
+            maskShow: false,
+            currView: "",
+            currAccount: ""
+        };
     },
-    updateAccounts: function() {
-      bytom.Account.list().then(accounts => {
-        this.accounts = accounts;
-        if (accounts.length == 0) {
-          this.$emit("accounts-clear");
-          return;
+    computed: {
+        view() {
+            const { currView } = this;
+            return {
+                creation: currView === "creation",
+                recovery: currView === "recovery",
+                backup: currView === "backup",
+                help: currView === "help",
+                settings: currView === "settings"
+            };
         }
-
-        if (localStorage.currentAccount != undefined) {
-          this.currentAccount = JSON.parse(localStorage.currentAccount);
-        } else {
-          this.currentAccount = accounts[0];
+    },
+    watch: {
+        selectedAccount(newVal) {
+            this.currAccount = newVal
         }
-        this.$emit("on-current-account", this.currentAccount);
-      });
-    }
-  },
-  mounted() {
-    if (localStorage.bytomNet != undefined) {
-      bytom.System.setupNet(localStorage.bytomNet);
+    },
+    methods: {
+        open: function (child) {
+            this.show = true;
+            this.maskShow = true;
+            this.currView = child;
+        },
+        close: function () {
+            this.show = false;
+            this.maskShow = false;
+            this.currView = "";
+        },
+        goBack: function (from) {
+            this.currView = "";
+        },
+        accountSelected: function (accountInfo) {
+            // this.accounts.push(accountInfo);
+            // this.currAccount = accountInfo;
+            this.$emit("on-account-change", accountInfo);
+            this.close();
+        },
     }
-
-    this.updateAccounts();
-  }
 };
 </script>
\ No newline at end of file
index 6828127..ed7a66a 100644 (file)
@@ -1,70 +1,70 @@
-import Vue from "vue";
-import moment from "moment";
-import VueI18n from "vue-i18n";
-import Loading from "vue-loading-overlay";
-import vuescroll from "vuescroll/dist/vuescroll-native";
-import "vue-loading-overlay/dist/vue-loading.css";
-import "vuescroll/dist/vuescroll.css";
+import Vue from 'vue'
+import moment from 'moment'
+import VueI18n from 'vue-i18n'
+import Loading from 'vue-loading-overlay'
+import vuescroll from 'vuescroll/dist/vuescroll-native'
+import 'vue-loading-overlay/dist/vue-loading.css'
+import 'vuescroll/dist/vuescroll.css'
 
-import EntryHome from "./entry/home";
-import EntryWelcome from "./entry/welcome";
-import EntryTransfer from "./entry/transfer";
-import Dialog from "./components/dialog";
-import vSelect from "./components/select";
-import MenuPage from "./components/menu-page";
-import messages, { have } from "../assets/language";
-import "../assets/style.css";
+import EntryHome from './entry/home'
+import EntryWelcome from './entry/welcome'
+import EntryTransfer from './entry/transfer'
+import Dialog from '../components/dialog'
+import vSelect from '../components/select'
+import MenuPage from '../components/menu-page'
+import messages, { have } from '../assets/language'
+import '../assets/style.css'
 
-Vue.use(VueI18n);
+Vue.use(VueI18n)
 const i18n = new VueI18n({
-  fallbackLocale: "en",
-  locale: have(localStorage.lang) ? localStorage.lang : "cn",
+  fallbackLocale: 'en',
+  locale: have(localStorage.lang) ? localStorage.lang : 'cn',
   messages
-});
-Vue.use(i18n);
-Vue.use(vuescroll);
-Vue.use(MenuPage);
-Vue.use(Loading);
-Vue.use(Dialog, i18n);
-Vue.component("v-select", vSelect);
+})
+Vue.use(i18n)
+Vue.use(vuescroll)
+Vue.use(MenuPage)
+Vue.use(Loading)
+Vue.use(Dialog, i18n)
+Vue.component('v-select', vSelect)
 
 Vue.prototype.$vuescrollConfig = {
-  mode: "pure-native",
+  mode: 'pure-native',
   bar: {
     keepShow: true,
-    background: "#c9c9c9"
+    background: '#c9c9c9'
   }
-};
+}
 
-Vue.filter("moment", function(value, formatString) {
-  formatString = formatString || "YYYY-MM-DD HH:mm:ss";
-  return moment(value * 1000).format(formatString);
-});
+Vue.filter('moment', function(value, formatString) {
+  formatString = formatString || 'YYYY-MM-DD HH:mm:ss'
+  return moment(value * 1000).format(formatString)
+})
 
-let Application = {};
+let Application = {}
 
 Application.welcome = function() {
   new Vue({
-    el: "#app",
+    el: '#app',
     i18n: i18n,
     render: h => h(EntryWelcome)
-  });
-};
+  })
+}
 
 Application.launth = function() {
   new Vue({
-    el: "#app",
+    el: '#app',
     i18n: i18n,
     render: h => h(EntryHome)
-  });
-};
+  })
+}
 
 Application.transfer = function() {
   new Vue({
-    el: "#app",
+    el: '#app',
     i18n: i18n,
     render: h => h(EntryTransfer)
-  });
-};
+  })
+}
 
-export default Application;
+export default Application
index 2089ec4..aa151ad 100644 (file)
 <style lang="" scoped>
 .warp {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 600px;
-  z-index: 2;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 600px;
+    z-index: 2;
 }
 .header {
-  height: 60px;
+    height: 60px;
 }
 
 .content {
-  padding: 25px 30px;
+    padding: 25px 30px;
 }
 
 .ft {
-  border-radius: 5px;
-  padding: 0 20px !important;
-  line-height: 45px;
-  margin-bottom: 20px;
+    border-radius: 5px;
+    padding: 0 20px !important;
+    line-height: 45px;
+    margin-bottom: 20px;
 }
 
 .ft .from {
-  overflow-x: hidden;
-  width: 90px;
+    overflow-x: hidden;
+    width: 90px;
 }
 .ft .to {
-  overflow-x: hidden;
-  padding-left: 20px;
-  float: right;
+    overflow-x: hidden;
+    padding-left: 20px;
+    float: right;
 }
 
 .right-arrow {
-  width: 32px;
-  height: 32px;
-  border-top: 12px solid #3c454b;
-  border-right: 12px solid #3c454b;
-  transform: rotate(45deg);
-  position: absolute;
-  left: 105px;
+    width: 32px;
+    height: 32px;
+    border-top: 12px solid #3c454b;
+    border-right: 12px solid #3c454b;
+    transform: rotate(45deg);
+    position: absolute;
+    left: 105px;
 }
 
 .row {
-  padding: 12px 10px;
+    padding: 12px 10px;
 }
 .value {
-  float: right;
+    float: right;
 }
 .value .uint {
-  font-size: 12px;
-  margin-left: 3px;
+    font-size: 12px;
+    margin-left: 3px;
 }
 
 .fee-intro {
-  font-size: 10px;
+    font-size: 10px;
 }
 
 .btn-inline {
-  display: flex;
-  padding: 0;
+    display: flex;
+    padding: 0;
 }
 .btn-inline .btn {
-  margin: 10px 15px;
+    margin: 10px 15px;
 }
 </style>
 
 <template>
-  <div>
-    <transition name="page-transfer"
-        <!-- enter-active-class="animated slideInUp faster" 
-        leave-active-class="animated slideOutDown faster"> -->
-        <div v-show="show" class="warp bg-gray">
-          <section class="header bg-green">
-            <i class="iconfont icon-back" @click="show=false"></i>
-          </section>
+    <div>
+        <transition name="page-transfer" <!-- enter-active-class="animated slideInUp faster" leave-active-class="animated slideOutDown faster"> -->
+            <div v-show="show" class="warp bg-gray">
+                <section class="header bg-green">
+                    <i class="iconfont icon-back" @click="show=false"></i>
+                </section>
 
-          <section class="content">
-            <div class="row bg-green ft">
-              <div class="col from">{{account.alias}}</div>
-              <div class="col right-arrow"></div>
-              <div class="col to">{{transaction.toShort}}</div>
-            </div>
-            <div class="row">
-              <div class="col label">{{ $t('transfer.transferAmount') }}</div>
-              <div class="col value">{{transaction.amount}}<span class="uint">BTM</span></div>
-            </div>
-            <div class="row">
-              <div class="col label">{{ $t('transfer.transferCost') }}</div>
-              <div class="col value">{{transaction.cost}}<span class="uint">CNY</span></div>
-            </div>
-            <div class="row">
-              <div class="col label">{{ $t('transfer.fee') }}</div>
-              <div class="col value">{{transaction.fee}}<span class="uint">BTM</span></div>
-            </div>
+                <section class="content">
+                    <div class="row bg-green ft">
+                        <div class="col from">{{account.alias}}</div>
+                        <div class="col right-arrow"></div>
+                        <div class="col to">{{transaction.toShort}}</div>
+                    </div>
+                    <div class="row">
+                        <div class="col label">{{ $t('transfer.transferAmount') }}</div>
+                        <div class="col value">{{transaction.amount}}<span class="uint">BTM</span></div>
+                    </div>
+                    <div class="row">
+                        <div class="col label">{{ $t('transfer.transferCost') }}</div>
+                        <div class="col value">{{transaction.cost}}<span class="uint">CNY</span></div>
+                    </div>
+                    <div class="row">
+                        <div class="col label">{{ $t('transfer.fee') }}</div>
+                        <div class="col value">{{transaction.fee}}<span class="uint">BTM</span></div>
+                    </div>
 
-            <div class="divider" style="margin-top: 130px; margin-bottom: 10px;"></div>
-            <div class="row" style="text-align: right;">
-              <div class="col label" style="line-height: 50px;">{{ $t('transfer.total') }}</div>
-              <div class="col value">
-                <p class="fee-intro">{{ $t('transfer.totalTip') }}</p>
-                {{Number(transaction.amount)+Number(transaction.fee)}}<span class="uint">BTM</span>
-              </div>
-            </div>
-            <div class="row" style="margin: 20px;">
-              <div class="btn bg-green" @click="$refs.modalPasswd.open()">{{ $t('transfer.confirm') }}</div>
+                    <div class="divider" style="margin-top: 130px; margin-bottom: 10px;"></div>
+                    <div class="row" style="text-align: right;">
+                        <div class="col label" style="line-height: 50px;">{{ $t('transfer.total') }}</div>
+                        <div class="col value">
+                            <p class="fee-intro">{{ $t('transfer.totalTip') }}</p>
+                            {{Number(transaction.amount)+Number(transaction.fee)}}<span class="uint">BTM</span>
+                        </div>
+                    </div>
+                    <div class="row" style="margin: 20px;">
+                        <div class="btn bg-green" @click="$refs.modalPasswd.open()">{{ $t('transfer.confirm') }}</div>
+                    </div>
+                </section>
             </div>
-          </section>
-        </div>
-    </transition>
+        </transition>
 
-    <modalPasswd ref="modalPasswd" @confirm="transfer"></modalPasswd>
-  </div>
+        <modalPasswd ref="modalPasswd" @confirm="transfer"></modalPasswd>
+    </div>
 </template>
 
 <script>
-import bytom from "../common/bytom";
 import utils from "../common/utils";
+import transaction from "../../models/transaction";
 import modalPasswd from "./modal-passwd";
 import getLang from "../../assets/language/sdk";
 export default {
-  components: {
-    modalPasswd
-  },
-  data() {
-    return {
-      show: false,
-      rawData: {},
-      account: {},
-      transaction: {
-        to: "",
-        toShort: "",
-        amount: 0,
-        fee: ""
-      }
-    };
-  },
-  methods: {
-    open: function(account, transaction, data) {
-      this.account = account;
-      this.transaction = transaction;
-      this.transaction.toShort = utils.shortAddress(transaction.to, 4);
-      this.rawData = data;
-      this.show = true;
+    components: {
+        modalPasswd
     },
-    close: function() {
-      this.show = false;
+    data() {
+        return {
+            show: false,
+            rawData: {},
+            account: {},
+            transaction: {
+                to: "",
+                toShort: "",
+                amount: 0,
+                fee: ""
+            }
+        };
     },
-    transfer: function(passwd) {
-      let loader = this.$loading.show({
-        // Optional parameters
-        container: null,
-        canCancel: true,
-        onCancel: this.onCancel
-      });
+    methods: {
+        open: function (account, transaction, data) {
+            this.account = account;
+            this.transaction = transaction;
+            this.transaction.toShort = utils.shortAddress(transaction.to, 4);
+            this.rawData = data;
+            this.show = true;
+        },
+        close: function () {
+            this.show = false;
+        },
+        transfer: function (passwd) {
+            let loader = this.$loading.show({
+                // Optional parameters
+                container: null,
+                canCancel: true,
+                onCancel: this.onCancel
+            });
 
-      // rawData, password
-      bytom.Transaction.transfer(this.account.guid, this.rawData, passwd)
-        .then(ret => {
-          loader.hide();
-          this.close();
-          this.$emit("on-success");
-          this.$dialog.show({
-            body: this.$t("transfer.success")
-          });
-        })
-        .catch(error => {
-          loader.hide();
-          this.$dialog.show({
-            body: getLang(error.message)
-          });
-        });
+            // rawData, password
+            transaction.transfer(this.account.guid, this.rawData, passwd)
+                .then(ret => {
+                    loader.hide();
+                    this.close();
+                    this.$emit("on-success");
+                    this.$dialog.show({
+                        body: this.$t("transfer.success")
+                    });
+                })
+                .catch(error => {
+                    loader.hide();
+                    this.$dialog.show({
+                        body: getLang(error.message)
+                    });
+                });
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
index 9792a40..5546b2e 100644 (file)
 <style lang="" scoped>
 .warp {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 600px;
-  z-index: 2;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 600px;
+    z-index: 2;
 }
 .header {
-  height: 150px;
+    height: 150px;
 }
 .balance {
-  text-align: center;
-  margin-top: 15px;
+    text-align: center;
+    margin-top: 15px;
 }
 .balance .token-icon {
-  height: 38px;
-  width: 38px;
-  margin-right: 5px;
+    height: 38px;
+    width: 38px;
+    margin-right: 5px;
 }
 .balance .token-amount {
-  display: inline-block;
-  font-size: 45px;
-  line-height: 45px;
+    display: inline-block;
+    font-size: 45px;
+    line-height: 45px;
 }
 .balance .token-amount .asset {
-  font-size: 18px;
-  margin-left: 2px;
+    font-size: 18px;
+    margin-left: 2px;
 }
 .form {
-  padding: 10px 20px;
+    padding: 10px 20px;
 }
 .form-item-group {
-  display: flex;
+    display: flex;
 }
 .form-item-group .form-item {
-  width: 40%;
+    width: 40%;
 }
 
 .btn-inline {
-  display: flex;
-  padding: 0;
+    display: flex;
+    padding: 0;
 }
 .btn-inline .btn {
-  margin: 10px 15px;
+    margin: 10px 15px;
 }
 </style>
 
 <template>
-  <div>
-    <transition name="page-transfer"
-      enter-active-class="animated fadeInLeft faster" 
-      leave-active-class="animated fadeOutLeft faster">
-      <div v-show="show" class="warp bg-gray">
-        <section class="header bg-green">
-          <i class="iconfont icon-back" @click="close"></i>
-          <div class="balance">
-            <img src="../../assets/logo.png" class="token-icon">
-            <div class="token-amount">{{account.balance}}<span class="asset">BTM</span></div>
-          </div>
-        </section>
-        
-        <section class="form">
-          <div class="form-item-group">
-            <div class="form-item">
-              <!-- <label>账户</label> -->
-              <v-select :clearable="false" v-model="guid" style="height: 32px;width: 125px;" label="alias" :options="accounts"></v-select>
-            </div>
-            <div class="form-item" style="margin-left: 20px;">
-              <!-- <label>资产</label> -->
-              <v-select :clearable="false" v-model="selectAsset" style="height: 32px;" label="name" :options="assetOptions"></v-select>
-            </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('transfer.address') }}</label>
-            <div class="form-item-content" style="margin-left: 80px;">
-              <input type="text" v-model="transaction.to">
-            </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('transfer.quantity') }}</label>
-            <div class="form-item-content" style="margin-left: 80px; display: flex;">
-              <input type="number" v-model="transaction.amount" placeholder="0">
-              <span style="width: 40px; font-size: 15px;">{{unit}}</span>
-            </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">≈</label>
-            <div class="form-item-content" style="margin-left: 80px; display: flex;">
-              <input type="number" v-model="transaction.cost" placeholder="0" disabled>
-              <span style="width: 40px; font-size: 15px;">CNY</span>
-            </div>
-          </div>
-          <div class="form-item">
-            <label class="form-item-label">{{ $t('transfer.fee') }}</label>
-            <div class="form-item-content" style="margin-left: 80px;">
-              <v-select :clearable="false" v-model="fee" style="height: 32px;" :options="feeTypeOptions"></v-select>
+    <div>
+        <transition name="page-transfer" enter-active-class="animated fadeInLeft faster" leave-active-class="animated fadeOutLeft faster">
+            <div v-show="show" class="warp bg-gray">
+                <section class="header bg-green">
+                    <i class="iconfont icon-back" @click="close"></i>
+                    <div class="balance">
+                        <img src="../../assets/logo.png" class="token-icon">
+                        <div class="token-amount">
+                            {{account.balance}}
+                            <span class="asset">BTM</span>
+                        </div>
+                    </div>
+                </section>
+
+                <section class="form">
+                    <div class="form-item-group">
+                        <div class="form-item">
+                            <!-- <label>账户</label> -->
+                            <v-select :clearable="false" v-model="guid" style="height: 32px;width: 125px;" label="alias" :options="accounts"></v-select>
+                        </div>
+                        <div class="form-item" style="margin-left: 20px;">
+                            <!-- <label>资产</label> -->
+                            <v-select :clearable="false" v-model="selectAsset" style="height: 32px;" label="name" :options="assetOptions"></v-select>
+                        </div>
+                    </div>
+                    <div class="form-item">
+                        <label class="form-item-label">{{ $t('transfer.address') }}</label>
+                        <div class="form-item-content" style="margin-left: 80px;">
+                            <input type="text" v-model="transaction.to">
+                        </div>
+                    </div>
+                    <div class="form-item">
+                        <label class="form-item-label">{{ $t('transfer.quantity') }}</label>
+                        <div class="form-item-content" style="margin-left: 80px; display: flex;">
+                            <input type="number" v-model="transaction.amount" placeholder="0">
+                            <span style="width: 40px; font-size: 15px;">{{unit}}</span>
+                        </div>
+                    </div>
+                    <div class="form-item">
+                        <label class="form-item-label">≈</label>
+                        <div class="form-item-content" style="margin-left: 80px; display: flex;">
+                            <input type="number" v-model="transaction.cost" placeholder="0" disabled>
+                            <span style="width: 40px; font-size: 15px;">CNY</span>
+                        </div>
+                    </div>
+                    <div class="form-item">
+                        <label class="form-item-label">{{ $t('transfer.fee') }}</label>
+                        <div class="form-item-content" style="margin-left: 80px;">
+                            <v-select :clearable="false" v-model="fee" style="height: 32px;" :options="feeTypeOptions"></v-select>
+                        </div>
+                    </div>
+                    <br>
+                    <div style="width: 200px; margin: 0 auto;">
+                        <div class="btn bg-green" @click="send">{{ $t('transfer.send') }}</div>
+                    </div>
+                </section>
             </div>
-          </div>
-          <br>
-          <div style="width: 200px; margin: 0 auto;">
-            <div class="btn bg-green" @click="send">{{ $t('transfer.send') }}</div>
-          </div>
-        </section>
-      </div>
-    </transition>
+        </transition>
 
-    <Confirm ref="transferConfirm" @on-success="close"></Confirm>
-  </div>
+        <Confirm ref="transferConfirm" @on-success="confirmSuccess"></Confirm>
+    </div>
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
+import transaction from "../../models/transaction";
 import getLang from "../../assets/language/sdk";
 import Confirm from "./confirm";
 export default {
-  components: {
-    Confirm
-  },
-  data() {
-    const ASSET_BTM =
-      "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
-    return {
-      selectAsset: {
-        assets:
-          "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
-        name: "BTM"
-      },
-      assetOptions: [
-        {
-          assets:
-            "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
-          name: "BTM"
-        }
-      ],
-      show: false,
-      accounts: [],
-      unit: "",
-      assets: {
-        ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: "BTM"
-      },
-      guid: null,
-      account: {
-        guid: ""
-      },
-      transaction: {
-        to: "",
-        asset: ASSET_BTM,
-        amount: "",
-        fee: "",
-        cost: ""
-      }
-    };
-  },
-  props: {
-    fee: {
-      type: String,
-      default() {
-        return this.$t("transfer.feeType");
-      }
+    components: {
+        Confirm
     },
-    feeTypeOptions: {
-      type: Array,
-      default() {
-        return [this.$t("transfer.feeType")];
-      }
-    }
-  },
-  watch: {
-    selectAsset: function(val) {
-      this.transaction.asset = val.assets;
+    data() {
+        const ASSET_BTM =
+            "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+        return {
+            selectAsset: {
+                assets:
+                    "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+                name: "BTM"
+            },
+            assetOptions: [
+                {
+                    assets:
+                        "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+                    name: "BTM"
+                }
+            ],
+            show: false,
+            accounts: [],
+            unit: "",
+            assets: {
+                ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: "BTM"
+            },
+            guid: null,
+            account: {
+                guid: ""
+            },
+            transaction: {
+                to: "",
+                asset: ASSET_BTM,
+                amount: "",
+                fee: "",
+                cost: ""
+            }
+        };
     },
-    "transaction.amount": function(newAmount) {
-      bytom.Query.asset(this.transaction.asset).then(ret => {
-        this.transaction.cost = Number(ret.result.data.cny_price*newAmount).toFixed(2);
-      });
+    props: {
+        fee: {
+            type: String,
+            default() {
+                return this.$t("transfer.feeType");
+            }
+        },
+        feeTypeOptions: {
+            type: Array,
+            default() {
+                return [this.$t("transfer.feeType")];
+            }
+        }
     },
-    guid: function(newGuid) {
-      this.accounts.forEach(account => {
-        if (account.guid == newGuid.guid) {
-          this.account = account;
-          return;
+    watch: {
+        selectAsset: function (val) {
+            this.transaction.asset = val.assets;
+        },
+        "transaction.amount": function (newAmount) {
+            transaction.asset(this.transaction.asset).then(ret => {
+                this.transaction.cost = Number(ret.result.data.cny_price * newAmount).toFixed(2);
+            });
+        },
+        guid: function (newGuid) {
+            this.accounts.forEach(account => {
+                if (account.guid == newGuid.guid) {
+                    this.account = account;
+                    return;
+                }
+            });
         }
-      });
-    }
-  },
-  methods: {
-    open: function(accountInfo) {
-      this.show = true;
+    },
+    methods: {
+        open: function (accountInfo) {
+            this.show = true;
 
-      bytom.Account.list().then(accounts => {
-        this.accounts = accounts;
-        let options = [];
-        this.accounts.forEach(function(element) {
-          options.push({ label: element.alias, value: element.guid });
-        });
-        this.options = options;
-      });
+            account.list().then(accounts => {
+                this.accounts = accounts;
+                let options = [];
+                this.accounts.forEach(function (element) {
+                    options.push({ label: element.alias, value: element.guid });
+                });
+                this.options = options;
+            });
 
-      this.account = accountInfo;
-      this.guid = accountInfo;
-      this.unit = this.assets[this.transaction.asset];
-    },
-    close: function() {
-      this.show = false;
-      this.transaction.to = "";
-      this.transaction.amount = "";
-    },
-    send: function() {
-      if (this.transaction.to == "") {
-        this.$dialog.show({
-          body: this.$t("transfer.emptyTo")
-        });
-        return;
-      }
+            this.account = accountInfo;
+            this.guid = accountInfo;
+            this.unit = this.assets[this.transaction.asset];
+        },
+        close: function () {
+            this.show = false;
+            this.transaction.to = "";
+            this.transaction.amount = "";
+        },
+        confirmSuccess: function () {
+            this.$emit("on-success");
+            this.close()
+        },
+        send: function () {
+            if (this.transaction.to == "") {
+                this.$dialog.show({
+                    body: this.$t("transfer.emptyTo")
+                });
+                return;
+            }
 
-      if (this.transaction.amount <= 0) {
-        this.$dialog.show({
-          body: this.$t("transfer.noneBTM")
-        });
-        return;
-      }
+            if (this.transaction.amount <= 0) {
+                this.$dialog.show({
+                    body: this.$t("transfer.noneBTM")
+                });
+                return;
+            }
 
-      let loader = this.$loading.show({
-        // Optional parameters
-        container: null,
-        canCancel: true,
-        onCancel: this.onCancel
-      });
-      bytom.Transaction.build(
-        this.account.guid,
-        this.transaction.to,
-        this.transaction.asset,
-        this.transaction.amount,
-        this.transaction.fee
-      )
-        .then(ret => {
-          loader.hide();
+            let loader = this.$loading.show({
+                // Optional parameters
+                container: null,
+                canCancel: true,
+                onCancel: this.onCancel
+            });
+            transaction.build(
+                this.account.guid,
+                this.transaction.to,
+                this.transaction.asset,
+                this.transaction.amount,
+                this.transaction.fee
+            )
+                .then(ret => {
+                    loader.hide();
 
-          this.transaction.fee = Number(ret.result.data.fee / 100000000);
-          this.$refs.transferConfirm.open(
-            this.account,
-            this.transaction,
-            ret.result.data
-          );
-        })
-        .catch(error => {
-          loader.hide();
-          this.$dialog.show({
-            body: getLang(error.message)
-          });
-        });
+                    this.transaction.fee = Number(ret.result.data.fee / 100000000);
+                    this.$refs.transferConfirm.open(
+                        this.account,
+                        this.transaction,
+                        ret.result.data
+                    );
+                })
+                .catch(error => {
+                    loader.hide();
+                    this.$dialog.show({
+                        body: getLang(error.message)
+                    });
+                });
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
index 5b4e85f..f07c8dc 100644 (file)
@@ -1,16 +1,16 @@
 
 <style scoped>
 .content {
-  margin-left: 135px;
+    margin-left: 135px;
 }
 .content-cn {
-  margin-left: 85px;
+    margin-left: 85px;
 }
 .form-item-label {
-  width: 135px;
+    width: 135px;
 }
 .form-item-label-cn {
-  width: 85px;
+    width: 85px;
 }
 </style>
 
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
 let mainNet = null;
 let testNet = null;
 export default {
-  name: "",
-  data() {
-    return {
-      nets: [],
-      selected: mainNet,
-      formItem: {
-        accAlias: "",
-        keyAlias: "",
-        passwd1: "",
-        passwd2: ""
-      }
-    };
-  },
-  computed : {
-    formItemLabel: function() {
-      if (this.i18n == "cn") {
-        return "form-item-label form-item-label-cn";
-      } else if (this.i18n == "en") {
-        return "form-item-label";
-      }
-      return "form-item-label form-item-label-cn";
+    name: "",
+    data() {
+        return {
+            nets: [],
+            selected: mainNet,
+            formItem: {
+                accAlias: "",
+                keyAlias: "",
+                passwd1: "",
+                passwd2: ""
+            }
+        };
     },
-    formItemContent: function() {
-      if (this.i18n == "cn") {
-        return "form-item-content content-cn";
-      } else if (this.i18n == "en") {
-        return "form-item-content content";
-      }
-      return "form-item-label form-item-label-cn";
-    }
-  },
-  props: {
-    i18n: {
-      type: String,
-      default: 'cn',
-    }
-  },
-  methods: {
-    create: function() {
-      if (this.formItem.accAlias == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputAlias")
-        });
-        return;
-      }
-      if (this.formItem.keyAlias == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputKey")
-        });
-        return;
-      }
-      if (this.formItem.passwd1 == "") {
-        this.$dialog.show({
-          body: this.$t("createAccount.inputPass")
-        });
-        return;
-      }
-      if (this.formItem.passwd1 != this.formItem.passwd2) {
-        this.$dialog.show({
-            body: this.$t('createAccount.passwordAgain'),
-        });
-        return;
-      }
-      let loader = this.$loading.show({
-        container: null,
-        canCancel: true,
-        onCancel: this.onCancel
-      });
-      bytom.Account.create(
-        this.formItem.accAlias,
-        this.formItem.keyAlias,
-        this.formItem.passwd1
-      )
-        .then(res => {
-          localStorage.login = true;
-          loader.hide();
-          window.location.reload();
-          this.formItem = {};
-        })
-        .catch(err => {
-          loader.hide();
-          this.$dialog.show({
-            body: err.message,
-          });
-        });
+    computed: {
+        formItemLabel: function () {
+            if (this.i18n == "cn") {
+                return "form-item-label form-item-label-cn";
+            } else if (this.i18n == "en") {
+                return "form-item-label";
+            }
+            return "form-item-label form-item-label-cn";
+        },
+        formItemContent: function () {
+            if (this.i18n == "cn") {
+                return "form-item-content content-cn";
+            } else if (this.i18n == "en") {
+                return "form-item-content content";
+            }
+            return "form-item-label form-item-label-cn";
+        }
     },
-    recover: function() {
-      this.$emit("next");
+    props: {
+        i18n: {
+            type: String,
+            default: 'cn',
+        }
     },
-  },
-  watch: {
-    selected: function(value) {
-      localStorage.bytomNet = value.value;
-      bytom.System.setupNet(value.value);
-    }
-  },
-  mounted() {
-    mainNet = {label: this.$t('main.mainNetShort'), value: "mainnet"};
-    testNet = {label: this.$t('main.testNetShort'), value: "testnet"};
-    this.nets = [mainNet, testNet];
-    if (localStorage.bytomNet != undefined) {
-      bytom.System.setupNet(localStorage.bytomNet);
-      if (localStorage.bytomNet == "mainnet") {
-        this.selected = mainNet;
-      } else if (localStorage.bytomNet == "testnet") {
-        this.selected = testNet;
-      }
-    } else {
-      this.selected = mainNet;
-      localStorage.bytomNet = "mainnet";
+    methods: {
+        create: function () {
+            if (this.formItem.accAlias == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputAlias")
+                });
+                return;
+            }
+            if (this.formItem.keyAlias == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputKey")
+                });
+                return;
+            }
+            if (this.formItem.passwd1 == "") {
+                this.$dialog.show({
+                    body: this.$t("createAccount.inputPass")
+                });
+                return;
+            }
+            if (this.formItem.passwd1 != this.formItem.passwd2) {
+                this.$dialog.show({
+                    body: this.$t('createAccount.passwordAgain'),
+                });
+                return;
+            }
+            let loader = this.$loading.show({
+                container: null,
+                canCancel: true,
+                onCancel: this.onCancel
+            });
+            account.create(this.formItem.accAlias, this.formItem.keyAlias, this.formItem.passwd1).then(res => {
+                localStorage.login = true;
+                loader.hide();
+                window.location.reload();
+                this.formItem = {};
+            }).catch(err => {
+                loader.hide();
+                this.$dialog.show({
+                    body: err.message,
+                });
+            });
+        },
+        recover: function () {
+            this.$emit("next");
+        },
+    },
+    watch: {
+        selected: function (value) {
+            localStorage.bytomNet = value.value;
+            // bytom.System.setupNet(value.value);
+        }
+    },
+    mounted() {
+        mainNet = { label: this.$t('main.mainNetShort'), value: "mainnet" };
+        testNet = { label: this.$t('main.testNetShort'), value: "testnet" };
+        this.nets = [mainNet, testNet];
+        if (localStorage.bytomNet != undefined) {
+            // bytom.System.setupNet(localStorage.bytomNet);
+            if (localStorage.bytomNet == "mainnet") {
+                this.selected = mainNet;
+            } else if (localStorage.bytomNet == "testnet") {
+                this.selected = testNet;
+            }
+        } else {
+            this.selected = mainNet;
+            localStorage.bytomNet = "mainnet";
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
index 1f42781..3157d32 100644 (file)
@@ -12,7 +12,7 @@
                 <div class="form-item">
                     <label class="form-item-label">{{ $t('createAccount.file') }}</label>
                     <div class="form-item-content" style="margin-left: 95px;">
-                      <input type="file" @change="tirggerFile($event)">
+                        <input type="file" @change="tirggerFile($event)">
                     </div>
                 </div>
                 <div class="btn-group">
 </template>
 
 <script>
-import bytom from "../common/bytom";
+import account from "../../models/account";
 import getLang from "../../assets/language/sdk";
 export default {
-  name: "",
-  data() {
-    return {
-      formData: {}
-    };
-  },
-  methods: {
-    tirggerFile: function(event) {
-      var reader = new FileReader();
-      reader.onload = e => {
-        this.fileTxt = e.target.result;
-      };
-
-      var file = event.target.files[0];
-      reader.readAsText(file);
-    },
-    recovery: function() {
-      bytom.Account.restore(this.fileTxt)
-        .then(res => {
-          window.location.reload();
-          localStorage.login = true;
-        })
-        .catch(error => {
-          this.$dialog.show({
-            body: getLang(error.message)
-          });
-        });
+    name: "",
+    data() {
+        return {
+            formData: {}
+        };
     },
-    back: function() {
-      this.$emit("back");
+    methods: {
+        tirggerFile: function (event) {
+            var reader = new FileReader();
+            reader.onload = e => {
+                this.fileTxt = e.target.result;
+            };
+
+            var file = event.target.files[0];
+            reader.readAsText(file);
+        },
+        recovery: function () {
+            account.restore(this.fileTxt).then(res => {
+                window.location.reload();
+                localStorage.login = true;
+            }).catch(error => {
+                this.$dialog.show({
+                    body: getLang(error.message)
+                });
+            });
+        },
+        back: function () {
+            this.$emit("back");
+        }
     }
-  }
 };
 </script>
\ No newline at end of file
diff --git a/src/background.js b/src/background.js
new file mode 100644 (file)
index 0000000..e950ff5
--- /dev/null
@@ -0,0 +1,44 @@
+import { LocalStream } from 'extension-streams'
+
+export default class Background {
+  constructor() {
+    this.setupInternalMessaging()
+  }
+
+  setupInternalMessaging() {
+    LocalStream.watch((request, sendResponse) => {
+      console.log(request)
+      // const message = InternalMessage.fromJson(request)
+      // this.dispatchMessage(sendResponse, message)
+    })
+  }
+
+  dispatchMessage(sendResponse, message) {
+    switch (message.type) {
+      case InternalMessageTypes.SET_SEED:
+        // Background.setSeed(sendResponse, message.payload)
+        break
+    }
+  }
+
+  static transfer(sendResponse) {
+    var optionsUrl = chrome.extension.getURL('pages/prompt.html')
+    console.log(optionsUrl)
+    chrome.tabs.query({ url: optionsUrl }, tabs => {
+      console.log(22, tabs)
+      chrome.windows.create(
+        { url: optionsUrl, type: 'popup', width: 350, height: 625, left: 0 },
+        () => {
+          chrome.extension.sendMessage(
+            { cmd: '来自前台页面的主动调用' },
+            function(response) {
+              console.log(123, response)
+            }
+          ) //测试前台掉后台
+        }
+      )
+    })
+  }
+}
+
+const background = new Background()
diff --git a/src/background/account.js b/src/background/account.js
deleted file mode 100644 (file)
index 6f4213b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-import bytom from "./bytom";
-
-function account(bytom) {
-  this.bytom = bytom;
-}
-
-account.prototype.create = function(
-  accountAlias,
-  keyAlias,
-  passwd,
-  success,
-  error
-) {
-  let retPromise = new Promise((resolve, reject) => {
-    this.bytom.keys
-      .create(keyAlias, passwd)
-      .then(res => {
-          this.bytom.accounts
-              .createAccountUseServer(res.xpub, accountAlias)
-              .then(ret => {
-                  resolve(ret);
-              })
-              .catch(error => {
-                  reject(error);
-              });
-      })
-      .catch(error => {
-        reject(error);
-      });
-  });
-  return retPromise;
-};
-
-account.prototype.backup = function() {
-  return bytom.wallet.backup();
-};
-account.prototype.restore = function(walletImage) {
-  return bytom.wallet.restore(walletImage);
-};
-
-export default account;
diff --git a/src/background/bytom.js b/src/background/bytom.js
deleted file mode 100644 (file)
index 2dc2a7b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-import Bytom from "bytom-js-sdk";
-
-var networks = {
-  testnet: "https://api-dev.bycoin.im:8000/"
-};
-
-var bytom = new Bytom(networks, chrome.runtime.getURL("wasm/main.wasm"));
-
-// bytom.sdk.networks = function() {
-//   return bytom.networks;
-// };
-bytom.sdk.setupNet = function(network) {
-  bytom.setNetType(network);
-};
-
-export default bytom.sdk;
diff --git a/src/background/index.js b/src/background/index.js
deleted file mode 100644 (file)
index 4b304fa..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-console.log("This is BACKGROUND page!");
-
-import bytom from "./bytom";
-import query from "./query";
-import account from "./account";
-import transaction from "./transaction";
-
-const ASSET_BTM =
-  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
-
-var globalAccounts = [];
-
-function refreshBalances() {
-  globalAccounts.forEach(account => {
-    bytom.accounts.listAddressUseServer(account.guid).then(addresses => {
-      let balance = 0;
-      addresses.forEach(item => {
-        if (item.balances != null) {
-          item.balances.forEach(asset => {
-            if (asset.asset == ASSET_BTM) {
-              balance += asset.balance;
-            }
-          });
-        }
-      });
-
-      if (account.balance != balance) {
-        account.balance = balance / 100000000;
-      }
-    });
-  });
-}
-
-function refreshAccounts(success) {
-  bytom.accounts
-    .listAccountUseServer()
-    .then(accounts => {
-      console.log("refreshAccounts", accounts);
-      globalAccounts = accounts;
-      globalAccounts.forEach(account => {
-        if (account.balance == null) {
-          account.balance = 0;
-        }
-      });
-      success();
-    })
-    .catch(error => {
-      console.log(error);
-    });
-}
-refreshAccounts(refreshBalances);
-setInterval(refreshBalances, 10000);
-
-var bytomQuery = new query(bytom);
-var bytomAccount = new account(bytom);
-var bytomTransaction = new transaction(bytom);
-bytomAccount.list = function() {
-  let retPromise = new Promise((resolve, reject) => {
-    refreshAccounts(() => {
-      refreshBalances();
-      resolve(globalAccounts);
-    });
-  });
-  return retPromise;
-};
-
-window.bytomSystem = bytom;
-window.bytomQuery = bytomQuery;
-window.bytomAccount = bytomAccount;
-window.bytomTransaction = bytomTransaction;
-
-chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
-  console.log("收到来自content-script的消息:");
-  console.log(request);
-  console.log(sender);
-  console.log(sendResponse);
-  // sendResponse("我是后台,我已收到你的消息:" + JSON.stringify(request));
-
-  if (request.bty == "transfer") {
-    var optionsUrl = chrome.extension.getURL("pages/prompt.html");
-    console.log(optionsUrl);
-    chrome.tabs.query({ url: optionsUrl }, (tabs) => {
-        console.log(22, tabs)
-        chrome.windows.create({ url: optionsUrl, type: "popup", width: 350, height: 625, left: 0 }, ()=>{
-          chrome.extension.sendMessage(  {cmd: "来自前台页面的主动调用"}, function(response) {  console.log(123, response); }  );//测试前台掉后台
-        });
-        
-    });
-  }
-});
diff --git a/src/background/query.js b/src/background/query.js
deleted file mode 100644 (file)
index c1f7f23..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-import bytom from "./bytom";
-
-function query(bytom) {
-  this.bytom = bytom;
-}
-
-query.prototype.blockCount = function() {
-  return bytom.query.getblockcount();
-};
-query.prototype.asset = function(asset_id) {
-  return bytom.query.asset(asset_id);
-};
-
-export default query;
diff --git a/src/background/transaction.js b/src/background/transaction.js
deleted file mode 100644 (file)
index 516adbe..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-import bytom from "./bytom";
-
-function transaction(bytom) {
-  this.bytom = bytom;
-}
-
-transaction.prototype.list = function(guid, address, start, limit) {
-  return this.bytom.transaction.list(guid, address, start, limit);
-};
-
-transaction.prototype.build = function(guid, to, asset, amount, fee){
-    let retPromise = new Promise((resolve, reject) => {
-        this.bytom.transaction.buildPayment(guid, to, asset, Number(amount*100000000)).then(res => {
-            resolve(res);
-        }).catch(error => {
-            reject(error);
-        });
-    })
-    return retPromise;
-}
-transaction.prototype.transfer = function(guid, transaction, password){
-    let retPromise = new Promise((resolve, reject) => {
-        this.bytom.transaction.signTransaction(guid, JSON.stringify(transaction), password).then(ret => {
-            this.bytom.transaction.submitPayment(guid, ret.raw_transaction, ret.signatures).then(res3 => {
-                resolve(res3);
-            }).catch(error => {
-                reject(error);
-            });
-        }).catch(error => {
-            reject(error);
-        });
-    })
-
-    return retPromise
-}
-
-export default transaction;
diff --git a/src/common/crun.js b/src/common/crun.js
deleted file mode 100644 (file)
index 29415e8..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-const EVT_MAP = {}
-
-chrome.runtime.onMessage.addListener(({ event, params }, sender, sendResponse) => {
-  const fn = EVT_MAP[event]
-  if (fn) {
-    fn(params, sendResponse)
-  }
-  return true
-})
-
-export default {
-  $on (event, fn) {
-    EVT_MAP[event] = fn
-  },
-
-  $off (event) {
-    delete EVT_MAP[event]
-  },
-
-  $emit (event, params, inBg) {
-    return new Promise(resolve => {
-      if (inBg) {
-        chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) {
-          const activeId = tabs[0] ? tabs[0].id : ''
-          if (activeId) {
-            chrome.tabs.sendMessage(activeId, { event, params }, resolve)
-          }
-        })
-      } else {
-        chrome.runtime.sendMessage({ event, params }, resolve)
-      }
-    })
-  }
-}
\ No newline at end of file
diff --git a/src/content.js b/src/content.js
new file mode 100644 (file)
index 0000000..4ef272b
--- /dev/null
@@ -0,0 +1,27 @@
+import { EncryptedStream, LocalStream } from 'extension-streams'
+
+class Content {
+  constructor() {
+    this.setupInjectScript()
+    this.setupEncryptedStream()
+  }
+
+  setupInjectScript() {
+    const content = chrome.extension.getURL('js/content.js')
+    let script = document.createElement('script')
+    script.setAttribute('type', 'text/javascript')
+    script.setAttribute('src', content)
+    document.body.appendChild(script)
+  }
+
+  setupEncryptedStream() {
+    // stream = new EncryptedStream('bytom', IdGenerator.text(256))
+    // stream.listenWith(msg => this.contentListener(msg))
+  }
+
+  contentListener(msg) {
+    console.log('event.data', msg)
+  }
+}
+
+const content = new Content()
diff --git a/src/content/index.js b/src/content/index.js
deleted file mode 100644 (file)
index 934b3b3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-console.log("This is CONTENT page!");
diff --git a/src/content/inject.js b/src/content/inject.js
deleted file mode 100644 (file)
index 230890e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-const content = chrome.extension.getURL("js/content.js");
-const script = document.createElement("script");
-script.setAttribute("type", "text/javascript");
-script.setAttribute("src", content);
-document.body.appendChild(script);
-
-// setup listenr
-window.addEventListener("message", function (event) {
-    if (event.source != window) {
-        return;
-    }
-    
-    console.log("event.data", event.data);
-    if(event.data.bty == 'transfer'){
-        chrome.runtime.sendMessage(event.data, function (response) {
-            console.log("transfer response", response);
-        });
-    }
-
-},false);
\ No newline at end of file
diff --git a/src/inject.js b/src/inject.js
new file mode 100644 (file)
index 0000000..66b2f34
--- /dev/null
@@ -0,0 +1 @@
+console.log('This is CONTENT page!')
diff --git a/src/models/account.js b/src/models/account.js
new file mode 100644 (file)
index 0000000..88a8647
--- /dev/null
@@ -0,0 +1,87 @@
+import bytom from './bytom'
+
+let account = {
+  setupNet: bytom.setupNet
+}
+
+account.create = function(accountAlias, keyAlias, passwd, success, error) {
+  let retPromise = new Promise((resolve, reject) => {
+    bytom.keys
+      .create(keyAlias, passwd)
+      .then(res => {
+        bytom.accounts
+          .createAccountUseServer(res.xpub, accountAlias)
+          .then(ret => {
+            resolve(ret)
+          })
+          .catch(error => {
+            reject(error)
+          })
+      })
+      .catch(error => {
+        reject(error)
+      })
+  })
+  return retPromise
+}
+
+const ASSET_BTM =
+  'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
+
+account.balance = function(guid, dstAsset) {
+  if (dstAsset == undefined) {
+    dstAsset = ASSET_BTM
+  }
+
+  let retPromise = new Promise((resolve, reject) => {
+    bytom.accounts
+      .listAddressUseServer(guid)
+      .then(addresses => {
+        let balance = 0
+        addresses.forEach(item => {
+          if (item.balances != null) {
+            item.balances.forEach(asset => {
+              if (asset.asset == dstAsset) {
+                balance += asset.balance
+              }
+            })
+          }
+        })
+        resolve(balance / 100000000)
+      })
+      .catch(error => {
+        reject(error)
+      })
+  })
+  return retPromise
+}
+
+account.list = function() {
+  let retPromise = new Promise((resolve, reject) => {
+    bytom.accounts
+      .listAccountUseServer()
+      .then(accounts => {
+        accounts.forEach(account => {
+          this.balance(account.guid).then(balance => {
+            account.balance = balance
+          })
+        })
+        resolve(accounts)
+      })
+      .catch(error => {
+        reject(error)
+      })
+  })
+
+  return retPromise
+}
+
+account.backup = function() {
+  return bytom.wallet.backup()
+}
+
+account.restore = function(walletImage) {
+  return bytom.wallet.restore(walletImage)
+}
+
+export default account
diff --git a/src/models/query.js b/src/models/query.js
new file mode 100644 (file)
index 0000000..32608f2
--- /dev/null
@@ -0,0 +1,8 @@
+import bytom from "./bytom";
+
+function query(bytom) {
+  this.bytom = bytom;
+}
+
+
+export default query;
diff --git a/src/models/transaction.js b/src/models/transaction.js
new file mode 100644 (file)
index 0000000..39490df
--- /dev/null
@@ -0,0 +1,53 @@
+import bytom from "./bytom";
+
+let transaction = {};
+
+transaction.list = function(guid, address, start, limit) {
+  return bytom.transaction.list(guid, address, start, limit);
+};
+
+transaction.blockCount = function() {
+  return bytom.query.getblockcount();
+};
+
+transaction.asset = function(asset_id) {
+  return bytom.query.asset(asset_id);
+};
+
+transaction.build = function(guid, to, asset, amount, fee) {
+  let retPromise = new Promise((resolve, reject) => {
+    bytom.transaction
+      .buildPayment(guid, to, asset, Number(amount * 100000000))
+      .then(res => {
+        resolve(res);
+      })
+      .catch(error => {
+        reject(error);
+      });
+  });
+  return retPromise;
+};
+
+transaction.transfer = function(guid, transaction, password) {
+  let retPromise = new Promise((resolve, reject) => {
+    bytom.transaction
+      .signTransaction(guid, JSON.stringify(transaction), password)
+      .then(ret => {
+        bytom.transaction
+          .submitPayment(guid, ret.raw_transaction, ret.signatures)
+          .then(res3 => {
+            resolve(res3);
+          })
+          .catch(error => {
+            reject(error);
+          });
+      })
+      .catch(error => {
+        reject(error);
+      });
+  });
+
+  return retPromise;
+};
+
+export default transaction;
diff --git a/src/options/App.vue b/src/options/App.vue
deleted file mode 100644 (file)
index 8087058..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<template>
-  <div id="app">
-    <img src="../assets/logo.png">
-    <h1>{{ msg }}</h1>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'app',
-  data () {
-    return {
-      msg: 'This is options page !'
-    }
-  }
-}
-</script>
-
-<style lang="scss">
-#app {
-  font-family: 'Avenir', Helvetica, Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  text-align: center;
-  color: #2c3e50;
-  margin-top: 60px;
-}
-
-h1, h2 {
-  font-weight: normal;
-}
-
-ul {
-  list-style-type: none;
-  padding: 0;
-}
-
-li {
-  display: inline-block;
-  margin: 0 10px;
-}
-
-a {
-  color: #42b983;
-}
-</style>
diff --git a/src/options/index.js b/src/options/index.js
deleted file mode 100644 (file)
index 385fcfe..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import Vue from 'vue'
-import App from './App.vue'
-
-new Vue({
-  el: '#app',
-  render: h => h(App)
-})
diff --git a/src/popup.js b/src/popup.js
new file mode 100644 (file)
index 0000000..3dc61b9
--- /dev/null
@@ -0,0 +1,14 @@
+import App from './app'
+
+class Popup {
+  constructor() {
+    if (localStorage.login == undefined) {
+      App.welcome()
+      return
+    }
+
+    App.launth()
+  }
+}
+
+const popup = new Popup()
diff --git a/src/popup/index.js b/src/popup/index.js
deleted file mode 100644 (file)
index f32e6e6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-import App from "../app";
-
-class Popup {
-  constructor() {
-    if (localStorage.login == undefined) {
-      App.welcome();
-      return;
-    }
-
-    App.launth();
-  }
-}
-
-const popup = new Popup();
diff --git a/src/prompt.js b/src/prompt.js
new file mode 100644 (file)
index 0000000..4de91ad
--- /dev/null
@@ -0,0 +1,9 @@
+// import App from "../app";
+
+class Prompt {
+  constructor() {
+    // App.transfer();
+  }
+}
+
+const prompt = new Prompt()
diff --git a/src/prompt/index.js b/src/prompt/index.js
deleted file mode 100644 (file)
index 8ccd553..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-import App from "../app";
-
-class Prompt {
-  constructor() {
-    App.transfer();
-  }
-}
-
-const prompt = new Prompt();