From f5b3599d1a5feb3ce3decbd7add8b33eec74605d Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Fri, 17 May 2019 17:26:41 +0200 Subject: [PATCH 01/48] Setup Matomo analytics --- .env | 2 ++ package-lock.json | 5 +++++ package.json | 1 + src/ui.js | 6 ++++++ 4 files changed, 14 insertions(+) diff --git a/.env b/.env index a4d11b566..7e729204d 100644 --- a/.env +++ b/.env @@ -3,3 +3,5 @@ VUE_APP_MIGRATION_PHASE=0 UNFINISHED_FEATURES=true VUE_APP_REMOTE_CONNECTION_BACKEND_URL=https://stage-signaling.aepps.com VUE_APP_VAPID_PUBLIC_KEY=BJP4PnSPRizQofIOBhe8o-AlaElRYbp7Mi_nirXzPYkJPkZfu-ONL7M14Y2c_q9LfU1K3XUcwzfx3lNM_jBLJrc +VUE_APP_MATOMO_URL=http://134.209.181.101:31902 +VUE_APP_MATOMO_SITE_ID=1 diff --git a/package-lock.json b/package-lock.json index a8513aa7a..4d8f7ca82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21764,6 +21764,11 @@ "vue-style-loader": "^4.1.0" } }, + "vue-matomo": { + "version": "3.9.1-2", + "resolved": "https://registry.npmjs.org/vue-matomo/-/vue-matomo-3.9.1-2.tgz", + "integrity": "sha512-wq9DtgV6yp86xKw4O0s+3DWcG+wjiCYlHoalzFTTqcRPpkWiZl1esWYsvWkDYxVHXzzfAWjS+4bYK65cvFUBoA==" + }, "vue-router": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz", diff --git a/package.json b/package.json index 915e42e54..50f2e6520 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "vue": "^2.6.7", "vue-clickaway": "^2.2.2", "vue-focus": "^2.1.0", + "vue-matomo": "^3.9.1-2", "vue-router": "^3.0.2", "vue-rx": "^6.1.0", "vuex": "^3.1.0", diff --git a/src/ui.js b/src/ui.js index 2bf6f64d8..7cdf4ae58 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import Router from 'vue-router'; +import Matomo from 'vue-matomo'; import './ui-common'; import './register-modals'; import sync from './lib/vuexRouterSync'; @@ -12,6 +13,11 @@ import uiPlugin from './store/plugins/ui'; Vue.use(Router); Vue.use(VeeValidate); +Vue.use(Matomo, { + host: process.env.VUE_APP_MATOMO_URL, + siteId: process.env.VUE_APP_MATOMO_SITE_ID, + router, +}); sync(store, router); uiPlugin(store); From 87f6d71428a7e9f847268a358e146dffd8a414ee Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Fri, 17 May 2019 18:46:38 +0200 Subject: [PATCH 02/48] Setup Countly analytics --- .env | 2 ++ package-lock.json | 5 +++++ package.json | 1 + src/ui.js | 10 ++++++++++ 4 files changed, 18 insertions(+) diff --git a/.env b/.env index 7e729204d..dac5d2f02 100644 --- a/.env +++ b/.env @@ -5,3 +5,5 @@ VUE_APP_REMOTE_CONNECTION_BACKEND_URL=https://stage-signaling.aepps.com VUE_APP_VAPID_PUBLIC_KEY=BJP4PnSPRizQofIOBhe8o-AlaElRYbp7Mi_nirXzPYkJPkZfu-ONL7M14Y2c_q9LfU1K3XUcwzfx3lNM_jBLJrc VUE_APP_MATOMO_URL=http://134.209.181.101:31902 VUE_APP_MATOMO_SITE_ID=1 +VUE_APP_COUNTLY_URL=http://134.209.181.101:32768 +VUE_APP_COUNTLY_APP_KEY=a14d0329eab4b17923ccbe7b6ca271e29d4906fc diff --git a/package-lock.json b/package-lock.json index 4d8f7ca82..5db3fd6f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6957,6 +6957,11 @@ } } }, + "countly-sdk-web": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/countly-sdk-web/-/countly-sdk-web-19.2.1.tgz", + "integrity": "sha512-EcVxRjwIREaMaGy9Th4cIbB4RZ9PVFT3AdD/2vbSgMWRvbEGDJMtP0H5cBiS1zIExBiOEAuu77BPSiU2sO/8Og==" + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", diff --git a/package.json b/package.json index 50f2e6520..95591c500 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "bignumber.js": "^8.1.1", "bluebird": "^3.5.3", "copy-to-clipboard": "^3.0.8", + "countly-sdk-web": "^19.2.1", "emoji-datasource-apple": "^4.0.3", "focus-visible": "^4.1.5", "fuse.js": "^3.4.2", diff --git a/src/ui.js b/src/ui.js index 7cdf4ae58..e836e1ec2 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1,6 +1,8 @@ import Vue from 'vue'; import Router from 'vue-router'; import Matomo from 'vue-matomo'; +import Countly from 'countly-sdk-web'; +import { defer } from 'lodash-es'; import './ui-common'; import './register-modals'; import sync from './lib/vuexRouterSync'; @@ -19,6 +21,14 @@ Vue.use(Matomo, { router, }); +Countly.init({ + url: process.env.VUE_APP_COUNTLY_URL, + app_key: process.env.VUE_APP_COUNTLY_APP_KEY, +}); +Countly.q.push(['track_sessions']); +router.afterEach(() => defer(() => Countly.q + .push(['track_pageview', window.location.pathname + window.location.hash]))); + sync(store, router); uiPlugin(store); From 40e55ac2ce54b596c911e019e5d5f1d36f92fcda Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Sat, 18 May 2019 09:11:08 +0200 Subject: [PATCH 03/48] Generate labeled icons --- .gitignore | 4 + package-lock.json | 85 ++++++++++++++++----- package.json | 1 + public/favicons/android-chrome-192x192.png | Bin 9811 -> 0 bytes public/favicons/android-chrome-512x512.png | Bin 20681 -> 0 bytes public/favicons/apple-touch-icon.png | Bin 9147 -> 0 bytes resources/{icon.png => icon.unlabeled.png} | Bin scripts/label-icons.js | 63 +++++++++++++++ vue.config.js | 2 + 9 files changed, 137 insertions(+), 18 deletions(-) delete mode 100644 public/favicons/android-chrome-192x192.png delete mode 100644 public/favicons/android-chrome-512x512.png delete mode 100644 public/favicons/apple-touch-icon.png rename resources/{icon.png => icon.unlabeled.png} (100%) create mode 100644 scripts/label-icons.js diff --git a/.gitignore b/.gitignore index 7448a6835..2343402b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ .DS_Store node_modules /dist +/public/favicons/android-chrome-192x192.png +/public/favicons/android-chrome-512x512.png +/public/favicons/apple-touch-icon.png +/resources/icon.png # Cordova files /www diff --git a/package-lock.json b/package-lock.json index 5a4ededca..e48757877 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6918,6 +6918,46 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true + }, + "sharp": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.3.tgz", + "integrity": "sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw==", + "dev": true, + "requires": { + "bindings": "^1.3.1", + "color": "^3.1.0", + "detect-libc": "^1.0.3", + "fs-copy-file-sync": "^1.1.1", + "nan": "^2.12.1", + "npmlog": "^4.1.2", + "prebuild-install": "^5.2.2", + "semver": "^5.6.0", + "simple-get": "^3.0.3", + "tar": "^4.4.8", + "tunnel-agent": "^0.6.0" + } + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true } } }, @@ -10173,9 +10213,9 @@ } }, "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -14869,9 +14909,9 @@ } }, "node-abi": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", - "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", + "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", "dev": true, "requires": { "semver": "^5.4.1" @@ -19528,28 +19568,37 @@ "dev": true }, "sharp": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.3.tgz", - "integrity": "sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.22.1.tgz", + "integrity": "sha512-lXzSk/FL5b/MpWrT1pQZneKe25stVjEbl6uhhJcTULm7PhmJgKKRbTDM/vtjyUuC/RLqL2PRyC4rpKwbv3soEw==", "dev": true, "requires": { - "bindings": "^1.3.1", - "color": "^3.1.0", + "color": "^3.1.1", "detect-libc": "^1.0.3", "fs-copy-file-sync": "^1.1.1", - "nan": "^2.12.1", + "nan": "^2.13.2", "npmlog": "^4.1.2", - "prebuild-install": "^5.2.2", - "semver": "^5.6.0", + "prebuild-install": "^5.3.0", + "semver": "^6.0.0", "simple-get": "^3.0.3", "tar": "^4.4.8", "tunnel-agent": "^0.6.0" }, "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", + "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true }, "tar": { diff --git a/package.json b/package.json index c7615c9cb..8594b6484 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "node-sass": "^4.12.0", "sass-loader": "^7.0.3", "serve": "^11.0.0", + "sharp": "^0.22.1", "svg-url-loader": "^2.3.2", "svgo": "^1.2.2", "svgo-loader": "^2.2.0", diff --git a/public/favicons/android-chrome-192x192.png b/public/favicons/android-chrome-192x192.png deleted file mode 100644 index 079acef1a3953a0f15287eb98996d4ac3c720c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9811 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 diff --git a/public/favicons/apple-touch-icon.png b/public/favicons/apple-touch-icon.png deleted file mode 100644 index 2eaa90622c92cbe3dce4fcca91ccfae091d51988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9147 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 diff --git a/resources/icon.png b/resources/icon.unlabeled.png similarity index 100% rename from resources/icon.png rename to resources/icon.unlabeled.png diff --git a/scripts/label-icons.js b/scripts/label-icons.js new file mode 100644 index 000000000..3840a4bd7 --- /dev/null +++ b/scripts/label-icons.js @@ -0,0 +1,63 @@ +const { execSync } = require('child_process'); +const sharp = require('sharp'); // eslint-disable-line import/no-extraneous-dependencies + +(async () => { + const { NODE_ENV, npm_lifecycle_event: npmEvent, TRAVIS_BRANCH } = process.env; + + if (!['build', 'serve'].includes(npmEvent)) return; + + const branch = (TRAVIS_BRANCH || execSync('git rev-parse --abbrev-ref HEAD').toString()) + .replace('feature/', ''); + const showLabel = branch !== 'master'; + console.log(`Generating ${showLabel ? 'labeled ' : ''}icons`); + + const charsPerLine = 12; + const formattedBranch = branch.replace('feature/', '').replace(/[-/]/g, ' '); + const lastIndex = formattedBranch.slice(0, charsPerLine).lastIndexOf(' '); + const firstLine = formattedBranch.slice(0, lastIndex === -1 ? charsPerLine : lastIndex); + const secondLine = formattedBranch.slice(firstLine.length).trimLeft(); + + const nodeEnv = NODE_ENV.replace('production', 'prod'); + const sourceIcon = './resources/icon.unlabeled.png'; + + const appIcons = [ + { path: './public/favicons/android-chrome-192x192.png', side: 192, platform: 'web' }, + { path: './public/favicons/android-chrome-512x512.png', side: 512, platform: 'web' }, + { path: './public/favicons/apple-touch-icon.png', side: 180, platform: 'web' }, + { path: './resources/icon.png', side: 1024, platform: 'cordova' }, + ]; + + const labelSvg = ({ platform }) => Buffer.from(` + + + + ${firstLine} + ${secondLine} + ${[platform, nodeEnv].filter(a => a).join(', ')} + `); + await Promise.all(appIcons.map(async ({ path, side, platform }) => { + const result = sharp(sourceIcon).resize(side); + if (showLabel) { + result.composite([{ + input: await sharp(labelSvg({ platform }), { density: 300 }) + .resize(side).toBuffer(), + }]); + } + await result.toFile(path); + })); +})().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/vue.config.js b/vue.config.js index e40b0c198..5b496f951 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,3 +1,5 @@ +require('./scripts/label-icons'); + const parseBool = val => (val ? JSON.parse(val) : false); // eslint-disable-next-line camelcase From fd405c62b5a367ee1650a01fb98d7f7be9055d94 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 08:37:59 +0200 Subject: [PATCH 04/48] Fix detection of running in popup window --- src/lib/initEnv.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/initEnv.js b/src/lib/initEnv.js index e1a599306..2727038e0 100644 --- a/src/lib/initEnv.js +++ b/src/lib/initEnv.js @@ -15,6 +15,6 @@ Object.assign(process.env, { RUNNING_IN_FRAME: window.parent !== window, }, ...process.env.RUNNING_IN_POPUP === undefined && { - RUNNING_IN_POPUP: !!window.opener, + RUNNING_IN_POPUP: !!window.opener && window.name === 'popup', }, }); From c8c6ebe77c4d3f4cceec8ab92dd65ddd56392475 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 09:26:05 +0200 Subject: [PATCH 05/48] Generate icons one by one on win32 --- scripts/label-icons.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/label-icons.js b/scripts/label-icons.js index 3840a4bd7..3d8b9fef3 100644 --- a/scripts/label-icons.js +++ b/scripts/label-icons.js @@ -47,7 +47,8 @@ const sharp = require('sharp'); // eslint-disable-line import/no-extraneous-depe ${secondLine} ${[platform, nodeEnv].filter(a => a).join(', ')} `); - await Promise.all(appIcons.map(async ({ path, side, platform }) => { + + const iconCreators = appIcons.map(({ path, side, platform }) => async () => { const result = sharp(sourceIcon).resize(side); if (showLabel) { result.composite([{ @@ -56,7 +57,11 @@ const sharp = require('sharp'); // eslint-disable-line import/no-extraneous-depe }]); } await result.toFile(path); - })); + }); + + if (process.platform === 'win32') { + await iconCreators.reduce((promise, creator) => promise.then(creator), Promise.resolve()); + } else await Promise.all(iconCreators.map(creator => creator())); })().catch((error) => { console.error(error); process.exit(1); From 9e0d5c008af1b9feab5c3eb6e31046b2ef1a0c88 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 14:55:17 +0200 Subject: [PATCH 06/48] Trim output to fix branch detection --- scripts/label-icons.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/label-icons.js b/scripts/label-icons.js index 3d8b9fef3..bc9c6ced9 100644 --- a/scripts/label-icons.js +++ b/scripts/label-icons.js @@ -6,7 +6,7 @@ const sharp = require('sharp'); // eslint-disable-line import/no-extraneous-depe if (!['build', 'serve'].includes(npmEvent)) return; - const branch = (TRAVIS_BRANCH || execSync('git rev-parse --abbrev-ref HEAD').toString()) + const branch = (TRAVIS_BRANCH || execSync('git rev-parse --abbrev-ref HEAD').toString().trim()) .replace('feature/', ''); const showLabel = branch !== 'master'; console.log(`Generating ${showLabel ? 'labeled ' : ''}icons`); From 6dced671ac51d6e5e78bce772966a1a6d5baafcf Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 15:48:01 +0200 Subject: [PATCH 07/48] Update analytics URLs --- .env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index dac5d2f02..0a628577e 100644 --- a/.env +++ b/.env @@ -3,7 +3,7 @@ VUE_APP_MIGRATION_PHASE=0 UNFINISHED_FEATURES=true VUE_APP_REMOTE_CONNECTION_BACKEND_URL=https://stage-signaling.aepps.com VUE_APP_VAPID_PUBLIC_KEY=BJP4PnSPRizQofIOBhe8o-AlaElRYbp7Mi_nirXzPYkJPkZfu-ONL7M14Y2c_q9LfU1K3XUcwzfx3lNM_jBLJrc -VUE_APP_MATOMO_URL=http://134.209.181.101:31902 +VUE_APP_MATOMO_URL=https://analytics-other.aepps.com VUE_APP_MATOMO_SITE_ID=1 -VUE_APP_COUNTLY_URL=http://134.209.181.101:32768 +VUE_APP_COUNTLY_URL=https://analytics.aepps.com VUE_APP_COUNTLY_APP_KEY=a14d0329eab4b17923ccbe7b6ca271e29d4906fc From 5ecd8f33db3ea23785bdc9c9f0bd5ce0f7c2746b Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Tue, 21 May 2019 19:02:29 +0200 Subject: [PATCH 08/48] Upload Android app and bundle to releases --- .travis.yml | 2 +- scripts/deploy.sh | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5ff25ce8c..8f45360e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,9 +38,9 @@ deploy: - provider: releases api_key: $GITHUB_TOKEN file: + - aeternity.tar.gz - aeternity.apk - aeternity.app.tar.gz skip_cleanup: true on: - condition: $TRAVIS_OS_NAME = osx tags: true diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 7d6491b43..0ce95b6c2 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -24,10 +24,17 @@ case $TRAVIS_BRANCH in ;; esac +UPLOAD_PATH=deploy@139.59.142.164:/var/www/html/$UPLOAD_PATH +RSYNC_OPTIONS="-r --delete-after -v" + if [[ $TRAVIS_OS_NAME == "osx" ]]; then - rsync -r --delete-after -v $TRAVIS_BUILD_DIR/aeternity.app.tar.gz deploy@139.59.142.164:/var/www/html/$UPLOAD_PATH + rsync $RSYNC_OPTIONS aeternity.app.tar.gz $UPLOAD_PATH elif [[ $ANDROID_HOME != "" ]]; then - rsync -r --delete-after -v $TRAVIS_BUILD_DIR/aeternity.apk deploy@139.59.142.164:/var/www/html/$UPLOAD_PATH/aeternity.apk + rsync $RSYNC_OPTIONS aeternity.apk $UPLOAD_PATH else - rsync -r --delete-after -v $TRAVIS_BUILD_DIR/dist/* deploy@139.59.142.164:/var/www/html/$UPLOAD_PATH + if [[ $TRAVIS_TAG != "" ]]; then + tar -czvf aeternity.tar.gz dist + fi + + rsync $RSYNC_OPTIONS dist $UPLOAD_PATH fi From 8219865bf64d4f74b6914a8c0130f686ae3abb5f Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 09:14:43 +0200 Subject: [PATCH 09/48] Fix deployment to stage server --- scripts/deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 0ce95b6c2..02a252781 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -36,5 +36,5 @@ else tar -czvf aeternity.tar.gz dist fi - rsync $RSYNC_OPTIONS dist $UPLOAD_PATH + rsync $RSYNC_OPTIONS dist/* $UPLOAD_PATH fi From 1c68871802ceb68eea7ac5a538ce171e4dd33c07 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 20:44:15 +0200 Subject: [PATCH 10/48] mobile Header: Add missed color --- src/components/mobile/Header.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/mobile/Header.vue b/src/components/mobile/Header.vue index eadef4c56..6c5de3ba4 100644 --- a/src/components/mobile/Header.vue +++ b/src/components/mobile/Header.vue @@ -115,6 +115,7 @@ export default { &.neutral { background-color: $color-neutral-positive-2; + color: $color-neutral-negative-3; } &.light { From 799a091d0f36a1354cf01c064d882e0765efdf42 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 22 May 2019 21:14:50 +0200 Subject: [PATCH 11/48] NotFound: Capitalise Component --- src/pages/NotFound.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/NotFound.vue b/src/pages/NotFound.vue index da94bd751..2cfd0dfdb 100644 --- a/src/pages/NotFound.vue +++ b/src/pages/NotFound.vue @@ -1,5 +1,5 @@ - From d002b372fa6fdf7a0f94e2e5215e3d94b2b3c4a7 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 05:32:31 +0200 Subject: [PATCH 17/48] Guide: Make selector more specific --- src/components/Guide.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Guide.vue b/src/components/Guide.vue index 1e262a4e0..21a8298a6 100644 --- a/src/components/Guide.vue +++ b/src/components/Guide.vue @@ -60,7 +60,7 @@ export default { margin-bottom: rem(15px); } - .icon { + > .icon { flex-shrink: 0; width: rem(30px); padding-left: rem(6px); @@ -110,7 +110,7 @@ export default { } &.primary { - .icon { + > .icon { color: $color-primary; } @@ -124,7 +124,7 @@ export default { } &.neutral { - .icon { + > .icon { color: $color-neutral-maximum; } @@ -139,7 +139,7 @@ export default { } &.alternative { - .icon { + > .icon { color: $color-alternative; } From 4d9d1d9aad2bd41a9f59459c2df34a703652cffa Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 06:10:46 +0200 Subject: [PATCH 18/48] QrCodeReader: Use fill property of Header --- src/components/QrCodeReader.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/QrCodeReader.vue b/src/components/QrCodeReader.vue index 638dd54cb..2b59d7600 100644 --- a/src/components/QrCodeReader.vue +++ b/src/components/QrCodeReader.vue @@ -2,6 +2,7 @@

