diff --git a/android/app/build.gradle b/android/app/build.gradle index 4acb8ed..e59996b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -200,6 +200,7 @@ android { } dependencies { + implementation project(':react-native-svg') // Add v8-android - prebuilt libv8android.so into APK implementation 'org.chromium:v8-android:+' implementation project(':react-native-randombytes') diff --git a/android/app/src/main/java/com/sifir/MainApplication.java b/android/app/src/main/java/com/sifir/MainApplication.java index 9229a63..c420573 100644 --- a/android/app/src/main/java/com/sifir/MainApplication.java +++ b/android/app/src/main/java/com/sifir/MainApplication.java @@ -4,6 +4,7 @@ import android.content.Context; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; +import com.horcrux.svg.SvgPackage; import com.bitgo.randombytes.RandomBytesPackage; import cl.json.RNSharePackage; import com.facebook.react.ReactNativeHost; diff --git a/android/settings.gradle b/android/settings.gradle index 657a105..b100672 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'Sifir' +include ':react-native-svg' +project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':watermelondb' project(':watermelondb').projectDir = new File(rootProject.projectDir, '../node_modules/@nozbe/watermelondb/native/android') include ':react-native-randombytes', ':gopenpgp' diff --git a/babel.config.js b/babel.config.js index ae9d761..cdc41c5 100644 --- a/babel.config.js +++ b/babel.config.js @@ -17,6 +17,7 @@ module.exports = { '@helpers': './src/helpers', '@types': './src/store/types', '@screens': './src/components/screens', + '@structures': './src/components/structures', }, }, ], diff --git a/ios/Podfile b/ios/Podfile index e1f5841..d1f6afc 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -44,6 +44,8 @@ target 'Sifir' do pod 'react-native-randombytes', :path => '../node_modules/react-native-randombytes' + pod 'RNSVG', :path => '../node_modules/react-native-svg' + target 'SifirTests' do inherit! :search_paths # Pods for testing diff --git a/package-lock.json b/package-lock.json index 482496d..9708f3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,26 +5,26 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -51,333 +51,333 @@ } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "requires": { - "@babel/types": "^7.9.5", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-react-jsx": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", - "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", + "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/types": "^7.9.0" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz", - "integrity": "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", + "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-module-imports": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-module-imports": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", - "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", "requires": { - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3" + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-regex": "^7.8.3", + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" }, "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" }, "@babel/plugin-external-helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.8.3.tgz", - "integrity": "sha512-mx0WXDDiIl5DwzMtzWGRSPugXi9BxROS05GQrhLNbEamhBiicgn994ibwkyiBH+6png7bm/yA7AUsvHyCXi4Vw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.1.tgz", + "integrity": "sha512-xFXc/Ts/gsgCrkh3waZbVdkzmhtnlw1L972gx96pmj8hXvloHnPTDgZ07vTDve9ilpe9TcrIMWLU7rg6FqnAWA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz", + "integrity": "sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-decorators": "^7.10.1" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz", - "integrity": "sha512-PYtv2S2OdCdp7GSPDg5ndGZFm9DmWFvuLoS5nBxZCgOBggluLnhTScspJxng96alHQzPyrrHxvC9/w4bFuspeA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz", + "integrity": "sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-export-default-from": "^7.10.1" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", - "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.9.5" + "@babel/plugin-transform-parameters": "^7.10.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", - "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", + "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-dynamic-import": { @@ -389,27 +389,27 @@ } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.8.3.tgz", - "integrity": "sha512-a1qnnsr73KLNIQcQlcQ4ZHxqqfBKM6iNQZW2OMTyxNbA2WC7SHWHtGVpFzWtQAuS2pspkWVzdEBXXx8Ik0Za4w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz", + "integrity": "sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz", + "integrity": "sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", + "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -445,218 +445,218 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz", + "integrity": "sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", - "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz", + "integrity": "sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-flow": "^7.10.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", - "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-object-assign": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz", - "integrity": "sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.1.tgz", + "integrity": "sha512-poBEVwzcTjv6p92ZcnWBUftzyXFCy/Zg/eCQsayu5/ot2+qwnasNvCCKPwdgprgDRzbHVUhh/fzI9rCoFOHLbg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", + "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", - "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", + "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", "requires": { - "@babel/helper-builder-react-jsx": "^7.9.0", - "@babel/helper-builder-react-jsx-experimental": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-builder-react-jsx": "^7.10.1", + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", - "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", + "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz", + "integrity": "sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", "resolve": "^1.8.1", "semver": "^5.5.1" }, @@ -669,62 +669,62 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-typescript": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", - "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz", + "integrity": "sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-typescript": "^7.10.1" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/register": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz", - "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", + "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", "requires": { "find-cache-dir": "^2.0.0", "lodash": "^4.17.13", @@ -734,34 +734,34 @@ } }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -778,11 +778,11 @@ } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1041,9 +1041,9 @@ } }, "@nozbe/watermelondb": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@nozbe/watermelondb/-/watermelondb-0.16.0.tgz", - "integrity": "sha512-WzV7YL8iPUVZ6KLQqzY9z1g913z3laFt4ZWCejcIZMWon89kZ8K9NlniufNUBkTCKrt007U4HSJw6bmTHrDnQA==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@nozbe/watermelondb/-/watermelondb-0.16.2.tgz", + "integrity": "sha512-LLOEl13bVCiLsZf8QCHt5KUmuks7QnMtsXuhBB2rSb1vBDjc3mG2HmkH/eTzbgJnGIdFzH/XtoVUHlS/ll7Log==", "requires": { "lodash.clonedeep": "^4.5.0", "lokijs": "git+https://github.com/Nozbe/LokiJS.git#d08f660", @@ -1063,9 +1063,9 @@ } }, "@react-native-community/async-storage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.9.0.tgz", - "integrity": "sha512-TlGMr02JcmY4huH1P7Mt7p6wJecosPpW+09+CwCFLn875IhpRqU2XiVA+BQppZOYfQdHUfUzIKyCBeXOlCEbEg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.11.0.tgz", + "integrity": "sha512-Pq9LlmvtCEKAGdkyrgTcRxNh2fnHFykEj2qnRYijOl1pDIl2MkD5IxaXu5eOL0wgOtAl4U//ff4z40Td6XR5rw==", "requires": { "deep-assign": "^3.0.0" } @@ -1169,9 +1169,9 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" } } }, @@ -1200,36 +1200,37 @@ } }, "@react-native-community/masked-view": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.7.tgz", - "integrity": "sha512-9KbP7LTLFz9dx1heURJbO6nuVMdSjDez8znlrUzaB1nUwKVsTTwlKRuHxGUYIIkReLWrJQeCv9tidy+84z2eCw==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.10.tgz", + "integrity": "sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ==" }, "@react-navigation/core": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.3.3.tgz", - "integrity": "sha512-YCrDIcvbuT++8RJA11gwv4qJTvsrwlp+4J1mWonGlHQnPMuB+uHvxqV8/VaHJ6FmzL11tSE6EzzdO0obm7JwIA==", - "requires": { - "@react-navigation/routers": "^5.3.0", - "escape-string-regexp": "^2.0.0", - "nanoid": "^3.0.2", - "query-string": "^6.12.0", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.10.0.tgz", + "integrity": "sha512-cVQTj5FtZHWuymjZMP50RVXYpkQUbo1zQPjxJl+UfBUh7u9nKexknajBhjYbZq61uDE4MmPE8qAqIEJHKeR4Hg==", + "requires": { + "@react-navigation/routers": "^5.4.7", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.5", + "query-string": "^6.12.1", "react-is": "^16.13.0", "use-subscription": "^1.4.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" } } }, "@react-navigation/native": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.1.5.tgz", - "integrity": "sha512-LP8Z8YIXS5HrGJM8CR683pLBSU5MilGRQRZYCmvp8f77oKJm2o1ETZPaOPLav8gMrtcJ2B9T02HQSP1Kz/iIxQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.5.1.tgz", + "integrity": "sha512-5pzsfvLdnvqfrWgTMCLDFaGK6Sj30p7tAMhUGneV2oGlx0OIbhgc6/04UUMpKEmAS2PaC/GZa1LQIsSVWDewvw==", "requires": { - "@react-navigation/core": "^5.3.3" + "@react-navigation/core": "^5.10.0", + "nanoid": "^3.1.9" } }, "@react-navigation/native-stack": { @@ -1238,17 +1239,17 @@ "integrity": "sha512-gzBwX0tVLUFSBudLV1BxwcyOJ8FZ0+fzWiK9BjFkamUCXE7Vi9mA5PIgoXW69X3tnATTM3+7VA3d+/UcflpJow==" }, "@react-navigation/routers": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.3.0.tgz", - "integrity": "sha512-hU9ize/NPHS5wWR5KVx/cgN9DH29Y9iHa+SxUd3IJmBnK8ujj0rM8xz3hihY4yfu0kOvTFOPHojoBwnpH5cs+g==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.4.7.tgz", + "integrity": "sha512-J+lQYDbEsyhAjcPpWY6ZJYEkGiZcPX62hNtySruShjbIEnI9gm3rC+BHdcrP/lufeWxWGFhI8CN7NSJGgP/Nmg==", "requires": { - "nanoid": "^3.0.2" + "nanoid": "^3.1.5" } }, "@react-navigation/stack": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.2.10.tgz", - "integrity": "sha512-QOx+ak+nLox9h4iwxL6+eJ6ndo4C43BVibN8/EWLydvcHB078eqSCKB77PS6XsohGGe0xbD/+jTOYbvPpfpjGw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.5.1.tgz", + "integrity": "sha512-oU2FEm+Ba6jMd5VA2WnuNfCO2HlZmGhrEX9yjBCyFj7fFCG1SB7WJdKLhZShtx3KxG/qWKphICeTLlYvkHdSpQ==", "requires": { "color": "^3.1.2", "react-native-iphone-x-helper": "^1.2.1" @@ -1264,9 +1265,9 @@ } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", + "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1296,9 +1297,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", + "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1329,9 +1330,9 @@ "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, "@types/istanbul-lib-report": { "version": "3.0.0", @@ -1342,24 +1343,30 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/node": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", - "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==" + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==" }, "@types/prop-types": { "version": "15.7.3", @@ -1367,18 +1374,18 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/react": { - "version": "16.9.34", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.34.tgz", - "integrity": "sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==", + "version": "16.9.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.37.tgz", + "integrity": "sha512-ZqnAXallQiZ08LTSqMfWMNvAfJEzRLOxdlbbbCIJlYGjU98BEU6bE2uBpKPGeWn+v3hIgCraHKtqUcKZBzMP/Q==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, "@types/react-native": { - "version": "0.62.2", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.2.tgz", - "integrity": "sha512-oIUIbqZNN9vRnGKWHYbTVp/GyTqdaM5mfy1s4zsi6BYvHAaFOPZ32IrhIHno/A5XOv4wuGfE7g5fliDk/H0+/Q==", + "version": "0.62.13", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.13.tgz", + "integrity": "sha512-hs4/tSABhcJx+J8pZhVoXHrOQD89WFmbs8QiDLNSA9zNrD46pityAuBWuwk1aMjPk9I3vC5ewkJroVRHgRIfdg==", "requires": { "@types/react": "*" } @@ -1398,9 +1405,9 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", "requires": { "@types/yargs-parser": "*" } @@ -1507,9 +1514,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" }, "acorn-globals": { "version": "4.3.4", @@ -1552,9 +1559,9 @@ } }, "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "agent-base": { "version": "4.2.1", @@ -1565,9 +1572,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1835,9 +1842,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" }, "axios": { "version": "0.19.2", @@ -1889,9 +1896,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } @@ -2138,9 +2145,9 @@ } }, "bech32": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", - "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "big-integer": { "version": "1.6.48", @@ -2196,9 +2203,9 @@ } }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" }, "body-parser": { "version": "1.19.0", @@ -2257,6 +2264,11 @@ "secp256k1": "^3.4.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, "bplist-creator": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", @@ -2452,17 +2464,41 @@ } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "browserify-zlib": { @@ -2508,11 +2544,30 @@ "ieee754": "^1.1.4" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2657,9 +2712,9 @@ "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==" }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { "version": "3.2.0", @@ -2773,9 +2828,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", + "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==" }, "combine-source-map": { "version": "0.8.0", @@ -2804,9 +2859,9 @@ } }, "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "commander": { "version": "2.20.3", @@ -3053,6 +3108,43 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -3084,8 +3176,8 @@ } }, "cyphernode-js-sdk-transports": { - "version": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#7701da2e457db025b496c47847ee4472a433dc20", - "from": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "version": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#f5c3d67200420737f11da2837dcac1665c08587f", + "from": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", "requires": { "async": "^3.1.0", "body-parser": "^1.19.0", @@ -3111,6 +3203,80 @@ } } }, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-format": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", + "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-interpolate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.0.0.tgz", + "integrity": "sha1-ywMnMU/tsU5uoXiat+CVoWwvirI=", + "requires": { + "d3-interpolate": "^1.1.1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", @@ -3154,14 +3320,9 @@ } }, "dayjs": { - "version": "1.8.24", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.24.tgz", - "integrity": "sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw==" - }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + "version": "1.8.28", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", + "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==" }, "debug": { "version": "2.6.9", @@ -3358,6 +3519,11 @@ "randombytes": "^2.0.0" } }, + "dijkstrajs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", + "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3367,11 +3533,32 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -3381,6 +3568,15 @@ "webidl-conversions": "^4.0.2" } }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -3462,10 +3658,15 @@ "once": "^1.4.0" } }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + }, "envinfo": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", - "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==" + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==" }, "error-ex": { "version": "1.3.2", @@ -3485,22 +3686,22 @@ } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -3538,9 +3739,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", + "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -3690,9 +3891,9 @@ "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -3751,9 +3952,9 @@ } }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", + "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -3875,9 +4076,9 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -3955,9 +4156,9 @@ } }, "eslint-plugin-eslint-comments": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", - "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -3974,23 +4175,24 @@ } }, "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "version": "2.21.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz", + "integrity": "sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "doctrine": { @@ -4077,9 +4279,9 @@ } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", "dev": true }, "espree": { @@ -4099,18 +4301,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^5.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } @@ -4381,9 +4583,9 @@ } }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -4680,487 +4882,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } }, "ftp": { @@ -5283,9 +5011,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growly": { "version": "1.3.0", @@ -5363,20 +5091,38 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -5526,9 +5272,9 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "image-size": { @@ -5682,9 +5428,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-ci": { @@ -5803,18 +5549,13 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-stream": { @@ -6795,9 +6536,9 @@ } }, "jetifier": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.5.tgz", - "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" }, "js-tokens": { "version": "4.0.0", @@ -6805,9 +6546,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6951,12 +6692,12 @@ } }, "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", "dev": true, "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", "object.assign": "^4.1.0" } }, @@ -7217,9 +6958,9 @@ } }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" }, "lokijs": { "version": "git+https://github.com/Nozbe/LokiJS.git#d08f660794be558529f5ba049fe2868d4f243ec4", @@ -7311,6 +7052,11 @@ "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7674,16 +7420,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -7742,9 +7488,9 @@ } }, "mkdirp-classic": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", - "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "module-deps": { "version": "6.2.2", @@ -7769,9 +7515,9 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" }, "morgan": { "version": "1.10.0", @@ -7803,14 +7549,14 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, "nanoid": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.0.2.tgz", - "integrity": "sha512-WOjyy/xu3199NlQiQWlx7VbspSFlGtOxa1bRX9ebmXOnp1fje4bJfjPs1wLQ8jZbJUfD+yceJmw879ZSaVJkdQ==" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.10.tgz", + "integrity": "sha512-iZFMXKeXWkxzlfmMfM91gw7YhN2sdJtixY+eZh9V6QWJWTOiurhpKhBMgr82pfzgSqglQgqYSCowEYsz8D++6w==" }, "nanomatch": { "version": "1.2.13", @@ -7862,11 +7608,12 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-react-native": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-libs-react-native/-/node-libs-react-native-1.0.3.tgz", - "integrity": "sha512-2X/M/DMB4hij2L0tsnJOiDhYR2N0YtetIhb/eN5+5vksLxjXwaFgLbSXWT3XExnGJpISDn8dYuYz6yvdndjjkg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-libs-react-native/-/node-libs-react-native-1.2.0.tgz", + "integrity": "sha512-D+g8Mj9OfsOYYFWZoSz4bmr/8g/QWOwUgDmi3Ux0EPU9Q41OvGsdzAzr0IGJmtuSAfyOTfnKx1XRQR9id8/EEw==", "requires": { "assert": "^1.4.1", + "base-64": "^0.1.0", "browserify-zlib": "^0.2.0", "buffer": "^5.0.6", "console-browserify": "^1.1.0", @@ -7932,6 +7679,14 @@ } } }, + "node-localstorage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -7990,6 +7745,14 @@ "path-key": "^2.0.0" } }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -8248,9 +8011,32 @@ } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "openpgp": { + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.4.tgz", + "integrity": "sha512-JMceIvDDE9Qko2AsMpVgf4YM7h7zPt3sZT0qnOIvwynuDuTs+wL5ht37t894hirgzSHr2d+64nEnKbBtwoYwSQ==", + "requires": { + "asn1.js": "^5.0.0", + "node-fetch": "^2.1.2", + "node-localstorage": "~1.3.0" + }, + "dependencies": { + "asn1.js": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.3.0.tgz", + "integrity": "sha512-WHnQJFcOrIWT1RLOkFFBQkFVvyt9BPOOrH+Dp152Zk4R993rSzXUGPmkybIcUFhHE2d/iHH+nCaOWVCDbO8fgA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + } + } }, "opn": { "version": "4.0.2", @@ -8555,9 +8341,9 @@ } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -8754,6 +8540,11 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -8771,20 +8562,20 @@ "dev": true }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" }, "dependencies": { "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -8793,9 +8584,9 @@ } }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "requires": { "@types/yargs-parser": "*" } @@ -8997,10 +8788,136 @@ "bitcoin-ops": "^1.3.0" } }, - "qr.js": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", - "integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=" + "qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", + "requires": { + "buffer": "^5.4.3", + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.1", + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } }, "qs": { "version": "6.7.0", @@ -9008,9 +8925,9 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.12.0.tgz", - "integrity": "sha512-aoiFW9ZU7jP8Itjqfpw80Qe7RoyCIhFrW522sdsp9LG92pat6CCG3d8qNZBaUi71FsEjIfLjx9Ky347FtVoqXA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", + "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -9192,6 +9109,11 @@ } } }, + "react-native-androw": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/react-native-androw/-/react-native-androw-0.0.34.tgz", + "integrity": "sha512-YuW0GxYNzABvPPe6k+JdLUF5CAzKSW5R6IxxA/+fg5gc+4avE1tZgLmnRfNtXJCbW9r90YLYp33S9Uu2pe//fg==" + }, "react-native-animatable": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.3.tgz", @@ -9201,9 +9123,9 @@ } }, "react-native-camera": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.22.1.tgz", - "integrity": "sha512-KMi/pagWz9ssODghHHKXypukTFpM14T62ZNbd/UriZZSnvdQxXrddJhwQpH3cnZS2kl03Jupu52vi4AvT36Feg==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.30.0.tgz", + "integrity": "sha512-rZorpBHXnc4MT9N6ddV4iC7h9dSUx4umtXvAKMkdYr3ZONlZcEfWxup7YCeAZ5wu4x43SvhSiTfYd8g0q+V0wg==", "requires": { "prop-types": "^15.6.2" } @@ -9292,14 +9214,14 @@ "integrity": "sha512-t5BOIMRU5vMzMOtuUUuYxd59ipwRe8v1H7NTk8Z0elvBf8hCwYSsnRFDIYk35k/ZbbKZcODmd74P4x1zLTsDyA==" }, "react-native-permissions": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.0.10.tgz", - "integrity": "sha512-oQmWgm4tqUYyWmMNtYzNO7U/+6+WHyKiRd5cwNeE1FCJTGh8cJ5HapjHw3d6ZVfhSLzNwWqgJy1P4NpTANYa/g==" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.1.5.tgz", + "integrity": "sha512-b9KO/4UEV9qddl+kcSybmdk8nlAifclSDBR2rSvc5KZM06vIaJWJNIzK2ZwPXqDQ5yD3CJLuKTRj7Fz+jM9qyQ==" }, "react-native-qrcode-scanner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.4.0.tgz", - "integrity": "sha512-W6wLJNbPQ/SQSRaVcAaGDN919me0LQQyHx7xzx3d/bB8NBya1RJ/bn7zUdnPUhSrp5OVDkGhW9BvRZBoX7xHPw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.4.1.tgz", + "integrity": "sha512-QODC1bgfyx/v4OaFGMKMyhKU2SRHBosVxCi29b0T3QDWBZmzn5BN4QGKDxJvKfMo5UPyU2BNIn1KfapySfJx7g==", "requires": { "@react-native-community/async-storage": "^1.6.1", "opencollective": "^1.0.3", @@ -9308,6 +9230,15 @@ "react-native-permissions": "^2.0.2" } }, + "react-native-qrcode-svg": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-6.0.6.tgz", + "integrity": "sha512-b+/teD+xj17VDujJzf956U2+9mX+gKwVJss2aqmhEIyjP7+TVOuE08D3UkzfOCWXE8gppcUTTz5gkY1NXgfwyQ==", + "requires": { + "prop-types": "^15.5.10", + "qrcode": "^1.3.2" + } + }, "react-native-randombytes": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/react-native-randombytes/-/react-native-randombytes-3.5.3.tgz", @@ -9329,14 +9260,6 @@ } } }, - "react-native-range-slider": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/react-native-range-slider/-/react-native-range-slider-0.1.2.tgz", - "integrity": "sha512-EZLOtcnhOcOv4yZtPT826jZknqn+h3zbqM08tc3dFbakBFMoK4aN5GAuHP2RJ3PhMtwzl2h6HzOeFilq8cKaXQ==", - "requires": { - "prop-types": "^15.5.10" - } - }, "react-native-ratings": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-6.5.0.tgz", @@ -9347,9 +9270,9 @@ } }, "react-native-reanimated": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.8.0.tgz", - "integrity": "sha512-vGTt94lE5fsZmfMwERWFIsCr5LHsyllOESeNvlKryLgAg7h4cnJ5XSmVSy4L3qogdgFYCL6HEgY+s7tQmKXiiQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.9.0.tgz", + "integrity": "sha512-Aj+spgIHRiVv7ezGADxnSH1EoKrQRD2+XaSiGY0MiB/pvRNNrZPSJ+3NVpvLwWf9lZMOP7dwqqyJIzoZgBDt8w==", "requires": { "fbjs": "^1.0.0" } @@ -9360,12 +9283,9 @@ "integrity": "sha512-9Uqu1vlXPi+2cKW/CW6OnHxA76mWC4kF3wvlqzq4DY8hn37AeiXtLFs2WkxH4yXQRrnJdP6ivc65Lz+MqwRZAA==" }, "react-native-screens": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.4.0.tgz", - "integrity": "sha512-7GcXlaj7IIrM4l5Ub7BPTkNQJ2slHGt2bhmfWmW73NTXEv+7pjHlp+JpQO32Yn+O8UQGPFf0rsesfYUdER7ppQ==", - "requires": { - "debounce": "^1.2.0" - } + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.8.0.tgz", + "integrity": "sha512-fUCIQLZX+5XB0ypWX038P3zso54IFFjTsQUZJWEsjC3pp5rPItAt5SzqtJn+uVjcJaczZ+dpIuvj6IFLqkWLZQ==" }, "react-native-sensitive-info": { "version": "5.5.5", @@ -9430,6 +9350,48 @@ "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.5.0.tgz", "integrity": "sha512-sYBCPYA/NapBSHkdm/IVL4ID3LLlIuLqINi2FBDyMkc2BU9pfSGOtkz9yfxoK39mYJuTrlTOQ7mManARUsYDSA==" }, + "react-native-svg": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-12.1.0.tgz", + "integrity": "sha512-1g9qBRci7man8QsHoXn6tP3DhCDiypGgc6+AOWq+Sy+PmP6yiyf8VmvKuoqrPam/tf5x+ZaBT2KI0gl7bptZ7w==", + "requires": { + "css-select": "^2.1.0", + "css-tree": "^1.0.0-alpha.39" + } + }, + "react-native-svg-charts": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-native-svg-charts/-/react-native-svg-charts-5.4.0.tgz", + "integrity": "sha512-5TaIGSihJaHCGFj32Tc07hZrqqTpvdyAx89PIrW2nLf2tijd61+3UE3jtsiHOvfeAyDgSTWjv6s9qG9d2di7Pw==", + "requires": { + "d3-array": "^1.2.0", + "d3-interpolate-path": "2.0.0", + "d3-scale": "^1.0.6", + "d3-shape": "^1.0.6", + "prop-types": "^15.6.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, "react-native-swipe-up-down": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/react-native-swipe-up-down/-/react-native-swipe-up-down-1.0.7.tgz", @@ -9445,6 +9407,11 @@ "react-tween-state": "^0.1.5" } }, + "react-native-tab-view": { + "version": "2.14.4", + "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-2.14.4.tgz", + "integrity": "sha512-oqkCflPFuZwDTbyY2WaN0377akSsmcttuYACR9LT7htZfO/tKR2Z/ynj1tbv2cz2esGuVICoga9cetN1lPimog==" + }, "react-native-v8": { "version": "0.61.5-patch.3", "resolved": "https://registry.npmjs.org/react-native-v8/-/react-native-v8-0.61.5-patch.3.tgz", @@ -9584,9 +9551,9 @@ } }, "react-refresh": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", - "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==" }, "react-tween-state": { "version": "0.1.5", @@ -9692,6 +9659,11 @@ "util.promisify": "^1.0.0" } }, + "reanimated-bottom-sheet": { + "version": "1.0.0-alpha.20", + "resolved": "https://registry.npmjs.org/reanimated-bottom-sheet/-/reanimated-bottom-sheet-1.0.0-alpha.20.tgz", + "integrity": "sha512-bcXVkmJLL6SOoIPWU2dIJnT7+78a5tDi9eaE6ESsEewZ10lpfJhjfCCFrngPZKPhatQ6mjCJSYEAL+fwbXCiJw==" + }, "redux": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", @@ -9714,9 +9686,9 @@ "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -9769,9 +9741,9 @@ } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { "version": "0.6.4", @@ -9884,9 +9856,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -9947,12 +9919,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "rx": { "version": "4.1.0", @@ -10191,8 +10160,14 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "sifir-js-sdk": { - "version": "git+https://github.com/Sifir-io/sifir-js-sdk.git#f860e9b2fac8dbb52606b0fadc41977f70350ce8", - "from": "git+https://github.com/Sifir-io/sifir-js-sdk.git#feature/rn" + "version": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#2037aed1594eaaf5519f03a67ccecbdcead3054d", + "from": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#master", + "requires": { + "crypto-js": "^4.0.0", + "openpgp": "^4.10.4", + "superagent": "^5.2.2", + "superagent-proxy": "^2.0.0" + } }, "signal-exit": { "version": "3.0.3", @@ -10398,9 +10373,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -10419,23 +10394,23 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10491,9 +10466,9 @@ "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" }, "stacktrace-parser": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.9.tgz", - "integrity": "sha512-DRy03ljj0367Ud3OAJHD6eVS/+CvMK2u/djVYuU37fHYcYHoZ8tkFyhbRf7PNG1h3bWLsw+SNTSXrPFe07A7aQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "requires": { "type-fest": "^0.7.1" } @@ -10552,14 +10527,14 @@ } }, "stream-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", - "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", + "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", "requires": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" }, "dependencies": { "readable-stream": { @@ -10638,28 +10613,6 @@ "es-abstract": "^1.17.5" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - }, "string.prototype.trimstart": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", @@ -10718,9 +10671,9 @@ } }, "sudo-prompt": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", - "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" }, "superagent": { "version": "5.2.2", @@ -10751,15 +10704,15 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "optional": true }, "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", "optional": true }, "readable-stream": { @@ -10802,6 +10755,11 @@ "has-flag": "^3.0.0" } }, + "svg-path-properties": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-1.0.4.tgz", + "integrity": "sha512-yoiTZOP37EFt6GetaQlN4IIqUWZSn3i+pMztDg3OtTNwoU0a+0+o7os3PK+UT2nsS115vr02VG4HIzMEVcTzFg==" + }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -11106,10 +11064,33 @@ } } }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tsutils": { "version": "3.17.1", @@ -11401,9 +11382,9 @@ "integrity": "sha512-YtJEYC4cEr/EJjCAllQN1T+PX+XtcrCCBXJv+dLdzxxRtVKkHlf8kAxyriXUOtGmiMtgzlz+d8hQugVPdq8ZfA==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { diff --git a/package.json b/package.json index 935c5e2..419aff3 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,13 @@ "base-64": "^0.1.0", "bolt11": "^1.2.7", "browserify": "^16.5.0", - "cyphernode-js-sdk-transports": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "cyphernode-js-sdk-transports": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "d3-scale": "^3.2.1", "moment": "^2.24.0", "node-libs-react-native": "^1.0.3", - "qr.js": "^0.0.0", "react": "16.9.0", "react-native": "0.61.5", + "react-native-androw": "0.0.34", "react-native-animatable": "^1.3.3", "react-native-camera": "^3.17.0", "react-native-crypto": "^2.2.0", @@ -44,7 +45,7 @@ "react-native-nav": "^2.0.2", "react-native-permissions": "^2.0.3", "react-native-qrcode-scanner": "^1.2.3", - "react-native-range-slider": "^0.1.2", + "react-native-qrcode-svg": "^6.0.6", "react-native-reanimated": "^1.7.0", "react-native-safe-area-context": "^0.7.3", "react-native-screens": "^2.0.0", @@ -52,15 +53,20 @@ "react-native-share": "^2.0.0", "react-native-slider": "^0.11.0", "react-native-sliding-up-down-panels": "^1.0.0", + "react-native-svg": "^12.1.0", + "react-native-svg-charts": "^5.4.0", "react-native-swipe-up-down": "^1.0.7", "react-native-swipeout": "^2.3.6", + "react-native-tab-view": "^2.14.0", "react-native-v8": "^0.61.5-patch.2", "react-native-vector-icons": "^6.6.0", "react-navigation-transitions": "^1.0.12", "react-redux": "^7.1.1", + "reanimated-bottom-sheet": "^1.0.0-alpha.20", "redux": "^4.0.4", "redux-thunk": "^2.3.0", - "sifir-js-sdk": "git+https://github.com/Sifir-io/sifir-js-sdk.git#feature/rn", + "sifir-js-sdk": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#master", + "svg-path-properties": "^1.0.4", "uuid": "^3.4.0", "vm-browserify": "^1.1.2" }, diff --git a/src/assets/images/arrowupArrow.png b/src/assets/images/arrowupArrow.png new file mode 100644 index 0000000..85767fe Binary files /dev/null and b/src/assets/images/arrowupArrow.png differ diff --git a/src/assets/images/arrowupArrow@2x.png b/src/assets/images/arrowupArrow@2x.png new file mode 100644 index 0000000..c2a9e05 Binary files /dev/null and b/src/assets/images/arrowupArrow@2x.png differ diff --git a/src/assets/images/arrowupArrow@3x.png b/src/assets/images/arrowupArrow@3x.png new file mode 100644 index 0000000..358bea0 Binary files /dev/null and b/src/assets/images/arrowupArrow@3x.png differ diff --git a/src/assets/images/bitcoinWhiteOutlined.png b/src/assets/images/bitcoinWhiteOutlined.png new file mode 100644 index 0000000..29bbae8 Binary files /dev/null and b/src/assets/images/bitcoinWhiteOutlined.png differ diff --git a/src/assets/images/bitcoinWhiteOutlined@2x.png b/src/assets/images/bitcoinWhiteOutlined@2x.png new file mode 100644 index 0000000..aeaf1f3 Binary files /dev/null and b/src/assets/images/bitcoinWhiteOutlined@2x.png differ diff --git a/src/assets/images/bitcoinWhiteOutlined@3x.png b/src/assets/images/bitcoinWhiteOutlined@3x.png new file mode 100644 index 0000000..4956c43 Binary files /dev/null and b/src/assets/images/bitcoinWhiteOutlined@3x.png differ diff --git a/src/assets/images/confirmed.png b/src/assets/images/confirmed.png new file mode 100644 index 0000000..0ab8fc5 Binary files /dev/null and b/src/assets/images/confirmed.png differ diff --git a/src/assets/images/confirmed@2x.png b/src/assets/images/confirmed@2x.png new file mode 100644 index 0000000..69da342 Binary files /dev/null and b/src/assets/images/confirmed@2x.png differ diff --git a/src/assets/images/confirmed@3x.png b/src/assets/images/confirmed@3x.png new file mode 100644 index 0000000..9196906 Binary files /dev/null and b/src/assets/images/confirmed@3x.png differ diff --git a/src/assets/images/filter.png b/src/assets/images/filter.png new file mode 100644 index 0000000..5d98e7d Binary files /dev/null and b/src/assets/images/filter.png differ diff --git a/src/assets/images/filter@2x.png b/src/assets/images/filter@2x.png new file mode 100644 index 0000000..a72dd44 Binary files /dev/null and b/src/assets/images/filter@2x.png differ diff --git a/src/assets/images/filter@3x.png b/src/assets/images/filter@3x.png new file mode 100644 index 0000000..1b8b3aa Binary files /dev/null and b/src/assets/images/filter@3x.png differ diff --git a/src/assets/images/slider button@2x.png b/src/assets/images/slider button@2x.png new file mode 100644 index 0000000..0d08702 Binary files /dev/null and b/src/assets/images/slider button@2x.png differ diff --git a/src/assets/images/slider button@3x.png b/src/assets/images/slider button@3x.png new file mode 100644 index 0000000..e75e031 Binary files /dev/null and b/src/assets/images/slider button@3x.png differ diff --git a/src/assets/images/sliderbutton.png b/src/assets/images/sliderbutton.png new file mode 100644 index 0000000..43e512b Binary files /dev/null and b/src/assets/images/sliderbutton.png differ diff --git a/src/assets/images/unchecked.png b/src/assets/images/unchecked.png new file mode 100644 index 0000000..130e87c Binary files /dev/null and b/src/assets/images/unchecked.png differ diff --git a/src/assets/images/unchecked@2x.png b/src/assets/images/unchecked@2x.png new file mode 100644 index 0000000..8fc61ff Binary files /dev/null and b/src/assets/images/unchecked@2x.png differ diff --git a/src/assets/images/unchecked@3x.png b/src/assets/images/unchecked@3x.png new file mode 100644 index 0000000..55bde20 Binary files /dev/null and b/src/assets/images/unchecked@3x.png differ diff --git a/src/assets/images/wasabiLogo.png b/src/assets/images/wasabiLogo.png new file mode 100644 index 0000000..99cf0a6 Binary files /dev/null and b/src/assets/images/wasabiLogo.png differ diff --git a/src/assets/images/wasabiLogo1.png b/src/assets/images/wasabiLogo1.png new file mode 100644 index 0000000..7610cbe Binary files /dev/null and b/src/assets/images/wasabiLogo1.png differ diff --git a/src/assets/images/wasabiLogo1@2x.png b/src/assets/images/wasabiLogo1@2x.png new file mode 100644 index 0000000..e86daca Binary files /dev/null and b/src/assets/images/wasabiLogo1@2x.png differ diff --git a/src/assets/images/wasabiLogo1@3x.png b/src/assets/images/wasabiLogo1@3x.png new file mode 100644 index 0000000..763d93b Binary files /dev/null and b/src/assets/images/wasabiLogo1@3x.png differ diff --git a/src/assets/images/wasabiLogo@2x.png b/src/assets/images/wasabiLogo@2x.png new file mode 100644 index 0000000..3aa8d3c Binary files /dev/null and b/src/assets/images/wasabiLogo@2x.png differ diff --git a/src/assets/images/wasabiLogo@3x.png b/src/assets/images/wasabiLogo@3x.png new file mode 100644 index 0000000..ba776f1 Binary files /dev/null and b/src/assets/images/wasabiLogo@3x.png differ diff --git a/src/assets/svg/Back.js b/src/assets/svg/Back.js new file mode 100644 index 0000000..83e054d --- /dev/null +++ b/src/assets/svg/Back.js @@ -0,0 +1,18 @@ +import * as React from 'react'; +import Svg, {Path} from 'react-native-svg'; + +const Back = props => { + return ( + + + + ); +}; + +export default Back; diff --git a/src/assets/svg/index.js b/src/assets/svg/index.js new file mode 100644 index 0000000..35c7a32 --- /dev/null +++ b/src/assets/svg/index.js @@ -0,0 +1,5 @@ +import Back from './Back'; + +export default { + Back, +}; diff --git a/src/common/AppStyle.js b/src/common/AppStyle.js index 7021b76..14f1f5e 100644 --- a/src/common/AppStyle.js +++ b/src/common/AppStyle.js @@ -7,4 +7,6 @@ export default { secondaryColor: '#4B53FF', errorColor: '#D0021B', orange: 'orange', + grayColor: '#ABA8A8', + tertiaryColor: '#122C3A', }; diff --git a/src/common/constants.js b/src/common/constants.js index 256510f..4132c14 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -15,13 +15,16 @@ export const C = { STR_SHOP: 'SHOP', STR_SETTINGS: 'SETTINGS', STR_Cur_Balance: 'Current Balance', + STR_Wasabi_Header: 'Total Balance having minimum Anonset ', STR_Balance_Channels_n_Outputs: 'Channels & Outputs Balance', STR_Balance_Outputs: 'Balance (Outputs)', STR_Balance_Channels: 'Balance (Channels)', STR_Hops_to_route: 'hop to payee', STR_INVOICES_AND_PAYS: 'Invoices & Pays', STR_TRANSACTIONS: 'Transactions', + STR_ALL_TRANSACTIONS: 'All Transactions', STR_SEND: 'SEND', + STR_BACK: 'BACK', STR_Send: 'Send', STR_TxID: 'TxID', STR_ChannelID: 'Channel ID', @@ -106,6 +109,10 @@ export const C = { STR_WATCH_WALLET_TYPE: 'pub32Watching', STR_WATCHING: 'Watching', STR_SPEND_WALLET_TYPE: 'btcSpending', + STR_SPEND_WALLET_LABEL: 'Spending', + STR_WASABI_WALLET_TYPE: 'wasabiWallet', + STR_WASABI_WALLET_LABEL: 'Wasabi', + STR_UNSPENT_COINS: 'unspentCoins', STR_LN_WALLET_TYPE: 'ln', STR_LN_WITHDRAW: 'LNwithdraw', STR_WATCH_ONLY: 'WATCH ONLY', @@ -127,6 +134,13 @@ export const C = { STR_Segwit_Compatible: 'Segwit Compatible (P2SH)', STR_Bech32: 'Segwit Native (Bech32)', STR_Wallet_balance: 'Wallet Balance', + STR_Min_Anonset: 'Min Anonset', + STR_Anonim_Level: 'Anonimity Level', + STR_Set_Min_Anonset: 'Set Minimum Anonset', + STR_Auto_mix_account_select: + 'Funds reaching the minimum anonset specified will be sent to', + STR_Select_Account: + 'Select one account to which the Wasabi wallet will autosend funds to.', // --- ERRORS -- STR_ERROR_app: 'App Error', STR_ERROR: 'Error', diff --git a/src/common/images.js b/src/common/images.js index ed18a75..116e6c5 100644 --- a/src/common/images.js +++ b/src/common/images.js @@ -14,6 +14,7 @@ export default { icon_receive: require('./../assets/images/down_cir.png'), icon_chanel: require('./../assets/images/light_cir.png'), icon_up_arrow: require('./../assets/images/up_arrow.png'), + upArrow: require('./../assets/images/arrowupArrow.png'), icon_up_blue: require('./../assets/images/uparrow_blue.png'), icon_down_arrow: require('./../assets/images/down_arrow.png'), icon_btc_cir: require('./../assets/images/bitcoin_blue.png'), @@ -61,4 +62,10 @@ export default { icon_chatSend: require('./../assets/images/chatSend.png'), icon_yellowTxn: require('./../assets/images/yellowTxn.png'), icon_thickGreenArrowTxn: require('./../assets/images/bold_arrow.png'), + filter_icon: require('./../assets/images/filter.png'), + icon_wasabi: require('./../assets/images/wasabiLogo.png'), + icon_wasabi_clicked: require('./../assets/images/wasabiLogo1.png'), + icon_confirmed: require('./../assets/images/confirmed.png'), + icon_unconfirmed: require('./../assets/images/unchecked.png'), + icon_bitcoinWhiteOutlined: require('./../assets/images/bitcoinWhiteOutlined.png'), }; diff --git a/src/common/index.js b/src/common/index.js index 929bcfc..ef77f8f 100644 --- a/src/common/index.js +++ b/src/common/index.js @@ -1,5 +1,6 @@ import {C} from './constants'; import Images from './images'; import AppStyle from './AppStyle'; +import svg from '../assets/svg'; -export {C, Images, AppStyle}; +export {C, Images, AppStyle, svg}; diff --git a/src/components/elements/SifirAccountActions.js b/src/components/elements/SifirAccountActions.js index 7809ecd..b6fb612 100644 --- a/src/components/elements/SifirAccountActions.js +++ b/src/components/elements/SifirAccountActions.js @@ -8,12 +8,19 @@ import { } from 'react-native'; import {Images, AppStyle, C} from '@common/index'; -const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { +const SifirAccountActions = ({ + type, + sendActionButtonLabel, + handleReceiveButton, + handleSendBtn, + isDisabled = false, +}) => { const [btnStatus, setButtonStatus] = useState(0); return ( {!!handleSendBtn && ( setButtonStatus(1)} onPressOut={() => { @@ -23,9 +30,13 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { - {C.STR_SEND} + + {sendActionButtonLabel} + { )} {!!handleReceiveButton && ( setButtonStatus(2)} onPressOut={() => { @@ -45,7 +57,9 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { style={[ styles.txnBtnView, styles.leftTxnBtnView, - btnStatus === 2 ? {backgroundColor: 'black', opacity: 0.7} : {}, + btnStatus === 2 || isDisabled + ? {backgroundColor: 'black', opacity: 0.7} + : {}, ]}> {C.STR_RECEIVE} @@ -63,7 +77,6 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { const styles = StyleSheet.create({ btnAreaView: { - flex: 1, flexDirection: 'row', borderColor: AppStyle.mainColor, borderWidth: 1, diff --git a/src/components/elements/SifirAccountChart.js b/src/components/elements/SifirAccountChart.js new file mode 100644 index 0000000..3bdc9eb --- /dev/null +++ b/src/components/elements/SifirAccountChart.js @@ -0,0 +1,260 @@ +// @flow +import React, {useMemo, useEffect} from 'react'; +import {Images, AppStyle, C} from '@common/index'; +import {StyleSheet, View, Animated, TextInput, Text} from 'react-native'; +import Svg, {Path, Defs, Stop} from 'react-native-svg'; +import * as path from 'svg-path-properties'; +import * as shape from 'd3-shape'; +import {scaleLinear} from 'd3-scale'; +import LinearGradient from 'react-native-linear-gradient'; +import Androw from 'react-native-androw'; +import {log} from '@io/events'; +import makeUnspentCoinsChartData from '@helpers/makeUnspentCoinsChartData'; + +const d3 = { + shape, +}; + +const height = 60; +const width = C.SCREEN_WIDTH; +const verticalPadding = 5; +const cursorRadius = 10; +const cursor = React.createRef(); +const slider = React.createRef(); +const label = React.createRef(); +const SV = React.createRef(); +const x = new Animated.Value(0); + +const SifirAccountChart = props => { + const plotData = props.chartData; + useEffect(() => { + _init(); + }, []); + const {series, minX, maxX, minY, maxY} = useMemo( + () => makeUnspentCoinsChartData(plotData), + [plotData], + ); + const {scaleX, scaleY, line, properties, lineLength} = useMemo(() => { + const scaleX = scaleLinear() + .domain([minX, maxX]) + .range([20, width - 20]); + const scaleY = scaleLinear() + .domain([minY, maxY]) + .range([height - verticalPadding, verticalPadding]); + const line = d3.shape + .line() + .x(([anonset]) => scaleX(Number(anonset))) + .y(([, balance]) => scaleY(balance)) + .curve(d3.shape.curveStepBefore)(series); + const p = path.svgPathProperties(line); + return { + scaleX, + scaleY, + line, + properties: p, + lineLength: p.getTotalLength(), + }; + }, [series]); + const _init = () => { + try { + x.addListener(({value}) => moveCursor(value)); + log('Chart data lineLength', lineLength); + let {x: X, y} = properties.getPointAtLength(lineLength); + let top = y - cursorRadius - 2; + let left = X - (cursorRadius + 10); + cursor?.current?.setNativeProps({ + top, + left, + }); + slider.current.setNativeProps({ + left: left - 10, + }); + // Initialize with intial balance to show in account header + moveCursor(0); + } catch (err) { + console.error(err); + } + }; + + const moveCursor = value => { + let {x, y} = properties.getPointAtLength(lineLength - value); + let top = y - cursorRadius - 2; + let left = x - (cursorRadius + 10); + cursor?.current?.setNativeProps({ + top, + left, + }); + slider.current.setNativeProps({ + left: left - 10, + }); + const anonSetValue = scaleX.invert(x); + // const cumSumBalanceValue = scaleY.invert(y); + // find first anonset pair in acending array where value < array + // FIXME HERE TRELLO TICKET is why bug is breaing ? + const [, cumSumBalanceValue] = series.find( + ([anonset]) => anonSetValue <= anonset, + ); + const text = `${Math.floor(anonSetValue)}`; + label?.current?.setNativeProps({ + text, + top, + left, + }); + props.handleChartSlider({ + anonset: anonSetValue, + value: cumSumBalanceValue, + }); + }; + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {minX} + Anonimity Level + {maxX} + + + ); +}; + +export default SifirAccountChart; + +const styles = StyleSheet.create({ + root: { + height, + }, + container: { + marginTop: 10, + paddingTop: 40, + width, + overflow: 'hidden', + }, + cursor: { + width: cursorRadius * 1.4, + height: cursorRadius * 1.4, + borderRadius: cursorRadius, + borderColor: '#fff', + borderWidth: 2, + backgroundColor: '#00EDE7', + }, + cursorContainer: { + width: cursorRadius * 2.3, + height: cursorRadius * 2.3, + borderRadius: cursorRadius + 4, + backgroundColor: 'rgba(255, 255, 255, 0.3)', + position: 'absolute', + left: 10, + justifyContent: 'center', + alignItems: 'center', + }, + label: { + position: 'absolute', + color: 'white', + }, + verticalGradient: { + height: 250, + width: 40, + backgroundColor: 'lightgray', + opacity: 0.5, + borderRadius: 10, + top: -30, + }, + sliderContainer: { + marginHorizontal: 10, + marginTop: 10, + }, + bubbleText: {color: 'white'}, + thumb: { + backgroundColor: '#00EDE7', + width: 40, + borderRadius: 5, + elevation: 3, + height: 16, + }, + sliderTrack: { + backgroundColor: '#2B2B2B', + borderRadius: 5, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: 0}, + shadowOpacity: 0.8, + shadowRadius: 4, + }, + cursorParent: { + width, + height: height, + position: 'absolute', + top: height - height * 0.33, + }, + sliderLabel: { + color: 'gray', + }, + sliderLabelContainer: { + width: '100%', + height: 30, + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 10, + alignItems: 'center', + }, + chartContainer: { + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/components/elements/SifirAccountHeader.js b/src/components/elements/SifirAccountHeader.js index 4fc4dac..aefd2f2 100644 --- a/src/components/elements/SifirAccountHeader.js +++ b/src/components/elements/SifirAccountHeader.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useState} from 'react'; import { View, Text, @@ -23,6 +23,9 @@ const SifirAccountHeader = ({ accountIconOnPress, accountIcon, }) => { + const [balanceViewDimensions, setDimensions] = useState({}); + const {width} = balanceViewDimensions; + const balanceTxtFontSize = width / 5 || 25; return ( @@ -52,14 +55,20 @@ const SifirAccountHeader = ({ { + const {width, height} = event.nativeEvent.layout; + setDimensions({width, height}); + }} style={styles.balanceView}> {loading === true && ( )} {loaded === true && loading === false && ( <> - - + + @@ -73,7 +82,6 @@ const SifirAccountHeader = ({ const styles = StyleSheet.create({ headerView: { - flex: 3, marginTop: 0, marginLeft: 20, flexDirection: 'row', @@ -104,7 +112,7 @@ const styles = StyleSheet.create({ flex: 5, flexDirection: 'column-reverse', marginLeft: 25, - paddingBottom: 15, + justifyContent: 'center', }, balAmountTxt: { color: 'white', diff --git a/src/components/elements/SifirAccountHistory.js b/src/components/elements/SifirAccountHistory.js deleted file mode 100644 index a77017e..0000000 --- a/src/components/elements/SifirAccountHistory.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import { - View, - Image, - StyleSheet, - TouchableOpacity, - Text, - ActivityIndicator, -} from 'react-native'; -import {Images, AppStyle, C} from '@common/index'; -import SifirTxnList from '@elements/SifirTxnList'; - -const SifirAccountHistory = ({ - loading, - loaded, - txnData, - btcUnit, - type, - headerText, -}) => { - const BTN_WIDTH = C.SCREEN_WIDTH / 2; - return ( - <> - - {headerText} - - - - {loading && ( - - )} - - - - - - ); -}; - -const styles = StyleSheet.create({ - txnSetView: { - flex: 1, - flexDirection: 'row', - marginLeft: 26, - marginTop: 30, - }, - txnLblTxt: { - color: 'white', - fontSize: 23, - fontWeight: 'bold', - }, - txnListView: { - flex: 3, - height: '100%', - marginBottom: 20, - marginLeft: 25, - }, - settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, - spinner: {right: 30, position: 'absolute', alignSelf: 'center'}, -}); - -export default SifirAccountHistory; diff --git a/src/components/elements/SifirAnimatedOverlay.js b/src/components/elements/SifirAnimatedOverlay.js new file mode 100644 index 0000000..ab02fc5 --- /dev/null +++ b/src/components/elements/SifirAnimatedOverlay.js @@ -0,0 +1,26 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useRef, useEffect, useLayoutEffect} from 'react'; +import {Animated, Text, View, StyleSheet} from 'react-native'; + +export default ({style = {}, effectDeps = [], children, ...rest}) => { + const fadeAnim = new Animated.Value(0.2); + useLayoutEffect(() => { + Animated.timing(fadeAnim, { + toValue: 0.8, + duration: 150, + userNativeDriver: true, + }).start(); + }, []); + return ( + + ); +}; diff --git a/src/components/elements/SifirAnonimitySlider.js b/src/components/elements/SifirAnonimitySlider.js new file mode 100644 index 0000000..c6c1aca --- /dev/null +++ b/src/components/elements/SifirAnonimitySlider.js @@ -0,0 +1,142 @@ +import React from 'react'; +import {C} from '@common/index'; +import {StyleSheet, View, Animated, TextInput, Text} from 'react-native'; +import LinearGradient from 'react-native-linear-gradient'; + +const height = 60; +const width = C.SCREEN_WIDTH; + +const SifirAnonimitySlider = ({ + minX, + maxX, + SV, + slider, + label, + lineLength, + cursor, + x, +}) => { + return ( + <> + + + + + + + + + + + + + + + + + + + + {minX} + {C.STR_Anonim_Level} + {maxX} + + + ); +}; + +export default SifirAnonimitySlider; +const styles = StyleSheet.create({ + root: { + height, + }, + container: { + overflow: 'hidden', + paddingTop: '20%', + width, + }, + + label: { + position: 'absolute', + color: 'white', + top: -30, + }, + verticalGradient: { + height: 130, + width: 40, + backgroundColor: 'rgba(255,255,255,0.5)', + opacity: 0.5, + borderRadius: 10, + top: -40, + }, + sliderContainer: { + marginHorizontal: 10, + marginTop: 10, + }, + bubbleText: { + color: 'white', + textAlign: 'center', + fontSize: 18, + top: -15, + }, + thumb: { + backgroundColor: '#00EDE7', + width: 40, + borderRadius: 5, + elevation: 3, + height: 16, + }, + sliderTrack: { + backgroundColor: '#2B2B2B', + borderRadius: 5, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: 0}, + shadowOpacity: 0.8, + shadowRadius: 4, + }, + cursorParent: { + width, + height: height, + position: 'absolute', + top: 0, + }, + sliderLabel: { + color: 'gray', + }, + sliderLabelContainer: { + width: '100%', + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 10, + alignItems: 'center', + }, + chartContainer: { + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/components/elements/SifirAutoSpendWalletCard.js b/src/components/elements/SifirAutoSpendWalletCard.js new file mode 100644 index 0000000..092292a --- /dev/null +++ b/src/components/elements/SifirAutoSpendWalletCard.js @@ -0,0 +1,74 @@ +import React from 'react'; +import {View, Text, TouchableOpacity, Image, StyleSheet} from 'react-native'; +import SifirCard from '@elements/SifirCard'; +import {AppStyle, C} from '@common'; + +const SifirAutoSpendWalletCard = ({ + item, + setSelectedWallet, + onLayoutListItem, + selectedWallet, +}) => { + const {label, desc, iconURL, meta} = item; + // const {id, leftIcon, heading, annonset} = item; + + return ( + setSelectedWallet(item)} + onLayout={event => onLayoutListItem(event, label)}> + + + {`${label} - ${desc}`} + + {0} + {C.STR_Min_Anonset} + + + + ); +}; + +const styles = StyleSheet.create({ + cardContainer: { + marginStart: 20, + marginEnd: 20, + marginBottom: 24, + backgroundColor: '#19282f', + borderWidth: 2, + borderColor: '#19282f', + borderRadius: 20, + padding: 15, + flexDirection: 'row', + alignItems: 'center', + }, + leftIcon: { + width: 40, + height: 40, + resizeMode: 'contain', + }, + listHeading: { + color: 'white', + flex: 1, + paddingLeft: 20, + }, + anonset: { + color: 'white', + fontSize: 18, + }, + anonsetLabel: { + color: 'gray', + fontSize: 12, + }, + rightContainer: { + textAlign: 'right', + alignItems: 'flex-end', + }, +}); +export default SifirAutoSpendWalletCard; diff --git a/src/components/elements/SifirCard.js b/src/components/elements/SifirCard.js new file mode 100644 index 0000000..2f18db3 --- /dev/null +++ b/src/components/elements/SifirCard.js @@ -0,0 +1,8 @@ +import React from 'react'; +import {View} from 'react-native'; + +const SifirCard = ({children, style}) => { + return {children}; +}; + +export default SifirCard; diff --git a/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js b/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js new file mode 100644 index 0000000..225b1f4 --- /dev/null +++ b/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js @@ -0,0 +1,123 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useState} from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + TextInput, +} from 'react-native'; +import {AppStyle, svg} from '@common'; +import SifirSwitch from '@elements/SifirSwitch'; +import SifirAnimatedOverlay from '@elements/SifirAnimatedOverlay'; + +const {Back} = svg; + +const SifirAutoSpendHeader = ({ + headerText, + setSwitchOn, + isSwitchOn, + showOverlay, + onBackPress, +}) => { + return ( + + {showOverlay && } + + + + + + {headerText} + + + setSwitchOn(active)} + /> + + ); +}; + +export default SifirAutoSpendHeader; + +const styles = StyleSheet.create({ + titleContainer: { + flexDirection: 'row', + alignItems: 'center', + paddingTop: 10, + }, + title: { + // marginLeft: 12, + fontSize: 20, + color: '#00EDE7', + fontWeight: 'bold', + fontFamily: AppStyle.mainFont, + width: '60%', + }, + menuItem: {}, + activeMenuItem: { + borderBottomColor: 'white', + borderBottomWidth: 1, + }, + tabsStyle: { + flexDirection: 'row', + flex: 3, + marginLeft: 15, + marginRight: 15, + justifyContent: 'space-between', + alignItems: 'center', + paddingLeft: 20, + paddingRight: 20, + }, + activeNavTextView: { + color: 'white', + fontSize: 13, + fontFamily: AppStyle.mainFont, + }, + navTextView: { + color: AppStyle.mainColor, + fontSize: 13, + fontFamily: AppStyle.mainFont, + }, + logocontainer: { + width: 50, + height: 50, + borderRadius: 4, + marginLeft: 15, + borderWidth: 0.5, + shadowOffset: {width: 10, height: 10}, + shadowColor: 'black', + shadowOpacity: 1.0, + }, + navbarStyle: { + flexDirection: 'row', + padding: 10, + marginTop: 0, + // marginBottom: 15, + backgroundColor: AppStyle.backgroundColor, + justifyContent: 'center', + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 12, + }, + shadowOpacity: 0.58, + shadowRadius: 16.0, + elevation: 24, + }, + badgeCont: { + position: 'absolute', + top: -9, + right: -7, + }, + badge: { + width: 12, + height: 12, + borderWidth: 0, + borderRadius: 6, + }, +}); diff --git a/src/components/elements/SifirQRCode.js b/src/components/elements/SifirQRCode.js index 12f6f3b..ed88fef 100644 --- a/src/components/elements/SifirQRCode.js +++ b/src/components/elements/SifirQRCode.js @@ -1,108 +1,34 @@ -import {Image, View} from 'react-native'; -import PropTypes from 'prop-types'; -import React from 'react'; -import qr from 'qr.js'; -import {Buffer} from 'buffer'; - -function qr2bmp(data, colors, scale) { - const header = Buffer.from( - 'Qk02GwAAAAAAADYAAAAoAAAAMAAAADAAAAABABgAAAAAAAAbAAATCwAAEwsAAAAAAAAAAAAA', - 'base64', +import {View} from 'react-native'; +import React, {useEffect, useState} from 'react'; +import QRCode from 'react-native-qrcode-svg'; +import {Images, AppStyle} from '@common/index'; +// import qr from 'qr.js'; +const SifirQRCode = props => { + const { + value = 'Sifir', + fgColor = '#000000', + bgColor = '#FFFFFF', + size = 128, + setQrCodeURI, + } = props; + const [svgRef, setSvgRef] = useState(null); + useEffect(() => { + if (!svgRef) return; + svgRef.toDataURL(d => setQrCodeURI(`data:image/bmp;base64,${d}`)); + }, [svgRef]); + return ( + + setSvgRef(c)} + onError={console.error} + logo={Images.icon_header} + logoBackgroundColor={AppStyle.backgroundColor} + /> + ); - const size = data.length; - const width = size * scale; - if (width % 4 !== 0) { - throw new Error('Image width must be multiple of 4'); - } - header.writeUInt32LE(width, 0x12); - header.writeUInt32LE(width, 0x16); - header.writeUInt32LE(width * width * 3, 0x22); - const outBuf = Buffer.alloc(width * width * 3); - - for (let rowN = 0, len = data.length; rowN < len; rowN += 1) { - const row = data[rowN]; - for (let colN = 0, lenj = row.length; colN < lenj; colN += 1) { - const color = colors[+row[colN]]; - for (let x = colN * scale; x < (colN + 1) * scale; x += 1) { - for (let y = rowN * scale; y < (rowN + 1) * scale; y += 1) { - const bo = ((width - 1 - y) * width + x) * 3; - [outBuf[bo + 2], outBuf[bo + 1], outBuf[bo + 0]] = color; - } - } - } - } - return `data:image/bmp;base64,${header.toString('base64')}${outBuf.toString( - 'base64', - )}`; -} - -const utf16to8 = str => { - /* eslint-disable no-bitwise */ - let out = ''; - for (let i = 0, len = str.length; i < len; i += 1) { - const c = str.charCodeAt(i); - if (c >= 0x0001 && c <= 0x007f) { - out += str.charAt(i); - } else if (c > 0x07ff) { - out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f)); - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f)); - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); - } else { - out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f)); - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); - } - } - /* eslint-enable no-bitwise */ - return out; }; - -const parseColor = hexColor => { - if (!/^#[a-f0-9]{6}$/i.test(hexColor)) { - throw new Error('Please provide the color in #FFFFFF format'); - } - return [ - parseInt(hexColor.substr(1, 2), 16), - parseInt(hexColor.substr(3, 2), 16), - parseInt(hexColor.substr(5, 2), 16), - ]; -}; - -const gcd = (a, b) => (b ? gcd(b, a % b) : a); -const lcm = (a, b) => (a * b) / gcd(a, b); - -export default class SifirQRCode extends React.Component { - static defaultProps = { - value: 'Sifir', - fgColor: '#000000', - bgColor: '#FFFFFF', - size: 128, - }; - - static propTypes = { - value: PropTypes.string, - size: PropTypes.number, - bgColor: PropTypes.string, - fgColor: PropTypes.string, - }; - - render() { - const {size, bgColor, fgColor, value} = this.props; - const QRData = qr(utf16to8(value)).modules; - const imageMultiple = lcm(4, QRData.length); - const imageSize = Math.ceil(size / imageMultiple) * imageMultiple; - const scale = imageSize / QRData.length; - const uri = qr2bmp( - QRData, - [parseColor(bgColor), parseColor(fgColor)], - scale, - ); - if (this.props.getBase64) { - this.props.getBase64(uri); - } - return ( - - - - ); - } -} +export default SifirQRCode; diff --git a/src/components/elements/SifirSettingModal.js b/src/components/elements/SifirSettingModal.js index 1f00160..e7e92d6 100644 --- a/src/components/elements/SifirSettingModal.js +++ b/src/components/elements/SifirSettingModal.js @@ -45,8 +45,6 @@ const MenuListItem = ({label, icon, onPress, hideTopBorder = false}) => { class SifirSettingModal extends Component { state = {curMenu: 0, value: 0.6}; - // FIXME - // Replace legacy shit with menuItems[] based rendering` render() { const { navigation, diff --git a/src/components/elements/SifirSlider.js b/src/components/elements/SifirSlider.js new file mode 100644 index 0000000..0008b78 --- /dev/null +++ b/src/components/elements/SifirSlider.js @@ -0,0 +1,55 @@ +import React, {Component} from 'react'; +import {View, StyleSheet} from 'react-native'; +import Slider from 'react-native-slider'; +import {Images, AppStyle, C} from '@common/index'; + +export default class SifirSlider extends Component { + state = {value: 20}; + render() { + return ( + + + this.setState({value})} + minimumValue={1} + maximumValue={90} + minimumTrackTintColor="#25b6fa" + maximumTrackTintColor="#412160" + thumbStyle={styles.thumb} + trackStyle={{ + height: 10, + borderRadius: 5, + }} + /> + + + ); + } +} + +const styles = StyleSheet.create({ + timeView: { + flex: 1, + marginTop: 15, + }, + clockImgView: { + justifyContent: 'center', + flexDirection: 'row', + }, + clockImg: {width: 25, height: 25}, + setFeeTxt: {fontSize: 18, marginLeft: 5}, + feeTxt: { + fontSize: 25, + marginVertical: 10, + marginHorizontal: 4, + }, + waitView: { + flexDirection: 'row', + width: '100%', + justifyContent: 'space-between', + }, +}); diff --git a/src/components/elements/SifirSwitch.js b/src/components/elements/SifirSwitch.js new file mode 100644 index 0000000..f45dc49 --- /dev/null +++ b/src/components/elements/SifirSwitch.js @@ -0,0 +1,59 @@ +import React from 'react'; +import {TouchableOpacity, View, Text, StyleSheet} from 'react-native'; + +const SifirSwitch = ({isActive, style, width, setSwitchOn}) => { + return ( + + setSwitchOn(!isActive)} + style={[ + styles.container, + { + ...(isActive ? styles.activeContainer : styles.inactiveContainer), + width: width, + borderRadius: 30, + }, + ]}> + + + + + + ); +}; + +SifirSwitch.defaultProps = { + width: 80, +}; + +export default SifirSwitch; + +const styles = StyleSheet.create({ + activeContainer: { + borderWidth: 1.32, + borderColor: 'rgba(83, 203, 200, 0.5)', + backgroundColor: 'rgba(83, 203, 200, 0.5)', + alignItems: 'flex-end', + }, + inactiveContainer: { + borderWidth: 1.32, + borderColor: '#74797B', + alignItems: 'flex-start', + }, +}); diff --git a/src/components/elements/SifirTransactionsTab.js b/src/components/elements/SifirTransactionsTab.js new file mode 100644 index 0000000..0f68f6d --- /dev/null +++ b/src/components/elements/SifirTransactionsTab.js @@ -0,0 +1,140 @@ +import React, {useState, useEffect, useMemo} from 'react'; +import { + View, + Text, + TouchableOpacity, + Image, + StyleSheet, + FlatList, +} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +const SifirTransactionsTab = props => { + const [showContextMenu, setShowContextMenu] = useState(false); + const {headerText, filterMap = [], txnData, renderItem} = props; + const [tabData, setTabData] = useState([]); + const [appliedFilter, setAppliedFilter] = useState(null); + const [filteredData, setFilteredData] = useState([]); + + // fetch data on init + useEffect(() => { + setTabData(txnData); + }, [txnData]); + // auto Filter on new data refresh + useEffect(() => { + if (!tabData?.length || !filterMap?.length) { + return; + } + const {cb, title} = filterMap.find( + ({title: mapFilterTitle}) => mapFilterTitle === appliedFilter, + ) || {cb: null, title: null}; + handleOnFilter({cb, title}); + }, [tabData]); + + const handleOnFilter = ({cb, title}) => { + setAppliedFilter(title); + // TODO + if (title === null) { + setFilteredData(tabData); + return; + } + const filterMapData = cb(tabData); + setFilteredData(filterMapData); + }; + const SifirFilteredTxns = useMemo( + () => ( + + item?.bolt11 + item?.txid + index + item.tx + } + renderItem={renderItem} + /> + ), + [filteredData], + ); + return ( + + {!!filterMap?.length && ( + + {/* TODO make this toucableopacity that resets filter*/} + + {headerText} - {appliedFilter || ''} + + setShowContextMenu(!showContextMenu)}> + + + + )} + {showContextMenu && ( + + {filterMap.map(({title, cb}, index) => ( + <> + handleOnFilter({cb, title})}> + {title} + + {index < filterMap.length - 1 ? ( + + ) : ( + [] + )} + + ))} + + )} + {SifirFilteredTxns} + + ); +}; + +const styles = StyleSheet.create({ + container: { + paddingHorizontal: 20, + }, + txnLblTxt: { + color: 'white', + fontSize: 20, + fontWeight: '700', + marginTop: 10, + }, + headerRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 10, + marginBottom: 10, + }, + filterPopupContainer: { + width: 165, + height: 165, + backgroundColor: 'white', + borderRadius: 10, + alignItems: 'stretch', + justifyContent: 'space-between', + right: 0, + position: 'absolute', + elevation: 10, + zIndex: 10, + top: 50, + }, + popupListItem: { + backgroundColor: 'white', + flex: 1, + padding: 25, + justifyContent: 'center', + borderRadius: 10, + }, + seperator: { + width: '90%', + height: 2, + backgroundColor: '#E0E0E0', + alignSelf: 'center', + }, + listItemLabel: { + fontWeight: 'bold', + }, +}); +export default SifirTransactionsTab; diff --git a/src/components/elements/SifirTxnList.js b/src/components/elements/SifirTxnList.js deleted file mode 100644 index 45fe0b9..0000000 --- a/src/components/elements/SifirTxnList.js +++ /dev/null @@ -1,183 +0,0 @@ -import React from 'react'; -import { - View, - Image, - Text, - StyleSheet, - TouchableOpacity, - FlatList, -} from 'react-native'; -import SifirBTCAmount from '@elements/SifirBTCAmount'; -import moment from 'moment'; -import {Images, AppStyle, C} from '@common/index'; -import {useMemo, useState} from 'react'; -const makeInvoiceRenderData = ({ - decodedBolt11, - meta: {description: desc, status}, -}) => { - let amount, imgURL, description, timeStr; - const {millisatoshis, timestamp} = decodedBolt11; - amount = millisatoshis; - description = desc; - switch (status) { - case 'unpaid': - imgURL = Images.icon_yellowTxn; - break; - case 'paid': - imgURL = Images.icon_thickGreenArrowTxn; - break; - } - timeStr = moment(timestamp * 1000).fromNow(); - return {amount, description, imgURL, timeStr}; -}; - -const makePaysRenderData = ({decodedBolt11, meta: {preimage}}) => { - let amount, imgURL, description, timeStr; - const {millisatoshis, complete, timestamp} = decodedBolt11; - if (complete) { - imgURL = Images.icon_send; - // FIXME strings to constants... - description = `Paid - ${preimage.slice(0, 3)} .. ${preimage.slice(-3)}`; - amount = millisatoshis; - timeStr = moment(timestamp * 1000).fromNow(); - } - return {amount, description, imgURL, timeStr}; -}; - -const makeTxnRenderData = ({category, txid, amount, timereceived}) => { - let imgURL, timeStr, txIDStr; - txIDStr = `${txid.slice(0, 3)} .. ${txid.slice(-3)}`; - if (category) { - switch (category) { - case 'send': - txIDStr = 'Sent - #' + txIDStr; - imgURL = Images.icon_send; - break; - case 'receive': - txIDStr = 'Received - #' + txIDStr; - imgURL = Images.icon_receive; - break; - default: - txIDStr = 'Unknown - #' + txIDStr; - imgURL = Images.icon_receive; - break; - } - } else { - txIDStr = 'Received - #' + txIDStr; - imgURL = Images.icon_receive; - } - timeStr = moment(timereceived * 1000).fromNow(); - return {imgURL, txIDStr, amount, timeStr}; -}; - -// FIXME this file is starting to get conjected , move these to elements -const SifirTxnEntry = ({txn, unit}) => { - const {imgURL, txIDStr, amount, timeStr} = makeTxnRenderData(txn); - return ( - - ); -}; - -const ListItem = ({title, description, imgURL, amount, unit}) => { - return ( - - - - - {title} - {description} - - - - - - - ); -}; -const SifirInvEntry = React.memo(({inv, unit}) => { - const {type} = inv; - try { - const {amount, imgURL, timeStr, description} = - type === 'invoice' ? makeInvoiceRenderData(inv) : makePaysRenderData(inv); - return ( - - ); - } catch (err) { - return null; - } -}); - -/** - * Takes equal slices of invoices and payments decodes them and sorts them - */ -const processLnTxnList = (txnData, start = 0, length = 20) => - [...(txnData?.invoices || []), ...(txnData?.pays || [])] - .filter(txn => txn && txn?.decodedBolt11?.timestamp > 1) - .sort((a, b) => b.decodedBolt11.timestamp - a.decodedBolt11.timestamp) - .slice(start, length); - -const SifirTxnList = ({width, height, unit, txnData, type}) => { - const [txnDataCached, setTxnDataCached] = useState([]); - // FIXME proper array compare - if (txnData.length !== txnDataCached.length) { - setTxnDataCached(txnData); - } - const txnListToRender = React.useMemo(() => { - if (type === C.STR_LN_WALLET_TYPE) { - return processLnTxnList(txnData, 0, 20); - } else { - return txnData; - } - }, [txnDataCached]); - return ( - item?.bolt11 + item?.txid + index} - renderItem={({item}) => { - if (type === C.STR_LN_WALLET_TYPE) { - return ; - } else { - return ; - } - }} - /> - ); -}; - -export default SifirTxnList; - -const styles = StyleSheet.create({ - listItme: { - flex: 1, - flexDirection: 'row', - width: '100%', - height: 50, - borderBottomColor: AppStyle.listViewSep, - borderBottomWidth: 2, - alignItems: 'center', - }, - txIDstr: { - color: AppStyle.mainColor, - fontWeight: 'bold', - }, - amount: { - flex: 2, - color: AppStyle.mainColor, - }, - arrowIcon: {width: 30, height: 30}, - timeStrContainer: {flex: 5, marginLeft: 20}, -}); diff --git a/src/components/elements/SifirWalletButton.js b/src/components/elements/SifirWalletButton.js index f4fc813..c95c6be 100644 --- a/src/components/elements/SifirWalletButton.js +++ b/src/components/elements/SifirWalletButton.js @@ -22,7 +22,6 @@ export default class SifirWalletButton extends Component { pageURL, } = this.props.walletInfo; const {isClicked} = this.state; - return ( { @@ -41,6 +40,7 @@ export default class SifirWalletButton extends Component { height={height}> { + return ( + + + + + {title} + {description} + + + + + + + ); +}; + +const styles = StyleSheet.create({ + listItme: { + flex: 1, + flexDirection: 'row', + width: '100%', + paddingVertical: 5, + // height: 50, + borderBottomColor: '#6B6B6B', + borderBottomWidth: 1, + alignItems: 'center', + }, + txIDstr: { + color: AppStyle.mainColor, + fontWeight: 'bold', + }, + amount: { + flex: 2, + color: AppStyle.mainColor, + textAlign: 'right', + }, + listIcon: {width: 40, height: 40}, + timeStrContainer: {flex: 5, marginLeft: 20}, +}); +export default BtcTxnListItem; diff --git a/src/components/elements/TxnListItems/SifirInvEntry.js b/src/components/elements/TxnListItems/SifirInvEntry.js new file mode 100644 index 0000000..4898cd4 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirInvEntry.js @@ -0,0 +1,63 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images} from '@common/index'; +import moment from 'moment'; + +const SifirInvEntry = ({inv, unit}) => { + const {type} = inv; + + const makePaysRenderData = ({decodedBolt11, meta: {preimage}}) => { + let amount, imgURL, description, timeStr; + const isSentTxn = true; + const {millisatoshis, complete, timestamp} = decodedBolt11; + if (complete) { + imgURL = Images.icon_send; + // FIXME strings to constants... + description = `Paid - ${preimage.slice(0, 3)} .. ${preimage.slice(-3)}`; + amount = millisatoshis; + timeStr = moment(timestamp * 1000).fromNow(); + } + return {amount, description, imgURL, timeStr, isSentTxn}; + }; + + const makeInvoiceRenderData = ({ + decodedBolt11, + meta: {description: desc, status}, + }) => { + let amount, imgURL, description, timeStr, isSentTxn; + const {millisatoshis, timestamp} = decodedBolt11; + amount = millisatoshis; + description = desc; + switch (status) { + case 'unpaid': + imgURL = Images.icon_yellowTxn; + isSentTxn = false; + break; + case 'paid': + imgURL = Images.icon_thickGreenArrowTxn; + isSentTxn = true; + break; + } + timeStr = moment(timestamp * 1000).fromNow(); + return {amount, description, imgURL, timeStr, isSentTxn}; + }; + + try { + const {amount, imgURL, timeStr, description, isSentTxn} = + type === 'invoice' ? makeInvoiceRenderData(inv) : makePaysRenderData(inv); + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirInvEntry; diff --git a/src/components/elements/TxnListItems/SifirTxnEntry.js b/src/components/elements/TxnListItems/SifirTxnEntry.js new file mode 100644 index 0000000..41e6d43 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirTxnEntry.js @@ -0,0 +1,46 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images} from '@common/index'; +import moment from 'moment'; + +const SifirTxnEntry = ({txn, unit}) => { + const makeTxnRenderData = ({category, txid, amount, timereceived}) => { + let imgURL, timeStr, txIDStr; + txIDStr = `${txid.slice(0, 3)} .. ${txid.slice(-3)}`; + if (category) { + switch (category) { + case 'send': + // TODO str to constants + txIDStr = 'Sent - #' + txIDStr; + imgURL = Images.icon_send; + break; + case 'receive': + txIDStr = 'Received - #' + txIDStr; + imgURL = Images.icon_receive; + break; + default: + txIDStr = 'Unknown - #' + txIDStr; + imgURL = Images.icon_receive; + break; + } + } else { + txIDStr = 'Received - #' + txIDStr; + imgURL = Images.icon_receive; + } + timeStr = moment(timereceived * 1000).fromNow(); + return {imgURL, txIDStr, amount, timeStr}; + }; + + const {imgURL, txIDStr, amount, timeStr} = makeTxnRenderData(txn); + return ( + + ); +}; + +export default SifirTxnEntry; diff --git a/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js b/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js new file mode 100644 index 0000000..3319fc5 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js @@ -0,0 +1,37 @@ +import React, {useState} from 'react'; +import UnspentCoinListItem from '@elements/TxnListItems/SifirUnspentCoinListItem'; +import {Images} from '@common/index'; + +const SifirUnspentCoinEntry = ({utxo, unit}) => { + try { + const { + amount, + address, + confirmed, + label, + anonymitySet, + txid, + anonsetLabel = 'AnonimitySet', + } = utxo; + // TODO add multiSelect list and use following icon + const imgURL = confirmed ? Images.icon_confirmed : Images.icon_unconfirmed; + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirUnspentCoinEntry; diff --git a/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js b/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js new file mode 100644 index 0000000..4586620 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js @@ -0,0 +1,81 @@ +import React from 'react'; +import {View, Text, TouchableOpacity, Image, StyleSheet} from 'react-native'; +import SifirBTCAmount from '@elements/SifirBTCAmount'; +import {Images, AppStyle, C} from '@common/index'; + +const UnspentCoinListItem = ({ + amount, + anonsetLabel = 'AnonimitySet', + anonSet, + label, + txid, + confirmed, + leftIcon, + rightIcon, + unit, +}) => { + return ( + + + + + + + + + + {' '} {anonsetLabel}: {anonSet} + + + {label} + + TX ID {txid} + + + + + + ); +}; + +const styles = StyleSheet.create({ + listItem: { + flex: 1, + flexDirection: 'row', + width: '100%', + paddingVertical: 5, + // height: 50, + borderBottomColor: '#6B6B6B', + borderBottomWidth: 1, + alignItems: 'center', + }, + listIcon: {width: 40, height: 40}, + timeStrContainer: {flex: 5, marginLeft: 20}, + annonSet: { + color: '#82C9C6', + fontWeight: 'bold', + fontSize: 13, + }, + unspentAmount: { + color: '#fff', + fontWeight: 'bold', + }, + label: { + color: '#fff', + fontSize: 13, + }, + txid: { + marginTop: 5, + color: AppStyle.mainColor, + }, + bold: {fontWeight: 'bold'}, +}); + +export default UnspentCoinListItem; diff --git a/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js b/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js new file mode 100644 index 0000000..903f24b --- /dev/null +++ b/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js @@ -0,0 +1,26 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images, C} from '@common/index'; +import moment from 'moment'; + +const SifirWasabiTxnEntry = ({txn, unit}) => { + try { + const {amount, datetime, label} = txn; + const imgURL = amount > 0 ? Images.icon_yellowTxn : Images.icon_send; + const isSentTxn = amount > 0 ? false : true; + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirWasabiTxnEntry; diff --git a/src/components/elements/deprecated/SifirAccountHistory.js b/src/components/elements/deprecated/SifirAccountHistory.js new file mode 100644 index 0000000..265eff3 --- /dev/null +++ b/src/components/elements/deprecated/SifirAccountHistory.js @@ -0,0 +1,198 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, {useCallback, useMemo, useState, useEffect} from 'react'; +import {View, Image, StyleSheet, Text, ActivityIndicator} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +import SifirTransactions from '@elements/SifirTransactions'; +import BottomSheet from 'reanimated-bottom-sheet'; +import {TabView, SceneMap, TabBar} from 'react-native-tab-view'; +import {ScrollView} from 'react-native-gesture-handler'; + +export const sheetHeight = C.SCREEN_HEIGHT - 150; +const initialSnap = C.SCREEN_HEIGHT * 0.35; +const initialLayout = {width: C.SCREEN_WIDTH}; + +const renderTabBar = props => ( + ( + + {label.route.title} + + )} + /> +); + +const SifirAccountHistory = ({ + loading, + loaded, + txnData, + btcUnit, + type, + headerText, + bottomExtraSpace, +}) => { + const [index, setIndex] = useState(0); + const [filteredTxns, setFilteredTxns] = useState(txnData); + const [routes] = useState([ + {key: 'transactions', title: 'Transactions'}, + {key: 'unspentCoins', title: 'Unspent Coins'}, + {key: 'labeledAddress', title: 'Labeled Addresses'}, + ]); + useEffect(() => { + setFilteredTxns(txnData); + }, [txnData]); + + const filterWasabiTxnData = filter => { + if (type === C.STR_WASABI_WALLET_TYPE && txnData?.transactions?.length) { + const tempTxnData = {...txnData}; + if (filter === 'received') { + const receivedTxns = tempTxnData.transactions.filter(txn => { + return txn.amount > 0; + }); + tempTxnData.transactions = receivedTxns; + setFilteredTxns(tempTxnData); + } else if (filter === 'sent') { + const sentTxns = tempTxnData.transactions.filter(txn => { + return txn.amount < 0; + }); + tempTxnData.transactions = sentTxns; + setFilteredTxns(tempTxnData); + } else { + setFilteredTxns(txnData); + } + } else { + setFilteredTxns(txnData); + } + }; + + const Transactions = useCallback(() => { + return ( + + + + ); + }, [txnData, filteredTxns]); + + const UnspentCoins = useCallback( + () => ( + + + + ), + [txnData], + ); + const LabeledAddresses = useCallback( + () => ( + + ), + [txnData], + ); + const renderScene = useMemo( + () => + SceneMap({ + transactions: Transactions, + unspentCoins: UnspentCoins, + labeledAddress: LabeledAddresses, + }), + [filteredTxns], + ); + return ( + 100 ? bottomExtraSpace - 20 : initialSnap, + ]} + initialSnap={1} + enabledInnerScrolling={true} + enabledGestureInteraction={true} + renderContent={() => ( + + + {!loading && ( + // TODO change upArrow to down arrow when slider is opened. + + )} + {loading && ( + + )} + + + + )} + /> + ); +}; + +const styles = StyleSheet.create({ + settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, + spinner: {alignSelf: 'center'}, + headerContainer: { + backgroundColor: '#122C3A', + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + justifyContent: 'center', + alignItems: 'center', + paddingTop: 10, + }, + tabTitleLabel: {fontWeight: 'bold'}, + sceneContainer: { + backgroundColor: AppStyle.tertiaryColor, + }, + tabIndicatorContainerStyle: { + borderBottomColor: AppStyle.grayColor, + borderBottomWidth: 3, + opacity: 0.5, + }, + tabIndicator: { + backgroundColor: AppStyle.mainColor, + bottom: -2, + }, + tabBar: { + backgroundColor: AppStyle.tertiaryColor, + }, +}); + +export default SifirAccountHistory; diff --git a/src/components/elements/deprecated/SifirTxnList.js b/src/components/elements/deprecated/SifirTxnList.js new file mode 100644 index 0000000..d801e59 --- /dev/null +++ b/src/components/elements/deprecated/SifirTxnList.js @@ -0,0 +1,33 @@ +/* @DEPRECATED + * contents moved to sifirtransacotins + * */ +import React, {useState} from 'react'; +import {StyleSheet, FlatList} from 'react-native'; + +// I think this gets moved one level up to SifirTransactions , onFilter can set the data it will render after each filter returns +const SifirTxnList = ({txnData, renderItem, processData}) => { + const [txnDataCached, setTxnDataCached] = useState([]); + // FIXME proper array compare + if (txnData.length !== txnDataCached.length) { + setTxnDataCached(txnData); + } + const txnListToRender = React.useMemo(() => { + return processData(txnData, 0, 20); + }, [txnDataCached]); + return ( + + item?.bolt11 + item?.txid + index + item.tx + } + renderItem={({item}) => { + return renderItem(item); + }} + /> + ); +}; + +export default SifirTxnList; + +const styles = StyleSheet.create({}); diff --git a/src/components/screens/auth/UnlockORGenKeys.js b/src/components/screens/auth/UnlockORGenKeys.js index e026ea6..4947dda 100644 --- a/src/components/screens/auth/UnlockORGenKeys.js +++ b/src/components/screens/auth/UnlockORGenKeys.js @@ -32,7 +32,7 @@ class UnlockORGenKeys extends Component { state = { scannedToken: this.props.route.params.scannedToken, encAuthInfo: this.props.route.params.encAuthInfo || null, - passphrase: '', + passphrase: 'oooooo', //TODO HAMZA reset before PR retryablePairingError: '', }; diff --git a/src/components/screens/wallet/SifirAccountScreen.js b/src/components/screens/wallet/SifirAccountScreen.js index 2556473..aefa712 100644 --- a/src/components/screens/wallet/SifirAccountScreen.js +++ b/src/components/screens/wallet/SifirAccountScreen.js @@ -1,201 +1,494 @@ -import React from 'react'; -import {View, Image, StyleSheet, TouchableOpacity, Text} from 'react-native'; +import React, {useState, useCallback, useEffect, useMemo} from 'react'; +import {useNavigation} from '@react-navigation/native'; +import { + View, + Image, + StyleSheet, + TouchableOpacity, + Text, + ScrollView, + Alert, +} from 'react-native'; import {connect} from 'react-redux'; import {Images, AppStyle, C} from '@common/index'; import {getWalletDetails} from '@actions/btcwallet'; import {getLnWalletDetails} from '@actions/lnWallet'; +import {getUnspentCoins, getTxns as wasabiGetTxns} from '@actions/wasabiWallet'; +import { + getWasabiAutoSpendWallet, + setWasabiAutoSpendWalletAndAnonset, + getWasabiAutoSpendMinAnonset, +} from '@actions/cnClient'; import SifirAccountHeader from '@elements/SifirAccountHeader'; +import SifirAccountChart from '@elements/SifirAccountChart'; import SifirAccountActions from '@elements/SifirAccountActions'; -import SifirAccountHistory from '@elements/SifirAccountHistory'; +import SifirAccountHistoryTabs, { + sheetHeight, +} from '@structures/SifirAccountHistoryTabs'; import SifirSettingModal from '@elements/SifirSettingModal'; import {ErrorScreen} from '@screens/error'; +import debounce from '../../../helpers/debounce'; -class SifirAccountScreen extends React.Component { - constructor(props, context) { - super(props, context); - } - state = { - balance: 0, - txnData: [], - isVisibleSettingsModal: false, - }; - stopLoading = null; +const SifirAccountScreen = props => { + const [balance, setBalance] = useState(0); + const [dataLoaded, setDataLoaded] = useState(null); + const [chartLoaded, setChartLoaded] = useState(true); + const [isVisibleSettingsModal, setIsVisibleSettingsModal] = useState(false); + const [anonset, setAnonset] = useState(0); + const [bottomExtraSpace, setBottomExtraSpace] = useState(sheetHeight); + const [showAccountHistory, setShowAccountHistory] = useState(false); + const navigation = useNavigation(); + const {walletInfo} = props.route.params; + const {navigate} = navigation; - async _loadWalletFromProps() { - const {label, type} = this.props.route.params.walletInfo; - if (type === C.STR_LN_WALLET_TYPE) { - const {balance, txnData} = await this.props.getLnWalletDetails({label}); - this.setState({balance, txnData}); - } else { - const {balance, txnData} = await this.props.getWalletDetails({ - label, - type, - }); - this.setState({balance, txnData}); + const _loadWalletFromProps = async () => { + setDataLoaded(null); + const {label, type} = walletInfo; + switch (type) { + case C.STR_LN_WALLET_TYPE: + let {balance: lnBalance} = await props.getLnWalletDetails({label}); + setBalance(lnBalance); + setDataLoaded({}); + setShowAccountHistory(true); + break; + case C.STR_SPEND_WALLET_TYPE: + case C.STR_WATCH_WALLET_TYPE: + let {balance: walletBalance} = await props.getWalletDetails({ + label, + type, + }); + setBalance(walletBalance); + setDataLoaded({}); + setShowAccountHistory(true); + break; + case C.STR_WASABI_WALLET_TYPE: + const [ + , + , + autoSpendWallet, + autoSpendWalletMinAnonset, + ] = await Promise.all([ + props.getUnspentCoins(), + props.wasabiGetTxns(), + props.getWasabiAutoSpendWallet(), + props.getWasabiAutoSpendMinAnonset(), + ]); + setDataLoaded({autoSpendWallet, autoSpendWalletMinAnonset}); + setShowAccountHistory(true); + //if (!state.showAccountHistory) { + // setTimeout(() => { + // setState({showAccountHistory: true}); + // }, 100); + //} + break; } - } + }; + useEffect(() => { + _loadWalletFromProps(); + }, []); - componentDidMount() { - const {_loadWalletFromProps} = this; - this.stopLoading = this.props.navigation.addListener( - 'focus', - _loadWalletFromProps.bind(this), - ); - } + const toggleSettingsModal = () => + setIsVisibleSettingsModal(!isVisibleSettingsModal); - componentWillUnmount() { - this.stopLoading(); - } - toggleSettingsModal() { - this.setState({isVisibleSettingsModal: !this.state.isVisibleSettingsModal}); - } - - handleReceiveButton = () => { - const {walletInfo} = this.props.route.params; - this.props.navigation.navigate('BtcReceiveTxn', {walletInfo}); + const handleReceiveButton = () => { + navigate('BtcReceiveTxn', {walletInfo}); }; - handleSendBtn = () => { - const {walletInfo} = this.props.route.params; + const handleSendBtn = () => { const {type} = walletInfo; - const {balance} = this.state; - if (type === C.STR_LN_WALLET_TYPE) { - this.props.navigation.navigate('LNPayInvoiceRoute', { - screen: 'LnScanBolt', - params: {walletInfo: {...walletInfo, balance}}, - }); - } else { - this.props.navigation.navigate('GetAddress', { - walletInfo: {...walletInfo, balance}, - }); + switch (type) { + case C.STR_LN_WALLET_TYPE: + navigate('LNPayInvoiceRoute', { + screen: 'LnScanBolt', + params: {walletInfo: {...walletInfo, balance}}, + }); + break; + case C.STR_WASABI_WALLET_TYPE: + navigate('GetAddress', { + walletInfo: {...walletInfo, balance, anonset}, + }); + break; + default: + navigate('GetAddress', { + walletInfo: {...walletInfo, balance}, + }); + break; } }; - render() { - const {balance, txnData} = this.state; - const {navigate} = this.props.navigation; - const {walletInfo} = this.props.route.params; - const {label, type} = walletInfo; - const {loading, loaded, error: errorBtc} = this.props.btcWallet; - const { - loading: loadingLN, - loaded: loadedLN, - error: errorLN, - } = this.props.lnWallet; - const btcUnit = type === C.STR_LN_WALLET_TYPE ? C.STR_MSAT : C.STR_BTC; - const isLoading = type === C.STR_LN_WALLET_TYPE ? loadingLN : loading; - const isLoaded = type === C.STR_LN_WALLET_TYPE ? loadedLN : loaded; - const hasError = type === C.STR_LN_WALLET_TYPE ? errorLN : errorBtc; - const {toggleSettingsModal} = this; - if (hasError) { - return ( - { + setAnonset(Math.floor(anonset)); + setBalance(value); + setChartLoaded(true); + }, 1), + [], + ); + const onExtraSpaceLayout = event => { + const {height} = event.nativeEvent.layout; + setBottomExtraSpace(height); + }; + + const {label, type} = walletInfo; + + // Account stuff that depends on data load, IE Function only changes on Walletinfo change but runs every update + // const walletDataCb = useCallback(() => { + const { + isLoading = true, + isLoaded = false, + hasError = null, + dataMap = [], + filterMap = [], + chartData = null, + settingModalProps = {}, + } = useMemo(() => { + if (!dataLoaded) { + return {}; + } + switch (type) { + case C.STR_LN_WALLET_TYPE: + return { + isLoading: props.lnWallet.loading, + isLoaded: props.lnWallet.loaded, + hasError: props.lnWallet.error, + settingModalProps: { + toolTipStyle: false, + showOpenChannel: true, + showTopUp: true, + showWithdraw: true, + }, + dataMap: [ { - text: C.STR_TRY_AGAIN, - onPress: () => this._loadWalletFromProps(), + key: C.STR_LN_WALLET_TYPE, + title: 'Invoices & Payments', + data: [ + ...(props.lnWallet?.invoices || []), + ...(props.lnWallet?.pays || []), + ] + .filter(txn => txn && txn?.decodedBolt11?.timestamp > 1) + .sort( + (a, b) => + b.decodedBolt11.timestamp - a.decodedBolt11.timestamp, + ), }, { - text: C.STR_GO_BACK, - onPress: () => navigate('AccountList'), + key: C.STR_UNSPENT_COINS, + title: 'Unspent Outputs', + data: (props.lnWallet?.outputs || []).map( + ({txid, value, address, status, blockheight}) => ({ + amount: value, + confirmed: status === 'confirmed', + label: address, + anonsetLabel: 'Block', + anonymitySet: blockheight, + txid, + }), + ), }, - ]} - /> - ); + ], + filterMap: [ + { + title: 'Invoices', + cb: (data, param) => data.filter(txn => txn.type === 'invoice'), + }, + { + title: 'Payments', + cb: (data, param) => data.filter(txn => txn.type === 'pay'), + }, + ], + }; + case C.STR_WASABI_WALLET_TYPE: + return { + isLoading: + props.cyphernode.loading || + (props.wasabiWallet.loading && !chartLoaded), + isLoaded: props.wasabiWallet.loaded && chartLoaded, + hasError: props.wasabiWallet.error, + chartData: props.wasabiWallet.unspentCoinsList?.unspentcoins?.length + ? props.wasabiWallet.unspentCoinsList.unspentcoins + : null, + settingModalProps: { + // isLoading: props.wasabiWallet.loading, + menuItems: [ + { + label: `Auto Send: ${ + dataLoaded?.autoSpendWallet + ? dataLoaded.autoSpendWallet + + '(' + + dataLoaded?.autoSpendWalletMinAnonset + + ')' + : 'Disabled' + }`, + onPress: () => { + toggleSettingsModal.apply(this); + navigate('WalletSelectMenu', { + onBackPress: async ({ + isSwitchOn, + selectedWallet, + anonSetValue, + }) => { + // if user toggled autospend off when it was on, then dispatch + if (!isSwitchOn && dataLoaded.autoSpendWallet) { + await props.setWasabiAutoSpendWalletAndAnonset({ + label: null, + }); + Alert.alert( + `Auto Send Disabled`, + `Auto spend has been disabled, coins will no longer be sent to your ${ + dataLoaded.autoSpendWallet + } wallet`, + ); + _loadWalletFromProps(); + } + navigation.pop(); + setIsVisibleSettingsModal(false); + }, + onConfirm: async ({ + selectedWallet, + anonset: autoSpendAnonset, + }) => { + await props.setWasabiAutoSpendWalletAndAnonset({ + label: selectedWallet.label, + anonset: autoSpendAnonset, + }); + _loadWalletFromProps(); + Alert.alert( + `Auto Send To Wallet: ${selectedWallet.label}`, + `Coins reaching An anonymity set of ${autoSpendAnonset} will be automagically sent to your wallet: ${ + selectedWallet.label + } - ${selectedWallet.desc}.`, + ); + navigation.pop(); + setIsVisibleSettingsModal(false); + }, + walletList: props.btcWallet.btcWalletList?.filter( + ({type: walletType}) => + walletType !== C.STR_WASABI_WALLET_TYPE, + ), + autoSpendWallet: dataLoaded?.autoSpendWallet, + autoSpendWalletMinAnonset: + dataLoaded?.autoSpendWalletMinAnonset, + }); + }, + }, + ], + }, + filterMap: [ + { + title: 'Recieved', + cb: (data, param) => data.filter(txn => txn.amount > 0), + }, + { + title: 'Sent', + cb: (data, param) => data.filter(txn => txn.amount < 0), + }, + ], + dataMap: [ + { + key: C.STR_WASABI_WALLET_TYPE, + title: 'Transactions', + // TODO can we make this an FN call rather than data ? So we can call it later + data: props.wasabiWallet.txnsList, + }, + { + key: C.STR_UNSPENT_COINS, + title: 'Unspent Coins', + data: props.wasabiWallet.unspentCoinsList?.unspentcoins, + }, + ], + }; + default: + return { + isLoading: props.btcWallet.loading, + isLoaded: props.btcWallet.loaded, + hasError: props.btcWallet.error, + filterMap: [ + { + title: 'Recieved', + cb: (data, param) => + data.filter(txn => { + return txn.amount > 0; + }), + }, + { + title: 'Sent', + cb: (data, parma) => + data.filter(txn => { + return txn.amount < 0; + }), + }, + ], + dataMap: [ + { + key: type, + title: 'Transactions', + data: props.btcWallet.txnData, + }, + ], + }; + } + }, [dataLoaded]); + // Aâccount data that is more static, IE values only need to be re-evaluated on walletInfo change + const { + accountIcon, + accountIconOnPress, + accountHeaderText, + accountTransactionHeaderText, + accountActionSendLabel = C.STR_SEND, + btcUnit, + } = useMemo(() => { + switch (type) { + case C.STR_LN_WALLET_TYPE: + return { + accountIcon: Images.icon_light, + accountIconOnPress: toggleSettingsModal.bind(this), + accountHeaderText: C.STR_Balance_Channels_n_Outputs, + accountTransactionHeaderText: C.STR_INVOICES_AND_PAYS, + btcUnit: C.STR_MSAT, + accountActionSendLabel: 'Pay Invoice', + }; + case C.STR_WASABI_WALLET_TYPE: + return { + accountIcon: Images.icon_wasabi, + accountIconOnPress: toggleSettingsModal.bind(this), + accountHeaderText: C.STR_Wasabi_Header + anonset, + accountTransactionHeaderText: C.STR_ALL_TRANSACTIONS, + btcUnit: C.STR_SAT, + // only show chart when more than one unspentcoin + }; + default: + return { + accountHeaderText: C.STR_Cur_Balance, + accountIcon: Images.icon_bitcoin, + accountIconOnPress: () => {}, + accountTransactionHeaderText: C.STR_TRANSACTIONS, + btcUnit: C.STR_BTC, + }; } + }, [walletInfo, anonset]); + if (hasError) { return ( - - - + _loadWalletFromProps(), + }, + { + text: C.STR_GO_BACK, + onPress: () => navigate('AccountList'), + }, + ]} + /> + ); + } + return ( + + + + + + navigate('AccountList')}> + + {C.STR_My_Wallets} + + + + {isVisibleSettingsModal && ( navigate('AccountList')}> - - {C.STR_My_Wallets} + style={styles.settingMenuContainer} + onTouchEnd={toggleSettingsModal}> + - - - {this.state.isVisibleSettingsModal && ( - - + {!!chartData && ( + - + )} + + + {/* TODO fix this hack to Calculate initial snap position to HistoryTabs - Load it when nochartdata or when chart and is loaded */} + {(!chartData || (!!chartData && chartLoaded)) && ( + )} - {} - } - loading={isLoading} - loaded={isLoaded} - type={type} - label={label} - balance={balance} - btcUnit={btcUnit} - headerText={ - type === C.STR_LN_WALLET_TYPE - ? C.STR_Balance_Channels_n_Outputs - : C.STR_Cur_Balance - } - /> - - + {showAccountHistory && ( + - - ); - } -} + )} + + ); +}; const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, + cyphernode: state.cyphernode, }; }; const mapDispatchToProps = { getWalletDetails, getLnWalletDetails, + getUnspentCoins, + wasabiGetTxns, + getWasabiAutoSpendWallet, + getWasabiAutoSpendMinAnonset, + setWasabiAutoSpendWalletAndAnonset, }; export default connect( @@ -204,11 +497,21 @@ export default connect( )(SifirAccountScreen); const styles = StyleSheet.create({ - navBtn: {flex: 0.7}, + navBtn: { + marginBottom: 10, + }, + extraSpace: { + flexGrow: 1, + }, + SVcontainer: { + backgroundColor: AppStyle.backgroundColor, + flexGrow: 1, + }, mainView: { flex: 1, - backgroundColor: AppStyle.backgroundColor, + backgroundColor: '#091110', paddingTop: 10, + justifyContent: 'space-between', }, backNavView: { display: 'flex', diff --git a/src/components/screens/wallet/SifirAccountsListScreen.js b/src/components/screens/wallet/SifirAccountsListScreen.js index dfb2d7d..e94ee2d 100644 --- a/src/components/screens/wallet/SifirAccountsListScreen.js +++ b/src/components/screens/wallet/SifirAccountsListScreen.js @@ -11,6 +11,7 @@ import {connect} from 'react-redux'; import SifirWalletButton from '@elements/SifirWalletButton'; import {getBtcWalletList, getBlockChainInfo} from '@actions/btcwallet'; import {getLnNodesList} from '@actions/lnWallet'; +import {getConfigProps} from '@actions/cnClient'; import {Images, AppStyle, C} from '@common/index'; import {ErrorScreen} from '@screens/error'; import SifirSettingModal from '@elements/SifirSettingModal'; @@ -26,6 +27,8 @@ class SifirAccountsListScreen extends React.Component { _init = () => { this.props.getBtcWalletList(); this.props.getLnNodesList(); + // TODO walletlists should be a config prop when settings are moved there + this.props.getConfigProps(); }; componentDidMount() { @@ -211,6 +214,7 @@ const mapDispatchToProps = { getBtcWalletList, getLnNodesList, getBlockChainInfo, + getConfigProps, }; export default connect( diff --git a/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js b/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js index cc7af33..f8705fb 100644 --- a/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js +++ b/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js @@ -1,4 +1,4 @@ -import React, {Component} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import { View, Image, @@ -7,6 +7,8 @@ import { Text, FlatList, ActivityIndicator, + TextInput, + Clipboard, } from 'react-native'; import {connect} from 'react-redux'; import Overlay from 'react-native-modal-overlay'; @@ -14,332 +16,457 @@ import SifirQRCode from '@elements/SifirQRCode'; import Share from 'react-native-share'; import {getWalletAddress} from '@actions/btcwallet'; -import {getNewAddress} from '@actions/lnWallet'; +import {getNewAddress as getNewLnAddress} from '@actions/lnWallet'; +import {getNewAddress as getNewWasabiAddress} from '@actions/wasabiWallet'; import {Images, AppStyle, C} from '@common/index'; import {log} from '@io/events/'; import {ErrorScreen} from '@screens/error'; +const SifirBtcReceiveTxnScreen = props => { + const {label, type, meta: cfg} = props.route.params.walletInfo; + const spendingAddressTypes = [ + {title: C.STR_LEGACY, value: 'legacy'}, + {title: C.STR_Segwit_Compatible, value: 'p2sh-segwit'}, + {title: C.STR_Bech32, value: 'bech32'}, + ]; + // const [getBtnStatus, setBtnStatus] = useState(0); + const [enableLabelInput, setEnableLabelInput] = useState( + cfg?.enableAddressLabelInput || false, + ); + const [enableAddressTypeSelection, setEnableAddressTypeSelection] = useState( + cfg?.enableAddressTypeSelection || false, + ); + const [enableAddressWatchSelection, setAddressWatchSelection] = useState( + false, + ); + const [showAddressTypeSelector, setShowAddressTypeSelector] = useState( + cfg?.showAddressTypeSelector || false, + ); + const [showQRCode, setShowQRCode] = useState(true); + const [addAddressToWatch, setAddAddressToWatch] = useState(false); + const [showShareSelector, setShowShareSelector] = useState(false); + const [addrType, setAddrType] = useState(null); + const [labelInput, setLabelInput] = useState(''); + const [labelInputDone, setLabelInputDone] = useState(false); + const [address, setAddress] = useState(''); + const [loading, setLoading] = useState(false); + const [loaded, setLoaded] = useState(false); + const [error, setError] = useState(null); + const [qrCodeURI, setQrCodeURI] = useState(null); + const [refresh, setRefresh] = useState(0); + const [addressMessage, setAddressMessage] = useState(null); + const prevRefreshValue = useRef(); -class SifirBtcReceiveTxnScreen extends Component { - constructor(props) { - super(props); - this.qrCode = ''; - } - - state = { - btnStatus: 0, - modalVisible: false, - checkStatus: true, - addrType: C.STR_SELECT_ADDRTYPE, - showQRCode: false, - showSelector: false, - enableWatchSelection: false, - }; - - async _bootStrap() { - const {label, type} = this.props.route.params.walletInfo; - if (type === C.STR_WATCH_WALLET_TYPE) { - await this.props.getWalletAddress({label, type}); - this.setState({showQRCode: true}); - } else if (type === C.STR_LN_WALLET_TYPE) { - await this.props.getNewAddress(); - this.setState({showQRCode: true}); + useEffect(() => { + loadWalletAddress(); + }, []); + // }, [labelInputDone, addrType]); + // load new address + useEffect(() => { + let loadNew = false; + if (refresh > 0 && refresh > prevRefreshValue.current) { + loadNew = true; } - } - componentDidMount() { - this._bootStrap(); - } + loadWalletAddress({loadNew}); + prevRefreshValue.current = refresh; + }, [refresh]); - onClose = () => this.setState({modalVisible: false, showSelector: false}); + const onClose = () => { + setShowAddressTypeSelector(false); + setShowShareSelector(false); + }; - onShare = (address, isQRCode) => { - this.setState({showSelector: false}); - if (this.qrCode) { + const onShare = (sharedAddress, isQRCode) => { + setShowShareSelector(false); + if (qrCodeURI) { let shareOptions; if (isQRCode) { shareOptions = { - type: 'image/jpg', + type: 'image/png', title: C.STR_ADDR_QR_SHARE, - url: this.qrCode, + url: qrCodeURI, }; } else { shareOptions = { title: C.STR_ADDR_SHARE, - message: address, + message: sharedAddress, }; } Share.open(shareOptions).catch(err => log(err)); } }; - getSpendWalletAddr = async addrType => { - const {label, type} = this.props.route.params.walletInfo; - await this.props.getWalletAddress({label, type, addrType}); - this.setState({showQRCode: true}); + const handleBackBtn = () => { + props.navigation.goBack(); }; - - handleBackBtn = () => { - const {walletInfo} = this.props.route.params; - const {type} = walletInfo; - const {navigation} = this.props; - // if (type === C.STR_WATCH_WALLET_TYPE) { - // navigation.navigate('Account', {walletInfo}); - // } else { - navigation.goBack(); - // } + const inputLabel = input => { + setLabelInput(input); + setLabelInputDone(false); }; - - render() { - const {walletInfo} = this.props.route.params; - const {label, type} = walletInfo; - const {showQRCode, enableWatchSelection} = this.state; - let loaded, loading, address, error; - if (type === C.STR_LN_WALLET_TYPE) { - ({loaded, loading, address, error} = this.props.lnWallet); - } else { - ({loaded, loading, address, error} = this.props.btcWallet); + const loadWalletAddress = async ({loadNew = false} = {}) => { + let hasAllReqs = true; + // Check if we're ready based on reqs + if (enableAddressTypeSelection) { + hasAllReqs = + hasAllReqs && + addrType && + addrType?.value?.length && + addrType.value !== C.STR_SELECT_ADDRTYPE; } - if (error) { - return ( - this._bootStrap(), - }, - { - text: C.GO_BACK, - onPress: () => this.navigation.navigate('Account', {label, type}), - }, - ]} - /> - ); + if (enableLabelInput) { + hasAllReqs = hasAllReqs && labelInput?.length && labelInputDone; } + if (hasAllReqs !== true) { + return; + } + if (!!address?.length && !loadNew) { + return; + } + let walletAddress; + let addressError; + setLoading(true); + switch (type) { + case C.STR_LN_WALLET_TYPE: + walletAddress = props.getNewLnAddress(); + addressError = props.lnWallet.error; + break; + case C.STR_WASABI_WALLET_TYPE: + walletAddress = props + .getNewWasabiAddress({ + label: labelInput, + }) + .then(({address}) => address); + addressError = props.wasabiWallet.error; + break; + default: + walletAddress = props.getWalletAddress({ + label, + type, + addrType: addrType?.value, + }); + addressError = props.btcWallet.error; + break; + } + const addressText = await walletAddress; + log('assa', addressText, addressError); + if (addressText?.length) { + setAddress(addressText); + setLoaded(true); + } else { + setError(addressError); + setLoaded(false); + } + setLoading(false); + }; + if (error) { return ( - - - this.handleBackBtn()}> - - - - {label} Wallet - - - - - - - - {type === C.STR_SPEND_WALLET_TYPE && ( - - this.setState({modalVisible: true})}> - - {this.state.addrType} - - - - { - this.setState({modalVisible: !this.state.modalVisible}); - }}> - - - - - + setError(null), + }, + { + text: C.STR_GO_BACK, + onPress: () => props.navigation.navigate('Account', {label, type}), + }, + ]} + /> + ); + } + return ( + + + handleBackBtn()}> + + + + {label} Wallet - )} - - {address !== null && loaded === true && showQRCode === true && ( - <> - - { - this.qrCode = base64; - }} - value={address} - size={C.SCREEN_HEIGHT * 0.25} - bgColor="#FFFFFF" - fgColor="#000000" + + + + + + {!loading && enableLabelInput === true && ( + <> + {!labelInputDone && ( + + inputLabel(input)} /> - {address} - - )} - - {loading === true && ( - - - - )} - - {address != null && loaded === true && ( - <> - {enableWatchSelection === true && ( - - {C.STR_WATCH_ADDR} - - this.setState({checkStatus: !this.state.checkStatus}) - }> - - - {this.state.checkStatus === true && ( - - )} - - - - )} + )} + {!labelInputDone && ( { - this.setState({showSelector: true}); + if (labelInputDone) { + setAddress(null); + setLabelInput(''); + setLabelInputDone(false); + } else { + setLabelInputDone(true); + setRefresh(refresh + 1); + } }} - style={styles.shareBtnOpa}> + style={styles.labelButtonCTA}> - {C.STR_SHARE} - + + {labelInputDone ? 'Generate another' : 'Save and Generate'} + - - )} + )} + + )} + {enableAddressTypeSelection === true && ( + + setShowAddressTypeSelector(true)}> + + {addrType?.title || C.STR_SELECT_ADDRTYPE} + + + + { + setShowAddressTypeSelector(!showAddressTypeSelector); + }}> + + + + + + + )} + {loading === true && ( + + + + )} - {/* Select share type */} - - {() => ( + {!loading && !!address && showQRCode && ( + <> + + + + { + await Clipboard.setString(address); + setAddressMessage('Address Copied to Clipboard!'); + setTimeout(() => setAddressMessage(null), 1500); + }} + onLongPress={() => setRefresh(refresh + 1)}> + {address} + + {addressMessage?.length && ( - - - { - this.onShare(address, true); - }}> - - {C.STR_ADDR_QR_SHARE} - - - { - this.onShare(address, false); - }}> - - {C.STR_ADDR_SHARE} - - - - - - + {addressMessage} + + )} + {labelInputDone && ( + <> + + {`Label: ${labelInput}`} + { + setAddress(null); + setLabelInput(''); + setLabelInputDone(false); + }}> + + )} + + )} + {!loading && !!address && ( + <> + {enableAddressWatchSelection === true && ( + + {C.STR_WATCH_ADDR} + setAddAddressToWatch(!addAddressToWatch)}> + + + {addAddressToWatch === true && ( + + )} + + )} - - - {/* Select the Address type in the Spending Wallet */} - - {hideModal => ( - item.title} - renderItem={({item}) => ( + { + setShowShareSelector(true); + }} + style={styles.shareBtnOpa}> + + {C.STR_SHARE} + + + + + )} + {/* Select share type */} + + {() => ( + + + { - this.setState({addrType: item.title}); - this.getSpendWalletAddr(item.addrType); - hideModal(); + onShare(address, true); }}> - {item.title} + + {C.STR_ADDR_QR_SHARE} + - )} - /> - )} - - - ); - } -} + { + onShare(address, false); + }}> + + {C.STR_ADDR_SHARE} + + + + + + + + + + + )} + + + {/* Select the Address type in the Spending Wallet */} + + {hideModal => ( + item.value} + renderItem={({item}) => ( + { + setAddrType(item); + setRefresh(refresh + 1); + hideModal(); + }}> + {item.title} + + )} + /> + )} + + + ); +}; const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, }; }; -const mapDispatchToProps = {getWalletAddress, getNewAddress}; +const mapDispatchToProps = { + getWalletAddress, + getNewLnAddress, + getNewWasabiAddress, +}; export default connect( mapStateToProps, @@ -397,6 +524,25 @@ const styles = StyleSheet.create({ marginTop: 4 * C.vh, justifyContent: 'space-between', }, + inputView: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 10, + marginBottom: 10, + width: C.SCREEN_WIDTH * 0.8, + height: 70, + borderRadius: 10, + borderColor: AppStyle.mainColor, + borderWidth: 2, + }, + inputTxtStyle: { + flex: 1, + marginLeft: 10, + color: 'white', + textAlign: 'left', + alignItems: 'flex-start', + justifyContent: 'flex-start', + }, selectBtnView: { flexDirection: 'row', marginRight: 15, @@ -474,6 +620,10 @@ const styles = StyleSheet.create({ width: 27 * C.vh, backgroundColor: 'white', }, + labelButtonCTA: { + marginTop: C.vh, + alignItems: 'center', + }, shareBtnOpa: { marginTop: 2 * C.vh, alignItems: 'center', @@ -496,8 +646,51 @@ const styles = StyleSheet.create({ marginTop: 40 * C.vh, backgroundColor: 'transparent', }, + addMsgTxt: { + fontFamily: AppStyle.mainFont, + fontSize: 12, + marginTop: 5, + color: AppStyle.grayColor, + }, addrTxt: { + fontFamily: AppStyle.mainFontBold, fontSize: 16, + marginTop: 10, + color: AppStyle.mainColor, + }, + /* Label input */ + inputWrapperDone: { + flexDirection: 'row', + borderColor: AppStyle.mainColor, + borderRadius: 0, + borderWidth: 0, + padding: 10, + alignItems: 'center', + justifyContent: 'center', + overflow: 'visible', + }, + inputWrapper: { + flexDirection: 'row', + borderColor: AppStyle.mainColor, + borderRadius: 10, + borderWidth: 1, + padding: 10, + alignItems: 'center', + justifyContent: 'center', + overflow: 'visible', + }, + input: { + width: '70%', color: 'white', + // height: Platform.OS === 'android' ? u30 : 25, + fontSize: 16, + }, + space_around: { + flexDirection: 'row', + flex: 1, + justifyContent: 'space-around', + marginLeft: 10, + marginTop: 10, }, + burger_icon: {width: 25, height: 20}, }); diff --git a/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js b/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js index 2562426..c0dd8be 100644 --- a/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js +++ b/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js @@ -12,6 +12,7 @@ import { import {Images, AppStyle, C} from '@common/index'; import {sendBitcoin} from '@actions/btcwallet'; import {withdrawFunds} from '@actions/lnWallet'; +import {spend as wasabiSpend} from '@actions/wasabiWallet'; import Overlay from 'react-native-modal-overlay'; import SifirSettingModal from '@elements/SifirSettingModal'; import {ErrorScreen} from '@screens/error'; @@ -34,8 +35,8 @@ class SifirBtcSendTxnConfirmScreen extends Component { walletInfo: {type}, } = this.props.route.params; const {address, amount} = txnInfo; - const withdrawDetails = await this.props.withdrawFunds(address, amount); - if (withdrawDetails?.tx) { + const sendResult = await this.props.withdrawFunds(address, amount); + if (sendResult?.tx) { this.props.navigation.navigate('BtcTxnConfirmed', { txnInfo: { ...txnInfo, @@ -43,6 +44,7 @@ class SifirBtcSendTxnConfirmScreen extends Component { amount, address, }, + sendResult, walletInfo, displayUnit: C.STR_MSAT, type, @@ -53,21 +55,47 @@ class SifirBtcSendTxnConfirmScreen extends Component { sendBitcoin = async () => { const {txnInfo, walletInfo} = this.props.route.params; const {address, amount} = txnInfo; - await this.props.sendBitcoin({address, amount}); - this.props.navigation.navigate('BtcTxnConfirmed', { - txnInfo: {...txnInfo, isSendTxn: true}, - walletInfo, + const btcSendResult = await this.props.sendBitcoin({address, amount}); + if (btcSendResult?.status === 'accepted') { + this.props.navigation.navigate('BtcTxnConfirmed', { + txnInfo: {...txnInfo, isSendTxn: true}, + sendResult: btcSendResult, + walletInfo, + }); + } + }; + sendWasabi = async () => { + const {txnInfo, walletInfo, anonset} = this.props.route.params; + const {address, amount} = txnInfo; + const sendResult = await this.props.wasabiSpend({ + address, + amount, + minanonset: anonset, }); + if (sendResult?.result?.txid) { + this.props.navigation.navigate('BtcTxnConfirmed', { + txnInfo: {...txnInfo, isSendTxn: true}, + sendResult, + walletInfo, + }); + } }; handleSendBtn = () => { const { walletInfo: {type}, } = this.props.route.params; - if (type === C.STR_LN_WITHDRAW) { - this.withdrawFunds(); - } else { - this.sendBitcoin(); + switch (type) { + case C.STR_LN_WITHDRAW: + this.withdrawFunds(); + break; + case C.STR_WASABI_WALLET_TYPE: + this.sendWasabi(); + break; + + default: + this.sendBitcoin(); + break; } }; @@ -79,15 +107,25 @@ class SifirBtcSendTxnConfirmScreen extends Component { const amountFontSize = (C.vw * 80) / (amount.length < 3 ? 5 : amount.length); const recTxtFontSize = (C.vw * 120) / address.length; - const {loading: btcLoading, error: btcError} = this.props.lnWallet; - const {loading: lnLoading, error: lnError} = this.props.btcWallet; + let isLoading, hasError; + switch (type) { + case C.STR_LN_WITHDRAW: + ({loading: isLoading, error: hasError} = this.props.lnWallet); + break; + case C.STR_WASABI_WALLET_TYPE: + ({loading: isLoading, error: hasError} = this.props.wasabiWallet); + break; + default: + ({loading: isLoading, error: hasError} = this.props.btcWallet); + break; + } - if (btcError || lnError) { + if (hasError) { return ( [4 Hour Wait] )} - {(btcLoading || lnLoading) && } + {isLoading && } @@ -167,10 +206,11 @@ const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, }; }; -const mapDispatchToProps = {sendBitcoin, withdrawFunds}; +const mapDispatchToProps = {sendBitcoin, withdrawFunds, wasabiSpend}; export default connect( mapStateToProps, diff --git a/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js b/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js index a6982ac..e6c97f1 100644 --- a/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js +++ b/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js @@ -57,9 +57,20 @@ export default class SifirBtcSendTxnInputAmountScreen extends Component { const {validAmount} = this.state; const { txnInfo: {address}, - walletInfo: {balance, type}, + walletInfo: {balance, type, anonset}, } = this.props.route.params; - const unit = type === C.STR_LN_WITHDRAW ? C.STR_SAT : C.STR_BTC; + let unit; + switch (type) { + case C.STR_LN_WITHDRAW: + unit = C.STR_SAT; + break; + case C.STR_WASABI_WALLET_TYPE: + unit = C.STR_SAT; + break; + default: + unit = C.STR_BTC; + break; + } return ( @@ -69,7 +80,9 @@ export default class SifirBtcSendTxnInputAmountScreen extends Component { {address} {C.STR_PAYMENT_AMOUNT} - {`${C.STR_Wallet_balance}: `} + {anonset + ? `${C.STR_Wasabi_Header} ${anonset} : ` + : `${C.STR_Wallet_balance}: `} diff --git a/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js b/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js index 498cdc3..7377f6e 100644 --- a/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js +++ b/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js @@ -25,21 +25,19 @@ class SifirBtcTxnConfirmedScreen extends Component { render() { const {type} = this.props.route.params; const addrTxtFontSize = (C.vw * 250) / address?.length || 25; - const {amount, address, isSendTxn, unit} = this.props.route.params.txnInfo; - const payTitleText = - type === C.STR_LN_WALLET_TYPE - ? C.STR_PAID - : isSendTxn - ? C.STR_SENT - : C.STR_RECEIVED; - const payDataTitleText = `${C.STR_PAYMENT} ${ - type === C.STR_LN_WALLET_TYPE - ? C.STR_PRE_IMAGE - : isSendTxn - ? C.STR_RECEIPIENT - : C.STR_SENDER - }`; + let payTitleText, payDataTitleText; + switch (type) { + case C.STR_LN_WALLET_TYPE: + payTitleText = C.STR_PAID; + payDataTitleText = `${C.STR_PAYMENT} ${C.STR_PRE_IMAGE}`; + break; + default: + payTitleText = isSendTxn ? C.STR_SENT : C.STR_RECEIVED; + payDataTitleText = `${C.STR_PAYMENT} ${ + isSendTxn ? C.STR_RECEIPIENT : C.STR_SENDER + }`; + } return ( diff --git a/src/components/screens/wallet/SifirGetAddrScreen.js b/src/components/screens/wallet/SifirGetAddrScreen.js index 2cbea13..1a244a3 100644 --- a/src/components/screens/wallet/SifirGetAddrScreen.js +++ b/src/components/screens/wallet/SifirGetAddrScreen.js @@ -38,8 +38,11 @@ class SifirGetAddrScreen extends Component { scannedQRdata: data, showModal: false, }, + // FIXME this nonsense can be replaced by useEffect on scannedQrData + // Also removes need for handle continue button repeat of code, just sett the qrdata + // () => { - if (type === C.STR_LN_WITHDRAW) { + if (type !== C.STR_LN_WALLET_TYPE) { this.handleAddressScanned(); } else { this.handleBoltScanned(); @@ -113,7 +116,7 @@ class SifirGetAddrScreen extends Component { const {showModal, scannedQRdata} = this.state; const {loading, error} = this.props.lnWallet; const { - walletInfo: {type, label}, + walletInfo: {type, label, backIcon}, } = this.props.route.params; const placeHolder = type === C.STR_LN_WALLET_TYPE ? C.STR_Enter_bolt : C.STR_Enter_addr; @@ -139,14 +142,7 @@ class SifirGetAddrScreen extends Component { style={styles.backNavView} onPress={() => this.handleBackButton()}> - + {label} diff --git a/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js b/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js new file mode 100644 index 0000000..fd9d9d6 --- /dev/null +++ b/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js @@ -0,0 +1,357 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useCallback, useMemo, useState, useEffect} from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + StatusBar, + Image, + Animated, + ActivityIndicator, +} from 'react-native'; +import SifirAutoSpendHeader from '@elements/SifirHeaders/SifirAutoSpendHeader'; +import SifirAnonimitySlider from '@elements/SifirAnonimitySlider'; +import {AppStyle, C, Images} from '@common'; +import SifirCard from '@elements/SifirCard'; +import SifirAnimatedOverlay from '@elements/SifirAnimatedOverlay'; +import {ScrollView} from 'react-native-gesture-handler'; +import Androw from 'react-native-androw'; +import {scaleLinear} from 'd3-scale'; +import {log, error} from '@io/events'; +import * as path from 'svg-path-properties'; +import * as shape from 'd3-shape'; +import SifirAutoSpendWalletCard from '@elements/SifirAutoSpendWalletCard'; +import {useSelector} from 'react-redux'; + +const d3 = { + shape, +}; + +const slider = React.createRef(); +const label = React.createRef(); +const SV = React.createRef(); +const x = new Animated.Value(0); +const width = C.SCREEN_WIDTH - 20; +const cursor = React.createRef(); + +const SifirWasabiAutoSpendScreen = props => { + const [isSwitchOn, setSwitchOn] = useState(null); + const [headerHeight, setHeaderHeight] = useState(0); + const [selectedWallet, setSelectedWallet] = useState(null); + const [listItemPositions, setListItemPositions] = useState({}); + const [listContainerPosition, setListContainerPosition] = useState(0); + const [topTextPosition, setTopTextPosition] = useState(0); + const [SVoffset, setSVoffset] = useState(0); + const {minX = 2, maxX = 120} = props; + // FIXME this is an antipattern, isLoading should be purely ppassed here but because of memo in AccounScreen we use this hack. Fix this on next iteration. + const defaultLoading = useSelector(({cyphernode}) => cyphernode.loading); + + const { + onBackPress, + onConfirm, + walletList, + autoSpendWalletMinAnonset, + autoSpendWallet, + isLoading = defaultLoading, + } = props.route.params; + useEffect(() => { + StatusBar.setBackgroundColor(AppStyle.backgroundColor); + const autoSpendWalletObj = walletList.find( + ({label: l}) => l === autoSpendWallet, + ); + if (!autoSpendWalletObj) { + error('Selected auto spend wallet is not part of walletList ignoring'); + return; + } + setSelectedWallet({ + ...autoSpendWalletObj, + annonset: autoSpendWalletMinAnonset, + }); + setSwitchOn(true); + }, []); + + useEffect(() => { + if (selectedWallet?.label) { + _init(); + } + }, [selectedWallet]); + + const handleSwitch = value => { + if (!value) { + setSelectedWallet(null); + } + setSwitchOn(value); + }; + + const onLayoutListItem = (event, itemLabel) => { + const {width: itemWidth, height, x: itemX, y} = event.nativeEvent.layout; + // atomic setState + setListItemPositions(prevState => ({ + ...prevState, + [itemLabel]: {width: itemWidth, height, x: itemX, y}, + })); + }; + + const {scaleX, properties, lineLength} = useMemo(() => { + const scaleX = scaleLinear() + .domain([minX, maxX]) + .range([20, width - 20]); + const line = d3.shape + .line() + .x(anonset => scaleX(Number(anonset))) + .y(() => 0) + .curve(d3.shape.curveStepBefore)([minX, maxX]); + const p = path.svgPathProperties(line); + return { + scaleX, + properties: p, + lineLength: p.getTotalLength(), + }; + }, [minX, maxX]); + + const _init = () => { + try { + x.addListener(({value}) => moveCursor(value)); + let {x: X} = properties.getPointAtLength(lineLength); + let left = X - 10; + cursor?.current?.setNativeProps({ + left, + }); + slider?.current.setNativeProps({ + left: left - 10, + }); + // TODO intial cursor position to match passed min anon + moveCursor(lineLength / 2); + } catch (err) { + error(err); + } + }; + let anonSetValue; + + const moveCursor = value => { + let {x} = properties.getPointAtLength(lineLength - value); + let left = x - +10; + cursor?.current?.setNativeProps({ + left, + }); + slider?.current.setNativeProps({ + left: left - 10, + }); + anonSetValue = Math.floor(scaleX.invert(x)); + const text = `${anonSetValue}`; + label?.current?.setNativeProps({ + text, + left: left + 3.5, + }); + // setAnonset(anonSetValue); + }; + + const WalletList = useMemo( + () => + walletList.map(item => { + return ( + + ); + }), + [walletList, selectedWallet], + ); + + const WalletAnonSlider = useMemo(() => { + return ( + + + + + + {isLoading && ( + + )} + {!isLoading && ( + + onConfirm({selectedWallet, anonset: anonSetValue}) + }> + {C.STR_CONFIRM} + + )} + + + ); + }, [minX, maxX, selectedWallet, label, isLoading]); + + const DarkOverLay = useMemo( + () => ( + setSelectedWallet({}) : undefined + } + effectDeps={[isSwitchOn, selectedWallet]} + /> + ), + [headerHeight, selectedWallet, isSwitchOn], + ); + return ( + + setHeaderHeight(event.nativeEvent.layout.height)}> + { + onBackPress({isSwitchOn, selectedWallet, anonSetValue}); + }} + headerText={'Auto Send'} + isSwitchOn={isSwitchOn} + setSwitchOn={handleSwitch} + showOverlay={!isSwitchOn || selectedWallet?.label} + /> + + setTopTextPosition(event.nativeEvent.layout.y)}> + {C.STR_Select_Account} + + + setSVoffset(event.nativeEvent.contentOffset.y)} + onLayout={event => + setListContainerPosition(event.nativeEvent.layout.y) + }> + {WalletList} + + {(!isSwitchOn || selectedWallet?.label) && DarkOverLay} + {/* TODO this should reus SifirAutoSpendCard */} + {selectedWallet?.label && listItemPositions[selectedWallet.label] && ( + + + {`${selectedWallet?.label} ${ + selectedWallet.desc + }`} + + {selectedWallet?.annonset} + {C.STR_Min_Anonset} + + + )} + {selectedWallet?.label && ( + + {`${C.STR_Auto_mix_account_select} ${selectedWallet.label}`} + + )} + {selectedWallet?.label && WalletAnonSlider} + + ); +}; + +const styles = StyleSheet.create({ + container: {flex: 1, backgroundColor: AppStyle.backgroundColor}, + description: {color: 'white', textAlign: 'center', marginTop: 20}, + seperator: { + backgroundColor: 'lightgray', + height: 2, + opacity: 0.1, + marginHorizontal: 20, + marginVertical: 30, + }, + cardContainer: { + marginStart: 20, + marginEnd: 20, + marginBottom: 24, + backgroundColor: '#19282f', + borderWidth: 2, + borderColor: '#19282f', + borderRadius: 20, + padding: 15, + flexDirection: 'row', + alignItems: 'center', + }, + leftIcon: { + width: 40, + height: 40, + resizeMode: 'contain', + }, + listHeading: { + color: 'white', + flex: 1, + paddingLeft: 20, + }, + anonset: { + color: 'white', + fontSize: 18, + }, + anonsetLabel: { + color: 'gray', + fontSize: 12, + }, + rightContainer: { + textAlign: 'right', + alignItems: 'flex-end', + }, + stickyContainer: { + backgroundColor: '#091110', + borderTopStartRadius: 30, + borderTopEndRadius: 30, + }, + confirmBtn: { + backgroundColor: AppStyle.mainColor, + padding: 20, + alignItems: 'center', + margin: 20, + borderRadius: 25, + }, + confirmLabel: { + fontWeight: 'bold', + fontSize: 16, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: -10}, + shadowOpacity: 0.4, + shadowRadius: 5, + backgroundColor: '#091110', + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + + overflow: 'hidden', + }, +}); +export default SifirWasabiAutoSpendScreen; diff --git a/src/components/screens/wallet/index.js b/src/components/screens/wallet/index.js index 7cfd9b4..7796b61 100644 --- a/src/components/screens/wallet/index.js +++ b/src/components/screens/wallet/index.js @@ -6,6 +6,7 @@ import SifirAccountScreen from './SifirAccountScreen'; import SifirBtcReceiveTxnScreen from './SifirBtcReceiveTxnScreen'; import SifirBtcTxnConfirmedScreen from './SifirBtcTxnConfirmedScreen'; import SifirAddWalletScreen from './SifirAddWalletScreen'; +import SifirWasabiAutoSpendScreen from './SifirWasabiAutoSpendScreen'; export { SifirGetAddrScreen, SifirBtcSendTxnInputAmountScreen, @@ -15,4 +16,5 @@ export { SifirBtcReceiveTxnScreen, SifirBtcTxnConfirmedScreen, SifirAddWalletScreen, + SifirWasabiAutoSpendScreen, }; diff --git a/src/components/structures/SifirAccountHistoryTabs.js b/src/components/structures/SifirAccountHistoryTabs.js new file mode 100644 index 0000000..a9c2df8 --- /dev/null +++ b/src/components/structures/SifirAccountHistoryTabs.js @@ -0,0 +1,177 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, {useMemo, useState} from 'react'; +import {View, Image, StyleSheet, Text, ActivityIndicator} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +import SifirTransactionsTab from '@elements/SifirTransactionsTab'; +import BottomSheet from 'reanimated-bottom-sheet'; +import {TabView, SceneMap, TabBar} from 'react-native-tab-view'; +import {ScrollView} from 'react-native-gesture-handler'; +import SifirInvEntry from '@elements/TxnListItems/SifirInvEntry'; +import SifirTxnEntry from '@elements/TxnListItems/SifirTxnEntry'; +import SifirUnspentCoinEntry from '@elements/TxnListItems/SifirUnspentCoinEntry'; +import SifirWasabiTxnEntry from '@elements/TxnListItems/SifirWasabiTxnEntry'; + +export const sheetHeight = C.SCREEN_HEIGHT - 150; +const initialSnap = C.SCREEN_HEIGHT * 0.35; +const initialLayout = {width: C.SCREEN_WIDTH}; + +const renderTabBar = props => ( + ( + + {label.route.title} + + )} + /> +); + +const SifirAccountHistoryTabs = ({ + loading, + loaded, + dataMap, + filterMap, + btcUnit, + type, + headerText, + bottomExtraSpace, +}) => { + const [index, setIndex] = useState(0); + const onTabIndexChange = tabIndex => setIndex(tabIndex); + const TransctionTabFactory = ({title, key, data}) => { + let renderItem; + switch (key) { + case C.STR_WASABI_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_UNSPENT_COINS: + // TODO rename to UTXO ? + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_LN_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_SPEND_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_WATCH_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + } + return param => ( + + + + ); + }; + const renderScene = useMemo(() => { + return SceneMap( + dataMap.reduce((sceneDict, {key, title, data}) => { + sceneDict[key] = TransctionTabFactory({key, title, data}); + return sceneDict; + }, {}), + ); + }, [dataMap]); + return ( + 100 ? bottomExtraSpace - 20 : initialSnap, + ]} + initialSnap={1} + enabledInnerScrolling={true} + enabledGestureInteraction={true} + renderContent={() => ( + + + {!loading && ( + // TODO change upArrow to down arrow when slider is opened. + + )} + {loading && ( + + )} + + ({key, title})), + }} + renderScene={renderScene} + onIndexChange={onTabIndexChange} + initialLayout={initialLayout} + renderTabBar={renderTabBar} + lazy={false} + sceneContainerStyle={styles.sceneContainer} + /> + + )} + /> + ); +}; + +const styles = StyleSheet.create({ + settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, + spinner: {alignSelf: 'center'}, + headerContainer: { + backgroundColor: '#122C3A', + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + justifyContent: 'center', + alignItems: 'center', + paddingTop: 10, + }, + tabTitleLabel: {fontWeight: 'bold'}, + sceneContainer: { + backgroundColor: AppStyle.tertiaryColor, + }, + tabIndicatorContainerStyle: { + borderBottomColor: AppStyle.grayColor, + borderBottomWidth: 3, + opacity: 0.5, + }, + tabIndicator: { + backgroundColor: AppStyle.mainColor, + bottom: -2, + }, + tabBar: { + backgroundColor: AppStyle.tertiaryColor, + }, +}); + +export default SifirAccountHistoryTabs; diff --git a/src/containers/WalletStack.js b/src/containers/WalletStack.js index 47f9034..435697a 100644 --- a/src/containers/WalletStack.js +++ b/src/containers/WalletStack.js @@ -11,6 +11,7 @@ import { SifirBtcReceiveTxnScreen, SifirBtcTxnConfirmedScreen, SifirAddWalletScreen, + SifirWasabiAutoSpendScreen, } from '@screens/wallet/index'; import {LNChannelRoute, LNPayInvoiceRoute} from './LnStack'; @@ -33,7 +34,6 @@ export default function WalletTab() { component={SifirAccountsListScreen} /> - - + ); } diff --git a/src/helpers/debounce.js b/src/helpers/debounce.js new file mode 100644 index 0000000..df03115 --- /dev/null +++ b/src/helpers/debounce.js @@ -0,0 +1,17 @@ +function debounce(func, wait, immediate) { + let timeout; + return function() { + const args = arguments; + let callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(function() { + timeout = null; + if (!immediate) { + func.apply(this, args); + } + }, wait); + + if (callNow) func.apply(this, args); + }; +} +export default debounce; diff --git a/src/helpers/makeUnspentCoinsChartData.js b/src/helpers/makeUnspentCoinsChartData.js new file mode 100644 index 0000000..3315f18 --- /dev/null +++ b/src/helpers/makeUnspentCoinsChartData.js @@ -0,0 +1,28 @@ +export default chartData => { + const data = chartData.reduce((g, t) => { + g[Math.floor(t.anonymitySet)] = + (g[Math.floor(t.anonymitySet)] || 0) + t.amount; + return g; + }, {}); + const sortedAnonsetTotalPairs = Object.entries(data).sort( + ([anonset1], [anonset2]) => anonset1 - anonset2, + ); + if (sortedAnonsetTotalPairs.length < 2) { + sortedAnonsetTotalPairs.unshift(sortedAnonsetTotalPairs[0]); + } + const chartStats = sortedAnonsetTotalPairs.reduce( + (stats, [anonset, total], i) => { + const cumTotal = sortedAnonsetTotalPairs + .slice(i) + .reduce((totalToIndex, [, t1]) => totalToIndex + t1, 0); + stats.series.push([Number(anonset), cumTotal]); + stats.maxY = Math.max(cumTotal, stats.maxY); + stats.maxX = Math.max(anonset, stats.maxX); + stats.minY = Math.min(cumTotal, stats.minY); + stats.minX = Math.min(anonset, stats.minX); + return stats; + }, + {series: [], minX: 99999, maxX: null, minY: null, maxY: null}, + ); + return chartStats; +}; diff --git a/src/helpers/validations.js b/src/helpers/validations.js index f34a931..3870c65 100644 --- a/src/helpers/validations.js +++ b/src/helpers/validations.js @@ -15,8 +15,8 @@ const validatedTokenHash = tokenHash => { } }; +const nodeRegx = new RegExp(/^([A-Za-z0-9]{66})/); const isValidLnNodeId = node => { - const nodeRegx = new RegExp(/^([A-Za-z0-9]{66})/); return nodeRegx.test(node); }; diff --git a/src/store/actions/btcwallet.js b/src/store/actions/btcwallet.js index 33da28a..07fd069 100644 --- a/src/store/actions/btcwallet.js +++ b/src/store/actions/btcwallet.js @@ -48,13 +48,13 @@ const getBtcWalletList = () => async dispatch => { dispatch({type: types.BTC_WALLET_LIST_DATA_SHOW + PENDING}); let btcWalletList = [ - { - label: 'ADD', - desc: C.STR_WALLET, - iconURL: Images.icon_add, - iconClickedURL: Images.icon_add_clicked, - pageURL: 'AddWallet', - }, + // { + // label: 'ADD', + // desc: C.STR_WALLET, + // iconURL: Images.icon_add, + // iconClickedURL: Images.icon_add_clicked, + // pageURL: 'AddWallet', + // }, ]; try { @@ -69,17 +69,38 @@ const getBtcWalletList = () => async dispatch => { iconURL: Images.icon_btcBtn, iconClickedURL: Images.icon_btcBtn_clicked, pageURL: 'Account', + meta: { + enableAddressTypeSelection: false, + }, }), ); // Add spending wallet btcWalletList.push({ - label: 'Spending', + label: C.STR_SPEND_WALLET_LABEL, desc: C.STR_WALLET, type: C.STR_SPEND_WALLET_TYPE, iconURL: Images.icon_btcBtn, iconClickedURL: Images.icon_btcBtn_clicked, + backIcon: Images.icon_btc_cir, pageURL: 'Account', + meta: { + enableAddressTypeSelection: true, + showAddressTypeSelector: true, + }, + }); + + btcWalletList.push({ + label: C.STR_WASABI_WALLET_LABEL, + desc: C.STR_WALLET, + type: C.STR_WASABI_WALLET_TYPE, + iconURL: Images.icon_wasabi, + iconClickedURL: Images.icon_wasabi_clicked, + backIcon: Images.icon_wasabi, + pageURL: 'Account', + meta: { + enableAddressLabelInput: true, + }, }); dispatch({ @@ -97,7 +118,6 @@ const getBtcWalletList = () => async dispatch => { const getWalletDetails = ({label, type}) => async dispatch => { dispatch({type: types.BTC_WALLET_DETAILS + PENDING}); - let balance = 0, txnData = []; try { @@ -118,13 +138,14 @@ const getWalletDetails = ({label, type}) => async dispatch => { default: break; } - dispatch({ - type: types.BTC_WALLET_DETAILS + FULFILLED, - }); // TODO move this to component txnData.sort((a, b) => { return b.timereceived - a.timereceived; }); + dispatch({ + type: types.BTC_WALLET_DETAILS + FULFILLED, + payload: {balance, txnData}, + }); return {balance, txnData}; } catch (err) { error(err); @@ -138,7 +159,6 @@ const getWalletDetails = ({label, type}) => async dispatch => { const getWalletAddress = ({label, type, addrType = null}) => async dispatch => { dispatch({type: types.BTC_WALLET_ADDRESS + PENDING}); let address = null; - try { await dispatch(initBtcClient()); switch (type) { @@ -156,6 +176,7 @@ const getWalletAddress = ({label, type, addrType = null}) => async dispatch => { type: types.BTC_WALLET_ADDRESS + FULFILLED, payload: {address}, }); + return address; } catch (err) { error(err); dispatch({ diff --git a/src/store/actions/cnClient.js b/src/store/actions/cnClient.js new file mode 100644 index 0000000..af58113 --- /dev/null +++ b/src/store/actions/cnClient.js @@ -0,0 +1,137 @@ +import {C} from '@common'; +import * as types from '@types/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; +import _cn from '@io/cnClient'; +import {getTransportFromToken} from '@io/transports'; +import {log, error} from '@io/events'; + +const properties = { + CN_AUTOSPEND_WALLET_LABEL: 'wasabi_batchprivatetospender_cfg', + CN_AUTOSPEND_ANONSET_LEVEL: 'wasabi_batchprivatetospender_minanonset', +}; +let cnClient; + +const initCnClient = () => async (dispatch, getState) => { + if (!cnClient) { + log('cnClient:starting cyphernode client'); + const { + auth: {token, key, nodePubkey, devicePgpKey}, + } = getState(); + + if (!token || !key || !nodePubkey) { + throw 'Unable to init wasabi client'; + } + const transport = await getTransportFromToken({ + token, + nodePubkey, + devicePgpKey, + }); + cnClient = await _cn({transport}); + } + return cnClient; +}; + +const getWasabiAutoSpendWallet = () => async (dispatch, getState) => { + const { + cyphernode: {cfgProps}, + } = getState(); + const prop = cfgProps.find( + ({property, value}) => property === properties.CN_AUTOSPEND_WALLET_LABEL, + ); + if (!prop) { + return null; + } + const {value: spendingWalletLabel} = prop; + // some translations to do here + switch (spendingWalletLabel) { + case '_spender': + return C.STR_SPEND_WALLET_LABEL; + case '_disabled': + return null; + default: + return spendingWalletLabel; + } +}; +const getWasabiAutoSpendMinAnonset = () => async (dispatch, getState) => { + const { + cyphernode: {cfgProps}, + } = getState(); + const prop = cfgProps.find( + ({property, value}) => property === properties.CN_AUTOSPEND_ANONSET_LEVEL, + ); + if (!prop) { + return null; + } + return prop.value; +}; +const setWasabiAutoSpendWalletAndAnonset = ({ + label = undefined, + anonset = undefined, +}) => async (dispatch, getState) => { + if (label !== undefined) { + let value; + // some translations to do here + switch (label) { + case C.STR_SPEND_WALLET_LABEL: + value = '_spender'; + break; + case null: + value = '_disabled'; + break; + default: + value = label; + break; + } + await dispatch(setConfigProp(properties.CN_AUTOSPEND_WALLET_LABEL, value)); + } + if (anonset) { + await dispatch( + setConfigProp(properties.CN_AUTOSPEND_ANONSET_LEVEL, anonset), + ); + } +}; +const getConfigProps = () => async dispatch => { + dispatch({type: types.CN_CLIENT_GET_CFG_PROPS + PENDING}); + try { + await dispatch(initCnClient()); + const cfgProps = await cnClient.getConfigProps(); + dispatch({ + type: types.CN_CLIENT_GET_CFG_PROPS + FULFILLED, + payload: {cfgProps}, + }); + return cfgProps; + } catch (err) { + error(err); + dispatch({ + type: types.CN_CLIENT_GET_CFG_PROPS + REJECTED, + payload: {error: err}, + }); + } +}; +const setConfigProp = (property, value) => async dispatch => { + dispatch({type: types.CN_CLIENT_SET_CFG_PROPS + PENDING}); + try { + await dispatch(initCnClient()); + console.log('sending', property, value); + const result = await cnClient.setConfigProp(property, value); + console.log('sending result', result); + dispatch({ + type: types.CN_CLIENT_SET_CFG_PROPS + FULFILLED, + }); + return result; + } catch (err) { + error(err); + dispatch({ + type: types.CN_CLIENT_SET_CFG_PROPS + REJECTED, + payload: {error: err}, + }); + } +}; + +export { + getConfigProps, + setConfigProp, + getWasabiAutoSpendWallet, + getWasabiAutoSpendMinAnonset, + setWasabiAutoSpendWalletAndAnonset, +}; diff --git a/src/store/actions/lnWallet.js b/src/store/actions/lnWallet.js index 617c7ed..3b28eca 100644 --- a/src/store/actions/lnWallet.js +++ b/src/store/actions/lnWallet.js @@ -56,7 +56,7 @@ const getLnNodesList = () => async dispatch => { await dispatch(initLnClient()); const lnNodes = await lnStore.getLnNodes(); if (!lnNodes?.length) { - // FIXME cold boot hack + // TODO cold boot hack // mainly to stay backward compatible with old archittecture // Either go to observable or fix this shit const nodeInfo = await lnClient.getNodeInfo(); @@ -87,6 +87,7 @@ const getLnNodeInfo = label => async dispatch => { nodeInfo.label = nodeInfo.alias; nodeInfo.iconURL = Images.icon_light; nodeInfo.iconClickedURL = Images.icon_light_clicked; + nodeInfo.backIcon = Images.icon_bolt_cir; // nodeInfo.balance = balance; dispatch({ type: types.LN_WALLET_NODEINFO + FULFILLED, @@ -104,6 +105,11 @@ const getLnNodeInfo = label => async dispatch => { const getLnWalletDetails = ({label}) => async dispatch => { dispatch({type: types.LN_WALLET_DETAILS + PENDING}); try { + // TODO + // const init = dispatch(initSifirClient()); + // and make sifirClient call not blocking so we can dispatch what's in the DB and then do the update + // with a LN_WALLET_DETAILS + UPDATE event ? + // await dispatch(initSifirClient()); const { funds: {channels, outputs}, @@ -145,10 +151,11 @@ const getLnWalletDetails = ({label}) => async dispatch => { type: cachedBolt.type, meta: cachedBolt.meta, }; - log('cached bolt', payload); + // log('cached bolt', payload); } else { // decode and insert it - const decodedBolt11 = bolt11Lib.decode(inv.bolt11); + const [x, y] = inv.bolt11.split(':'); + const decodedBolt11 = bolt11Lib.decode(x || y); payload = { decodedBolt11, bolt11: inv.bolt11, @@ -171,6 +178,12 @@ const getLnWalletDetails = ({label}) => async dispatch => { } dispatch({ type: types.LN_WALLET_DETAILS + FULFILLED, + payload: { + outputs, + channels, + pays: processedPays, + invoices: processedInvoices, + }, }); return { balance, @@ -201,7 +214,7 @@ const getFunds = () => async dispatch => { const balance = inChannelBalance + outputBalance; dispatch({ type: types.LN_WALLET_GET_FUNDS + FULFILLED, - payload: {balance}, + payload: {balance, outputs, channels}, }); } catch (err) { error(err); diff --git a/src/store/actions/wasabiWallet.js b/src/store/actions/wasabiWallet.js new file mode 100644 index 0000000..734118a --- /dev/null +++ b/src/store/actions/wasabiWallet.js @@ -0,0 +1,149 @@ +import * as types from '@types/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; +import {wasabiClient as _wasabi} from '@io/wasabiClient'; +import {C} from '@common/index'; +import {getTransportFromToken} from '@io/transports'; +import moment from 'moment'; +import {log, error} from '@io/events'; +let wasabiClient; + +const initWasabiClient = () => async (dispatch, getState) => { + if (!wasabiClient) { + log('wasabi:starting wasabi client'); + const { + auth: {token, key, nodePubkey, devicePgpKey}, + } = getState(); + + if (!token || !key || !nodePubkey) { + throw 'Unable to init wasabi client'; + } + const transport = await getTransportFromToken({ + token, + nodePubkey, + devicePgpKey, + }); + wasabiClient = await _wasabi({transport}); + } + return wasabiClient; +}; + +const getNewAddress = ({label}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_ADDRESS + PENDING}); + try { + await dispatch(initWasabiClient()); + const address = await wasabiClient.getNewAddress(label); + // TODO store address + dispatch({ + type: types.WASABI_WALLET_ADDRESS + FULFILLED, + }); + /** + * { + * address: Address; + * keyPath: string; //"84'/0'/0'/0/23"; + * label: string; //'["unknown"]'; + * } + * + */ + return address; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_ADDRESS + REJECTED, + payload: {error: err}, + }); + } +}; + +const spend = ({ + address, + amount, + minanonset, + instanceId = 0, + privateOnly = true, +}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_SPEND + PENDING}); + try { + await dispatch(initWasabiClient()); + if (isNaN(amount)) { + throw C.STR_AMOUNT_BENUMBER; + } + const spendResult = await wasabiClient.spend({ + address, + amount: Number(amount), + instanceId, + private: privateOnly, + minanonset, + }); + if ( + spendResult?.result === 'error' || + spendResult?.error || + // sometimes spend timesout on CN bridge side, so make sure we actaully got the spend + !spendResult?.result === 'success' + ) { + throw new Error( + spendResult?.message || + spendResult?.error?.message || + 'Error while attempting Wasabi spend (probably timedout)', + ); + } + dispatch({ + type: types.WASABI_WALLET_SPEND + FULFILLED, + payload: {spendResult}, + }); + return spendResult; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_SPEND + REJECTED, + payload: {error: err}, + }); + } +}; +const getUnspentCoins = ({instanceId = 0} = {}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_GET_UNSPENTCOINS + PENDING}); + try { + await dispatch(initWasabiClient()); + const unspentCoinsList = await wasabiClient.getUnspentCoins(instanceId); + // TODO cache it ? + dispatch({ + type: types.WASABI_WALLET_GET_UNSPENTCOINS + FULFILLED, + payload: {unspentCoinsList}, + }); + return unspentCoinsList; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_GET_UNSPENTCOINS + REJECTED, + payload: {error: err}, + }); + } +}; +const getTxns = ({ + instanceId = 0, + txnFilterInternal = true, +} = {}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_GET_TXNS + PENDING}); + try { + await dispatch(initWasabiClient()); + const txnsList = await wasabiClient.getTxns({ + instanceId, + txnFilterInternal, + }); + dispatch({ + type: types.WASABI_WALLET_GET_TXNS + FULFILLED, + payload: { + txnsList: txnsList?.transactions.sort((a, b) => + moment(b.datetime).diff(moment(a.datetime)), + ), + }, + }); + return txnsList; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_GET_TXNS + REJECTED, + payload: {error: err}, + }); + } +}; +export {getTxns, getUnspentCoins, getNewAddress, spend, initWasabiClient}; diff --git a/src/store/io/cnClient/index.js b/src/store/io/cnClient/index.js new file mode 100644 index 0000000..9bfa973 --- /dev/null +++ b/src/store/io/cnClient/index.js @@ -0,0 +1,8 @@ +import {cnClient} from 'sifir-js-sdk'; +let client = null; +export default async ({transport}) => { + if (!client) { + client = cnClient({transport}); + } + return client; +}; diff --git a/src/store/io/pgp/index.js b/src/store/io/pgp/index.js index 36699f1..3c1ee93 100644 --- a/src/store/io/pgp/index.js +++ b/src/store/io/pgp/index.js @@ -19,15 +19,17 @@ const initAndUnlockKeys = async ({privatekeyArmored, passphrase}) => { return {pubkeyArmored, fingerprint, hexkeyId}; }; +// FIXME schema of return check interface /** * @param email * @param passphrase - * @returns {Promise<{pubkeyArmored:string,fingerprint:string,hexkeyId:string}>} + * @returns {Promise<{privkeyArmored:string,pubkeyArmored:string,fingerprint:string,hexkeyId:string}>} */ const makeNewPgpKey = async ({passphrase, email, user}) => { const key = await PgpBridge.genNewKey(passphrase, email, user); return key; }; + const signMessageWithArmoredKey = async ({msg, privKey, passphrase}) => { const {armoredSignature, message} = await PgpBridge.signMessageWithArmoredKey( msg, diff --git a/src/store/io/sifirClient/index.js b/src/store/io/sifirClient/index.js index 0f7ab95..051a849 100644 --- a/src/store/io/sifirClient/index.js +++ b/src/store/io/sifirClient/index.js @@ -2,8 +2,7 @@ import {sifirClient} from 'sifir-js-sdk'; let client = null; export default async ({transport}) => { if (!client) { - // FIXME sifir to {transport} - client = sifirClient(transport); + client = sifirClient({transport}); } return client; }; diff --git a/src/store/io/wasabiClient/clientFactory.js b/src/store/io/wasabiClient/clientFactory.js new file mode 100644 index 0000000..d04a8c2 --- /dev/null +++ b/src/store/io/wasabiClient/clientFactory.js @@ -0,0 +1,10 @@ +import {wasabiClient} from 'sifir-js-sdk'; +let _wasabi = null; +export default async ({transport}) => { + if (!_wasabi) { + _wasabi = wasabiClient({ + transport, + }); + } + return _wasabi; +}; diff --git a/src/store/io/wasabiClient/index.js b/src/store/io/wasabiClient/index.js new file mode 100644 index 0000000..92f9ff5 --- /dev/null +++ b/src/store/io/wasabiClient/index.js @@ -0,0 +1 @@ +export wasabiClient from './clientFactory'; diff --git a/src/store/reducers/btcWallet.js b/src/store/reducers/btcWallet.js index 53c79a6..151e789 100644 --- a/src/store/reducers/btcWallet.js +++ b/src/store/reducers/btcWallet.js @@ -11,6 +11,8 @@ const initialState = { btcSendResult: null, feeSettingEnabled: false, chainInfo: null, + balance: null, + txnData: [], }; const btcWallet = createReducer(initialState)({ @@ -75,9 +77,11 @@ const btcWallet = createReducer(initialState)({ }), [types.BTC_WALLET_DETAILS + FULFILLED]: ( state, - // {payload: {btcWalletDetails}}, + {payload: {balance, txnData}}, ) => ({ ...state, + balance, + txnData, loading: false, loaded: true, error: null, diff --git a/src/store/reducers/cn.js b/src/store/reducers/cn.js new file mode 100644 index 0000000..9f434a2 --- /dev/null +++ b/src/store/reducers/cn.js @@ -0,0 +1,55 @@ +import * as types from '@types/'; +import {createReducer} from '@utils/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; + +const initialState = { + loading: false, + error: null, + loaded: false, + cfgProps: [], +}; + +const cyphernode = createReducer(initialState)({ + [types.CN_CLIENT_GET_CFG_PROPS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.CN_CLIENT_GET_CFG_PROPS + FULFILLED]: ( + state, + {payload: {cfgProps}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + cfgProps, + }), + [types.CN_CLIENT_GET_CFG_PROPS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.CN_CLIENT_SET_CFG_PROPS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.CN_CLIENT_SET_CFG_PROPS + FULFILLED]: state => ({ + ...state, + loading: false, + loaded: true, + error: null, + }), + [types.CN_CLIENT_SET_CFG_PROPS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), +}); + +export default cyphernode; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 2bf2e30..5f1fc0d 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,3 +1,5 @@ export btcWallet from './btcWallet'; export lnWallet from './lnWallet'; +export wasabiWallet from './wasabiWallet'; export auth from './auth'; +export cyphernode from './cn'; diff --git a/src/store/reducers/lnWallet.js b/src/store/reducers/lnWallet.js index 7a52ed5..3b249e1 100644 --- a/src/store/reducers/lnWallet.js +++ b/src/store/reducers/lnWallet.js @@ -9,6 +9,10 @@ const initialState = { funds: [], peers: [], nodeInfo: [], + pays: [], + invoices: [], + outputs: [], + channels: [], }; const lnWallet = createReducer(initialState)({ @@ -56,8 +60,15 @@ const lnWallet = createReducer(initialState)({ loading: true, loaded: false, }), - [types.LN_WALLET_DETAILS + FULFILLED]: state => ({ + [types.LN_WALLET_DETAILS + FULFILLED]: ( + state, + {payload: {pays, invoices, outputs, funds}}, + ) => ({ ...state, + pays, + invoices, + outputs, + funds, loading: false, loaded: true, error: null, diff --git a/src/store/reducers/wasabiWallet.js b/src/store/reducers/wasabiWallet.js new file mode 100644 index 0000000..4bdb33b --- /dev/null +++ b/src/store/reducers/wasabiWallet.js @@ -0,0 +1,86 @@ +import * as types from '@types/'; +import {createReducer} from '@utils/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; + +const initialState = { + loading: false, + error: null, + loaded: false, + unspentCoinsList: [], + txnsList: [], + spendResult: [], +}; + +const wasabiWallet = createReducer(initialState)({ + [types.WASABI_WALLET_GET_UNSPENTCOINS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_GET_UNSPENTCOINS + FULFILLED]: ( + state, + {payload: {unspentCoinsList}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + unspentCoinsList, + }), + [types.WASABI_WALLET_GET_UNSPENTCOINS + REJECTED]: ( + state, + {payload: {error}}, + ) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.WASABI_WALLET_GET_TXNS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_GET_TXNS + FULFILLED]: ( + state, + {payload: {txnsList}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + txnsList, + }), + [types.WASABI_WALLET_GET_TXNS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.WASABI_WALLET_SPEND + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_SPEND + FULFILLED]: ( + state, + {payload: {spendResult}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + spendResult, + }), + [types.WASABI_WALLET_SPEND + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), +}); + +export default wasabiWallet; diff --git a/src/store/types/index.js b/src/store/types/index.js index 24d72f9..3f062a0 100644 --- a/src/store/types/index.js +++ b/src/store/types/index.js @@ -19,6 +19,16 @@ export const LN_WALLET_OPEN_FUND_PEER_CHANNEL = export const LN_WALLET_GET_NEW_ADDRESS = 'LN_WALLET_GET_NEW_ADDRESS'; export const LN_WALLET_WITHDRAW_FUNDS = 'LN_WALLET_WITHDRAW_FUNDS'; +// Wasabi +export const WASABI_WALLET_GET_UNSPENTCOINS = 'WASABI_WALLET_GET_UNSPENTCOINS'; +export const WASABI_WALLET_GET_TXNS = 'WASABI_WALLET_GET_TXNS'; +export const WASABI_WALLET_SPEND = 'WASABI_WALLET_SPEND'; +export const WASABI_WALLET_ADDRESS = 'WASABI_WALLET_ADDRESS'; + +// Cn client +export const CN_CLIENT_GET_CFG_PROPS = 'CN_CLIENT_GET_CFG_PROPS'; +export const CN_CLIENT_SET_CFG_PROPS = 'CN_CLIENT_SET_CFG_PROPS'; + // Auth export const REQUEST_PAIR = 'REQUEST_PAIR'; export const GET_AUTH_STATUS = 'GET_AUTH_STATUS';