@@ -109,8 +110,6 @@ export default { min-height: 100vh; .header-mobile { - background: #fff; - .button-plain .ae-icon { font-size: rem(22px); } From 14bb5fbe1364ed756708552e91a9478d52da611a Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 06:16:54 +0200 Subject: [PATCH 19/48] Use new icons instead of AeIcon --- src/components/AeAccount.vue | 2 +- src/components/AeInputAddress.vue | 8 +- src/components/AeInputPassword.vue | 6 +- src/components/AeRadio.vue | 33 ++++--- src/components/AeToolbarButton.vue | 4 +- src/components/ButtonAddFixed.vue | 12 +-- src/components/ListItemCircle.vue | 25 ++++++ src/components/MenuItem.vue | 4 +- src/components/NetworkSwitcher.vue | 22 ++--- src/components/NotificationSpend.vue | 23 +++-- src/components/QrCodeReader.vue | 6 -- src/components/desktop/AccountSwitcher.vue | 21 ++--- src/components/desktop/ConnectGuide.vue | 24 +++-- src/components/desktop/Header.vue | 29 +++--- src/components/desktop/LedgerModal.vue | 10 +-- src/components/desktop/Sidebar.vue | 10 +-- .../mobile/AccountSwitcherModal.vue | 29 +++--- src/components/mobile/ButtonMnemonicWord.vue | 14 ++- src/components/mobile/Header.vue | 13 +-- src/components/mobile/TabBar.vue | 22 +++-- src/pages/AddressBook.vue | 9 +- src/pages/AddressBookChoose.vue | 11 +-- src/pages/desktop/Settings.vue | 40 ++++----- src/pages/mobile/AppBrowser.vue | 29 +++--- src/pages/mobile/Receive.vue | 27 +++--- src/pages/mobile/Send.vue | 29 +++--- src/pages/mobile/Settings.vue | 90 +++++++++---------- src/pages/mobile/SettingsAppList.vue | 9 +- src/pages/mobile/Transfer.vue | 48 +++------- src/stories/Menu.stories.js | 10 ++- 30 files changed, 299 insertions(+), 320 deletions(-) create mode 100644 src/components/ListItemCircle.vue diff --git a/src/components/AeAccount.vue b/src/components/AeAccount.vue index df5a3062f..aa25b3db1 100644 --- a/src/components/AeAccount.vue +++ b/src/components/AeAccount.vue @@ -98,6 +98,7 @@ export default { display: flex; align-items: center; margin: rem(12px) rem(16px); + color: $color-neutral-maximum; .slot-icon { margin-left: auto; @@ -105,7 +106,6 @@ export default { span { @extend %face-sans-base; - color: $color-neutral-maximum; } .ae-identicon { diff --git a/src/components/AeInputAddress.vue b/src/components/AeInputAddress.vue index c951e3469..a773f830c 100644 --- a/src/components/AeInputAddress.vue +++ b/src/components/AeInputAddress.vue @@ -27,7 +27,7 @@ type="button" @click="showAccountsDropdown = true" > - + - + {{ $globals.IS_MOBILE_DEVICE ? 'Scan' : '' }} @@ -57,11 +57,11 @@ - - diff --git a/src/components/NotificationSpend.vue b/src/components/NotificationSpend.vue index 634ec834f..2010bebde 100644 --- a/src/components/NotificationSpend.vue +++ b/src/components/NotificationSpend.vue @@ -7,12 +7,9 @@ title="Transfer completed" :subtitle="`You've sent ${ prefixedAmount(amount) } AE`" > - + + + @@ -69,7 +66,6 @@ - - diff --git a/src/stories/Menu.stories.js b/src/stories/Menu.stories.js index 85910bc40..cb8c9983c 100644 --- a/src/stories/Menu.stories.js +++ b/src/stories/Menu.stories.js @@ -1,12 +1,14 @@ /* eslint-disable import/no-extraneous-dependencies */ import { storiesOf } from '@storybook/vue'; -import { AeIcon } from '@aeternity/aepp-components-3'; import Menu from '../components/Menu.vue'; import MenuItem from '../components/MenuItem.vue'; +import { Copy, Edit } from '../components/icons'; storiesOf('Menu', module) .add('transfer', () => ({ - components: { Menu, MenuItem, AeIcon }, + components: { + Menu, MenuItem, Copy, Edit, + }, template: `
`, From ef1f38b9f2d831342e2754eef47ed3d17c516312 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 07:23:57 +0200 Subject: [PATCH 20/48] Fix tests --- config/jest/EmptySvg.vue | 3 +++ jest.config.js | 1 + vue.config.js | 4 ++++ 3 files changed, 8 insertions(+) create mode 100644 config/jest/EmptySvg.vue diff --git a/config/jest/EmptySvg.vue b/config/jest/EmptySvg.vue new file mode 100644 index 000000000..83c6cecc4 --- /dev/null +++ b/config/jest/EmptySvg.vue @@ -0,0 +1,3 @@ + diff --git a/jest.config.js b/jest.config.js index 446e0091d..7605c7c5c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -24,6 +24,7 @@ module.exports = { ], moduleNameMapper: { '^@/(.*)$': '/src/$1', + '^.*\\.svg\\?icon-component$': '/config/jest/EmptySvg.vue', }, snapshotSerializers: [ 'jest-serializer-vue', diff --git a/vue.config.js b/vue.config.js index 7b53c454f..31a2d8898 100644 --- a/vue.config.js +++ b/vue.config.js @@ -41,6 +41,10 @@ module.exports = { .uses.clear().end() .oneOf('icon-component') .resourceQuery(/icon-component/) + .use('babel-loader') + .loader('babel-loader') + .options({ configFile: false, presets: ['@babel/preset-env'] }) + .end() .use('vue-svg-loader') .loader('vue-svg-loader') .options({ From bbe6ebd12bd8cd171c34f8baaaf5a6dc6354a01a Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Thu, 23 May 2019 09:05:55 +0200 Subject: [PATCH 21/48] Don't tree shake icon styles on production --- src/components/icons.js | 2 -- src/ui-common.js | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/icons.js b/src/components/icons.js index e2b88d802..4423038fa 100644 --- a/src/components/icons.js +++ b/src/components/icons.js @@ -1,7 +1,5 @@ /* eslint import/extensions: "off" */ -import './icon.scss'; - export { default as Active } from '../assets/icons/inline/active.svg?icon-component'; export { default as AddContact } from '../assets/icons/inline/add-contact.svg?icon-component'; export { default as Back } from '../assets/icons/inline/back.svg?icon-component'; diff --git a/src/ui-common.js b/src/ui-common.js index 05aab07ab..d88cf9a62 100644 --- a/src/ui-common.js +++ b/src/ui-common.js @@ -3,6 +3,7 @@ import 'normalize.css'; import '@aeternity/aepp-components-3/dist/aepp.components.css'; import 'focus-visible'; import './styles/fullscreen-message.scss'; +import './components/icon.scss'; import './lib/switchWebmanifest'; Vue.prototype.$globals = { From 947612268d1904b5d29507d5f6c878e730d6553c Mon Sep 17 00:00:00 2001 From: Dmitry Kostin Date: Wed, 22 May 2019 01:02:12 +1000 Subject: [PATCH 22/48] Notification: make all borders rounded, change padding to margin --- src/components/Notification.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/Notification.vue b/src/components/Notification.vue index a143b103c..db99da799 100644 --- a/src/components/Notification.vue +++ b/src/components/Notification.vue @@ -39,8 +39,9 @@ export default { max-width: rem(520px); margin-left: auto; margin-right: auto; - padding-top: env(safe-area-inset-top); - border-radius: 0 0 rem(8px) rem(8px); + margin-top: rem(10px); + margin-top: calc(#{rem(10px)} + env(safe-area-inset-top)); + border-radius: rem(8px); background-color: $color-neutral-maximum; box-shadow: 0 0 rem(100px) rem(30px) rgba(146, 156, 166, 0.4); @extend %face-sans-base; From 67d2e04895d4b3bd1d24536b0547f8fbd4f6f654 Mon Sep 17 00:00:00 2001 From: Nikita Cedrik Date: Fri, 24 May 2019 14:02:28 +1000 Subject: [PATCH 23/48] Update SDK to 3.4.0 --- package-lock.json | 52 ++++++++++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0766b466..67d7910db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,9 +31,9 @@ } }, "@aeternity/aepp-sdk": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@aeternity/aepp-sdk/-/aepp-sdk-3.3.0.tgz", - "integrity": "sha512-Me/x+GOoupDAQ8DS4osk8Wqqh72ty0Do86GlOVSNMmqdzOFfrmbqDduvchRPlwjWlO9xClaQQ8Vk2z0hJwkrcQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@aeternity/aepp-sdk/-/aepp-sdk-3.4.0.tgz", + "integrity": "sha512-0ryBWy8VFSJKpW/TYKw+Gd9bNgW/MrMLOVq38SJYstAM+0WOL4nV0dmqA6rTgsJPlPH8nc06TXSbWlpqy3uVBw==", "requires": { "@aeternity/bip39": "^0.1.0", "@babel/runtime": "^7.0.0-beta.46", @@ -48,7 +48,7 @@ "bs58check": "^2.1.1", "commander": "^2.14.1", "joi-browser": "^13.4.0", - "json-bigint": "github:davidyuk/json-bigint#64b099a5d8e9d1210175db0a13cfd7ab0c66d85a", + "json-bigint": "github:davidyuk/json-bigint", "libsodium-wrappers-sumo": "0.7.3", "ramda": "^0.25.0", "rlp": "2.1.0", @@ -10264,7 +10264,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -10285,12 +10286,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10305,17 +10308,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -10432,7 +10438,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -10444,6 +10451,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -10458,6 +10466,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -10465,12 +10474,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -10489,6 +10500,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -10576,7 +10588,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -10588,6 +10601,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -10673,7 +10687,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -10709,6 +10724,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -10728,6 +10744,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -10771,12 +10788,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -18681,7 +18700,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "dev": true, + "optional": true }, "rx-lite-aggregates": { "version": "4.0.8", diff --git a/package.json b/package.json index 1ca52e8e6..14da3d4e7 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@aeternity/aepp-components-3": "3.0.0-alpha.9", - "@aeternity/aepp-sdk": "^3.3.0", + "@aeternity/aepp-sdk": "^3.4.0", "@aeternity/bip39": "^0.1.0", "@aeternity/hd-wallet": "^0.2.0", "@aeternity/ledger-app-api": "0.1.0", From b377b7ea99a1752925c14e93d9eb0baf5e23ace4 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Fri, 24 May 2019 06:27:18 +0200 Subject: [PATCH 24/48] ListItemCircle: Set font-size: 0 if icon in slot --- src/components/ListItemCircle.vue | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/ListItemCircle.vue b/src/components/ListItemCircle.vue index 993db0a9c..c887cb530 100644 --- a/src/components/ListItemCircle.vue +++ b/src/components/ListItemCircle.vue @@ -1,9 +1,22 @@ + + diff --git a/src/pages/mobile/SettingsMnemonicDeleted.vue b/src/pages/mobile/SettingsMnemonicDeleted.vue new file mode 100644 index 000000000..ce1b9373d --- /dev/null +++ b/src/pages/mobile/SettingsMnemonicDeleted.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/pages/mobile/NewAccountCreate.vue b/src/pages/mobile/SettingsMnemonicShow.vue similarity index 56% rename from src/pages/mobile/NewAccountCreate.vue rename to src/pages/mobile/SettingsMnemonicShow.vue index 8ddcf23e6..512487695 100644 --- a/src/pages/mobile/NewAccountCreate.vue +++ b/src/pages/mobile/SettingsMnemonicShow.vue @@ -1,9 +1,11 @@ diff --git a/src/store/plugins/ui/observables.js b/src/store/plugins/ui/observables.js index 3bb80b947..b50729ad0 100644 --- a/src/store/plugins/ui/observables.js +++ b/src/store/plugins/ui/observables.js @@ -2,7 +2,7 @@ import { Observable, BehaviorSubject, combineLatest, timer, of, concat, } from 'rxjs'; import { - multicast, pluck, switchMap, map, filter, pairwise, startWith, + multicast, pluck, switchMap, map, filter, pairwise, startWith, catchError, } from 'rxjs/operators'; import { refCountDelay } from 'rxjs-etc/operators'; import { camelCase, memoize } from 'lodash-es'; @@ -165,80 +165,85 @@ export default (store) => { switchMap(({ address, mode }) => timer(0, 30000) .pipe(map(idx => ({ address, mode: idx ? 'poll' : mode })))), switchMap(({ address, mode }) => new Observable(async (subscriber) => { - const next = (status = '') => { - lastValue = { - list: getTransactionsByAddress(address), - status: (transactionRangeForAddress[address] || {}).ended ? 'ended' : status, + try { + const next = (status = '') => { + lastValue = { + list: getTransactionsByAddress(address), + status: (transactionRangeForAddress[address] || {}).ended ? 'ended' : status, + }; + subscriber.next(lastValue); }; - subscriber.next(lastValue); - }; - switch (mode) { - case 'initial': { - if (!transactionRangeForAddress[address]) { - next('loading'); - const [txs] = await Promise.all([ - fetchMdwTransactions(address, limit, 1), + switch (mode) { + case 'initial': { + if (!transactionRangeForAddress[address]) { + next('loading'); + const [txs] = await Promise.all([ + fetchMdwTransactions(address, limit, 1), + fetchPendingTransactions(address), + ]); + transactionRangeForAddress[address] = { + ...txs.length && { + begin: txs[0].hash, + end: txs[txs.length - 1].hash, + }, + ended: txs.length !== limit, + }; + next(); + break; + } + } + case 'poll': // eslint-disable-line no-fallthrough + await Promise.all([ + fetchMdwTransactions(address, 1, 1).then(async ([tx]) => { + if (!tx) return; + const range = transactionRangeForAddress[address]; + const begin = tx.hash; + let end = tx.hash; + let t = tx; + let p = 1; + while (t && t.hash !== range.begin) { + // eslint-disable-next-line no-await-in-loop + [t] = await fetchMdwTransactions(address, 1, p += 1); + if (t) end = t.hash; + } + Object.assign(range, { begin, end: range.end || end }); + }), fetchPendingTransactions(address), ]); - transactionRangeForAddress[address] = { - ...txs.length && { - begin: txs[0].hash, - end: txs[txs.length - 1].hash, - }, + next(); + break; + case 'loadMore': { + if (transactionRangeForAddress[address].ended) break; + next('loading'); + const loadedCount = 1 + lastValue.list + .findIndex(({ hash }) => transactionRangeForAddress[address].end === hash); + const txs = await fetchMdwTransactions( + address, + limit, + Math.floor(loadedCount / limit) + 1, + ); + Object.assign(transactionRangeForAddress[address], { + end: txs[txs.length - 1].hash, ended: txs.length !== limit, - }; + }); next(); break; } + default: + throw new Error(`Invalid mode: ${mode}`); } - case 'poll': // eslint-disable-line no-fallthrough - await Promise.all([ - fetchMdwTransactions(address, 1, 1).then(async ([tx]) => { - if (!tx) return; - const range = transactionRangeForAddress[address]; - const begin = tx.hash; - let end = tx.hash; - let t = tx; - let p = 1; - while (t && t.hash !== range.begin) { - // eslint-disable-next-line no-await-in-loop - [t] = await fetchMdwTransactions(address, 1, p += 1); - if (t) end = t.hash; - } - Object.assign(range, { begin, end: range.end || end }); - }), - fetchPendingTransactions(address), - ]); - next(); - break; - case 'loadMore': { - if (transactionRangeForAddress[address].ended) break; - next('loading'); - const loadedCount = 1 + lastValue.list - .findIndex(({ hash }) => transactionRangeForAddress[address].end === hash); - const txs = await fetchMdwTransactions( - address, - limit, - Math.floor(loadedCount / limit) + 1, - ); - Object.assign(transactionRangeForAddress[address], { - end: txs[txs.length - 1].hash, - ended: txs.length !== limit, - }); - next(); - break; - } - default: - throw new Error(`Invalid mode: ${mode}`); - } - subscriber.complete(); + subscriber.complete(); + } catch (error) { + subscriber.error(error); + } })), startWith({ list: getTransactionsByAddress(store.getters['accounts/active'].address), status: '', }), + catchError(() => of({ list: [], status: 'error' })), ); }; From 734c6817876bac60f370f50b4b2570eb65b275ab Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Tue, 28 May 2019 15:55:02 +0200 Subject: [PATCH 42/48] Filter subsequent requests if initial were not resolved yet --- src/store/plugins/ui/observables.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/plugins/ui/observables.js b/src/store/plugins/ui/observables.js index b50729ad0..4aa405d62 100644 --- a/src/store/plugins/ui/observables.js +++ b/src/store/plugins/ui/observables.js @@ -161,7 +161,7 @@ export default (store) => { map(([[, oldAddress, oldSdk], [mode, address, _sdk]]) => ({ address, mode: oldAddress === address && oldSdk === _sdk ? mode : 'initial', })), - filter(({ mode }) => mode === 'initial' || lastValue.status === ''), + filter(({ mode }) => mode === 'initial' || (lastValue && lastValue.status === '')), switchMap(({ address, mode }) => timer(0, 30000) .pipe(map(idx => ({ address, mode: idx ? 'poll' : mode })))), switchMap(({ address, mode }) => new Observable(async (subscriber) => { From bc0194bf5080cc0fc3628a95f2adc1e0444ddc43 Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Tue, 28 May 2019 16:45:04 +0200 Subject: [PATCH 43/48] AeAccountInline: Add missed space --- src/components/AccountInline.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/AccountInline.vue b/src/components/AccountInline.vue index c6986037e..bf834fd8a 100644 --- a/src/components/AccountInline.vue +++ b/src/components/AccountInline.vue @@ -1,6 +1,6 @@