diff --git a/package-lock.json b/package-lock.json
index 755b4f8..e61e763 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -961,6 +961,12 @@
"any-observable": "^0.3.0"
}
},
+ "@types/node": {
+ "version": "8.10.51",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.51.tgz",
+ "integrity": "sha512-cArrlJp3Yv6IyFT/DYe+rlO8o3SIHraALbBW/+CcCYW/a9QucpLI+n2p4sRxAvl2O35TiecpX2heSZtJjvEO+Q==",
+ "dev": true
+ },
"absolute-path": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz",
@@ -1004,6 +1010,15 @@
"resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
"integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE="
},
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.0.0"
+ }
+ },
"ansi-colors": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
@@ -1361,6 +1376,12 @@
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
},
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
"array-includes": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
@@ -1401,6 +1422,21 @@
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
@@ -1425,11 +1461,29 @@
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@@ -2378,11 +2432,35 @@
"safe-buffer": "5.1.2"
}
},
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
"big-integer": {
"version": "1.6.44",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz",
"integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ=="
},
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^2.0.0",
+ "camelcase": "^4.0.0",
+ "chalk": "^2.0.1",
+ "cli-boxes": "^1.0.0",
+ "string-width": "^2.0.0",
+ "term-size": "^1.2.0",
+ "widest-line": "^2.0.0"
+ }
+ },
"bplist-creator": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz",
@@ -2500,6 +2578,24 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
},
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ }
+ }
+ },
"caniuse-lite": {
"version": "1.0.30000983",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000983.tgz",
@@ -2514,6 +2610,18 @@
"rsvp": "^3.3.3"
}
},
+ "capture-stack-trace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -2579,6 +2687,12 @@
}
}
},
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -2675,6 +2789,15 @@
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
},
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
"commander": {
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
@@ -2728,6 +2851,48 @@
"typedarray": "^0.0.6"
}
},
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^4.1.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^1.0.0",
+ "unique-string": "^1.0.0",
+ "write-file-atomic": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ },
+ "dependencies": {
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ }
+ }
+ },
"connect": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
@@ -2790,6 +2955,15 @@
}
}
},
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
"create-react-class": {
"version": "15.6.3",
"resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
@@ -2831,6 +3005,30 @@
"which": "^1.2.9"
}
},
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
"date-fns": {
"version": "1.30.1",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
@@ -2866,6 +3064,12 @@
"integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
"dev": true
},
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@@ -2927,6 +3131,12 @@
}
}
},
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -2961,11 +3171,97 @@
"resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
"integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg="
},
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^1.0.0"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
+ "electron": {
+ "version": "1.8.8",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.8.tgz",
+ "integrity": "sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^8.0.24",
+ "electron-download": "^3.0.1",
+ "extract-zip": "^1.0.3"
+ }
+ },
+ "electron-download": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
+ "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0",
+ "fs-extra": "^0.30.0",
+ "home-path": "^1.0.1",
+ "minimist": "^1.2.0",
+ "nugget": "^2.0.0",
+ "path-exists": "^2.1.0",
+ "rc": "^1.1.2",
+ "semver": "^5.3.0",
+ "sumchecker": "^1.2.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ }
+ }
+ },
"electron-to-chromium": {
"version": "1.3.190",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.190.tgz",
@@ -3051,6 +3347,12 @@
"is-symbol": "^1.0.2"
}
},
+ "es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+ "dev": true
+ },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -3498,6 +3800,12 @@
"fill-range": "^2.1.0"
}
},
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
"extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -3535,6 +3843,24 @@
"is-extglob": "^1.0.0"
}
},
+ "extract-zip": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+ "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.6.2",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.1",
+ "yauzl": "2.4.1"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
"fancy-log": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
@@ -3609,6 +3935,15 @@
"through2": "^2.0.0"
}
},
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
"figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -3746,6 +4081,23 @@
"for-in": "^1.0.1"
}
},
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -4304,6 +4656,12 @@
"integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==",
"dev": true
},
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
"get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
@@ -4314,6 +4672,15 @@
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
},
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
"gfycat-style-urls": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/gfycat-style-urls/-/gfycat-style-urls-1.0.3.tgz",
@@ -4358,6 +4725,15 @@
"process": "^0.11.10"
}
},
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4"
+ }
+ },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -4368,6 +4744,25 @@
"resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-2.0.19.tgz",
"integrity": "sha512-kwtbruT+eyiof081cxT1tltMTxgTOq3CQhUoEYBROC+vNf+COPqzfKJtVnDvgXQe4SzfbnAYkP8KoSpbJBIlSg=="
},
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "^3.0.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "is-redirect": "^1.0.0",
+ "is-retry-allowed": "^1.0.0",
+ "is-stream": "^1.0.0",
+ "lowercase-keys": "^1.0.0",
+ "safe-buffer": "^5.0.1",
+ "timed-out": "^4.0.0",
+ "unzip-response": "^2.0.1",
+ "url-parse-lax": "^1.0.0"
+ }
+ },
"graceful-fs": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
@@ -4378,6 +4773,22 @@
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
},
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -4469,6 +4880,12 @@
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
"integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
},
+ "home-path": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz",
+ "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==",
+ "dev": true
+ },
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@@ -4486,6 +4903,17 @@
"toidentifier": "1.0.0"
}
},
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
"husky": {
"version": "0.14.3",
"resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
@@ -4533,6 +4961,12 @@
"resolve-from": "^3.0.0"
}
},
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -4558,6 +4992,12 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
"inquirer": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
@@ -4607,6 +5047,12 @@
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
},
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true
+ },
"is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
@@ -4699,6 +5145,15 @@
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
},
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
@@ -4715,6 +5170,22 @@
"is-extglob": "^1.0.0"
}
},
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^0.1.0",
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
@@ -4738,6 +5209,15 @@
"symbol-observable": "^1.1.0"
}
},
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -4768,6 +5248,12 @@
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
},
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
"is-regex": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
@@ -4783,6 +5269,12 @@
"integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
"dev": true
},
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -4797,6 +5289,18 @@
"has-symbols": "^1.0.0"
}
},
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -4845,6 +5349,12 @@
}
}
},
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
"jest-get-type": {
"version": "22.4.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz",
@@ -4931,6 +5441,12 @@
"esprima": "^4.0.0"
}
},
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -4941,6 +5457,12 @@
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
},
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -4987,6 +5509,18 @@
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
},
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
"jsx-ast-utils": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz",
@@ -5018,9 +5552,18 @@
"graceful-fs": "^4.1.9"
}
},
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "^4.0.0"
+ }
+ },
"lbry-redux": {
- "version": "github:lbryio/lbry-redux#b2044499c5f43e519384433538c1225d56d3a1f2",
- "from": "github:lbryio/lbry-redux#multi-claim-search",
+ "version": "github:lbryio/lbry-redux#cd23c12fb7fd541d28d7cbf3874b1058b036fd13",
+ "from": "github:lbryio/lbry-redux#cd23c12fb7fd541d28d7cbf3874b1058b036fd13",
"requires": {
"proxy-polyfill": "0.1.6",
"reselect": "^3.0.0",
@@ -5669,6 +6212,22 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -5720,6 +6279,12 @@
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
"integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
},
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
@@ -5741,6 +6306,99 @@
"mimic-fn": "^1.0.0"
}
},
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ }
+ }
+ },
"merge": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
@@ -6382,6 +7040,21 @@
"gauge": "~1.2.5"
}
},
+ "nugget": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
+ "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.1.3",
+ "minimist": "^1.1.0",
+ "pretty-bytes": "^1.0.2",
+ "progress-stream": "^1.1.0",
+ "request": "^2.45.0",
+ "single-line-log": "^1.1.2",
+ "throttleit": "0.0.2"
+ }
+ },
"nullthrows": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -6392,6 +7065,12 @@
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6642,6 +7321,18 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
},
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "^6.7.1",
+ "registry-auth-token": "^3.0.1",
+ "registry-url": "^3.0.3",
+ "semver": "^5.1.0"
+ }
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -6742,11 +7433,38 @@
"pify": "^2.0.0"
}
},
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
},
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
"pirates": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
@@ -6883,6 +7601,12 @@
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true
},
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
"preserve": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
@@ -6894,6 +7618,16 @@
"integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==",
"dev": true
},
+ "pretty-bytes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
+ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1",
+ "meow": "^3.1.0"
+ }
+ },
"pretty-format": {
"version": "24.0.0-alpha.6",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz",
@@ -6939,6 +7673,67 @@
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
+ "progress-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
+ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
+ "dev": true,
+ "requires": {
+ "speedometer": "~0.1.2",
+ "through2": "~0.2.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9",
+ "xtend": "~2.1.1"
+ }
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "requires": {
+ "object-keys": "~0.4.0"
+ }
+ }
+ }
+ },
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
@@ -6967,6 +7762,12 @@
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
+ "psl": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz",
+ "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==",
+ "dev": true
+ },
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -6982,6 +7783,12 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
"query-string": {
"version": "6.8.1",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.1.tgz",
@@ -7019,6 +7826,18 @@
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
"react": {
"version": "16.8.6",
"resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz",
@@ -7040,6 +7859,20 @@
"resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz",
"integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA=="
},
+ "react-devtools": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-3.6.3.tgz",
+ "integrity": "sha512-7JrGlKHvyamqDfDi7EEoIC8BHygKC1Mc8PmAAYm0aokwYuam/42bO1gnF5y2K7K1MbO+6f7J93s1N4VK0YdmEw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "electron": "^1.8.7",
+ "ip": "^1.1.4",
+ "minimist": "^1.2.0",
+ "react-devtools-core": "^3.6.0",
+ "update-notifier": "^2.1.0"
+ }
+ },
"react-devtools-core": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.1.tgz",
@@ -7676,6 +8509,36 @@
"util-deprecate": "~1.0.1"
}
},
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ },
+ "dependencies": {
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ }
+ }
+ },
"redux": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz",
@@ -7691,11 +8554,11 @@
"integrity": "sha512-sSJAzNq7zka3qVHKce1hbvqf0Vf5DuTVm7dr4GtsqQVOexnrvbV47RWFiPxQ8fscnyiuWyD2O92DOxPl0tGCRg=="
},
"redux-persist-filesystem-storage": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/redux-persist-filesystem-storage/-/redux-persist-filesystem-storage-1.4.0.tgz",
- "integrity": "sha512-Sf1gwJJMDXteOFjpKhVVpUhFse4poWlmYvJRdBuFuAvA4rHF+QgBOjnV0w6QdXFPBPHSzQBHpVpfBKRBO+CfgQ==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/redux-persist-filesystem-storage/-/redux-persist-filesystem-storage-1.4.1.tgz",
+ "integrity": "sha512-QDBlRWdFpn4JMrdLZcimwT7d3yc0xkSnA5j9xKWAY2Qw9rd3Uzlt76qXwEuuQ4M3qgKu/nLE8Roazl5BUcxfcA==",
"requires": {
- "rn-fetch-blob": "^0.10.0"
+ "rn-fetch-blob": "0.10.15"
}
},
"redux-persist-transform-compress": {
@@ -7788,6 +8651,25 @@
"unicode-match-property-value-ecmascript": "^1.1.0"
}
},
+ "registry-auth-token": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
+ "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.6",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.0.1"
+ }
+ },
"regjsgen": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
@@ -7823,6 +8705,43 @@
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -8281,6 +9200,15 @@
"integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
"dev": true
},
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.3"
+ }
+ },
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -8409,6 +9337,28 @@
"plist": "^3.0.1"
}
},
+ "single-line-log": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
+ "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
"slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -8610,6 +9560,12 @@
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
},
+ "speedometer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
+ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
+ "dev": true
+ },
"split-on-first": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
@@ -8628,6 +9584,23 @@
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
"stacktrace-parser": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz",
@@ -8760,6 +9733,16 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
+ "sumchecker": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
+ "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0",
+ "es6-promise": "^4.0.5"
+ }
+ },
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -8832,6 +9815,15 @@
}
}
},
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0"
+ }
+ },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -8843,6 +9835,12 @@
"resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
"integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
},
+ "throttleit": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+ "dev": true
+ },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -8862,6 +9860,12 @@
"resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
"integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
},
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -8923,6 +9927,30 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
"trim-right": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -8934,6 +9962,21 @@
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
"dev": true
},
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -9019,6 +10062,15 @@
"set-value": "^2.0.1"
}
},
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "^1.0.0"
+ }
+ },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -9070,6 +10122,30 @@
}
}
},
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "^1.2.1",
+ "chalk": "^2.0.1",
+ "configstore": "^3.0.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^1.0.10",
+ "is-installed-globally": "^0.1.0",
+ "is-npm": "^1.0.0",
+ "latest-version": "^3.0.0",
+ "semver-diff": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ }
+ },
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -9084,6 +10160,15 @@
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
},
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -9123,6 +10208,17 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
"walker": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
@@ -9158,6 +10254,15 @@
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
+ "widest-line": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+ "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1"
+ }
+ },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -9231,6 +10336,12 @@
"uuid": "^3.3.2"
}
},
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
"xmlbuilder": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
@@ -9296,6 +10407,15 @@
"requires": {
"camelcase": "^4.1.0"
}
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "dev": true,
+ "requires": {
+ "fd-slicer": "~1.0.1"
+ }
}
}
}
diff --git a/package.json b/package.json
index bcdeb55..608ad18 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,7 @@
"private": "true",
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
+ "devtools": "react-devtools",
"format": "prettier 'src/**/*.{js,json}' --write",
"precommit": "lint-staged"
},
@@ -11,7 +12,7 @@
"base-64": "^0.1.0",
"@expo/vector-icons": "^8.1.0",
"gfycat-style-urls": "^1.0.3",
- "lbry-redux": "lbryio/lbry-redux#multi-claim-search",
+ "lbry-redux": "lbryio/lbry-redux#67a654f60630710cae72419448a73a18d076d18a",
"lbryinc": "lbryio/lbryinc",
"lodash": ">=4.17.11",
"merge": ">=1.2.1",
@@ -63,6 +64,7 @@
"husky": "^0.14.3",
"lint-staged": "^7.0.4",
"metro-react-native-babel-preset": "^0.55.0",
- "prettier": "^1.11.1"
+ "prettier": "^1.11.1",
+ "react-devtools": "^3.6.3"
}
}
diff --git a/src/component/claimList/view.js b/src/component/claimList/view.js
index 33c10ce..d74e01a 100644
--- a/src/component/claimList/view.js
+++ b/src/component/claimList/view.js
@@ -12,7 +12,7 @@ import claimListStyle from 'styles/claimList';
import discoverStyle from 'styles/discover';
import moment from 'moment';
-const horizontalLimit = 10;
+const horizontalLimit = 7;
const softLimit = 500;
class ClaimList extends React.PureComponent {
@@ -199,8 +199,8 @@ class ClaimList extends React.PureComponent {
ListHeaderComponent={ListHeaderComponent}
style={claimListStyle.verticalScrollContainer}
contentContainerStyle={claimListStyle.verticalScrollPadding}
- initialNumToRender={8}
- maxToRenderPerBatch={24}
+ initialNumToRender={10}
+ maxToRenderPerBatch={20}
removeClippedSubviews
renderItem={({ item }) => (
@@ -208,7 +208,7 @@ class ClaimList extends React.PureComponent {
data={data}
keyExtractor={(item, index) => item}
onEndReached={this.handleVerticalEndReached}
- onEndReachedThreshold={0.9}
+ onEndReachedThreshold={0.2}
/>
{(((subscriptionsView || trendingForAllView) && claimSearchLoading) || loading) && (
diff --git a/src/component/customRewardCard/view.js b/src/component/customRewardCard/view.js
index 73d2aa2..2e8a826 100644
--- a/src/component/customRewardCard/view.js
+++ b/src/component/customRewardCard/view.js
@@ -57,7 +57,7 @@ class CustomRewardCard extends React.PureComponent {
return (
- {rewardIsPending && }
+ {rewardIsPending && }
Custom Code
diff --git a/src/component/fileListItem/index.js b/src/component/fileListItem/index.js
index 9bda30e..b514ad9 100644
--- a/src/component/fileListItem/index.js
+++ b/src/component/fileListItem/index.js
@@ -8,12 +8,15 @@ import {
makeSelectTitleForUri,
makeSelectThumbnailForUri,
} from 'lbry-redux';
+import { selectBlackListedOutpoints, selectFilteredOutpoints } from 'lbryinc';
import { selectShowNsfw } from 'redux/selectors/settings';
import FileListItem from './view';
const select = (state, props) => ({
+ blackListedOutpoints: selectBlackListedOutpoints(state),
claim: makeSelectClaimForUri(props.uri)(state),
fileInfo: makeSelectFileInfoForUri(props.uri)(state),
+ filteredOutpoints: selectFilteredOutpoints(state),
isDownloaded: !!makeSelectFileInfoForUri(props.uri)(state),
metadata: makeSelectMetadataForUri(props.uri)(state),
isResolvingUri: makeSelectIsUriResolving(props.uri)(state),
diff --git a/src/component/fileListItem/view.js b/src/component/fileListItem/view.js
index 8301581..90088cf 100644
--- a/src/component/fileListItem/view.js
+++ b/src/component/fileListItem/view.js
@@ -48,8 +48,10 @@ class FileListItem extends React.PureComponent {
render() {
const {
+ blackListedOutpoints,
claim,
fileInfo,
+ filteredOutpoints,
metadata,
featuredResult,
isResolvingUri,
@@ -66,7 +68,7 @@ class FileListItem extends React.PureComponent {
const obscureNsfw = this.props.obscureNsfw && metadata && metadata.nsfw;
const isResolving = !fileInfo && isResolvingUri;
- let name, channel, height, channelClaimId, fullChannelUri, signingChannel;
+ let name, channel, height, channelClaimId, fullChannelUri, shouldHide, signingChannel;
if (claim) {
name = claim.name;
signingChannel = claim.signing_channel;
@@ -74,9 +76,14 @@ class FileListItem extends React.PureComponent {
height = claim.height;
channelClaimId = signingChannel ? signingChannel.claim_id : null;
fullChannelUri = channelClaimId ? `${channel}#${channelClaimId}` : channel;
+
+ if (blackListedOutpoints || filteredOutpoints) {
+ const outpointsToHide = blackListedOutpoints.concat(filteredOutpoints);
+ shouldHide = outpointsToHide.some(outpoint => outpoint.txid === claim.txid && outpoint.nout === claim.nout);
+ }
}
- if (featuredResult && !isResolvingUri && !claim && !title && !name) {
+ if (shouldHide || (featuredResult && !isResolvingUri && !claim && !title && !name)) {
return null;
}
diff --git a/src/component/mediaPlayer/view.js b/src/component/mediaPlayer/view.js
index 64ed1cc..ba7b06b 100644
--- a/src/component/mediaPlayer/view.js
+++ b/src/component/mediaPlayer/view.js
@@ -468,7 +468,7 @@ class MediaPlayer extends React.PureComponent {
{this.state.buffering && (
-
+
)}
diff --git a/src/component/relatedContent/index.js b/src/component/relatedContent/index.js
index ff85171..3d75163 100644
--- a/src/component/relatedContent/index.js
+++ b/src/component/relatedContent/index.js
@@ -1,11 +1,11 @@
import { connect } from 'react-redux';
import {
makeSelectClaimForUri,
- doSearch,
makeSelectRecommendedContentForUri,
makeSelectTitleForUri,
selectIsSearching,
} from 'lbry-redux';
+import { doNativeSearch } from 'redux/actions/performance';
import RelatedContent from './view';
const select = (state, props) => ({
@@ -16,7 +16,7 @@ const select = (state, props) => ({
});
const perform = dispatch => ({
- search: query => dispatch(doSearch(query, 20, undefined, true)),
+ search: query => dispatch(doNativeSearch(query, 20, undefined, true)),
});
export default connect(
diff --git a/src/component/relatedContent/view.js b/src/component/relatedContent/view.js
index 67f0368..39a0d25 100644
--- a/src/component/relatedContent/view.js
+++ b/src/component/relatedContent/view.js
@@ -6,7 +6,7 @@ import FileListItem from 'component/fileListItem';
import fileListStyle from 'styles/fileList';
import relatedContentStyle from 'styles/relatedContent';
-export default class RelatedContent extends React.PureComponent {
+export default class RelatedContent extends React.PureComponent {
constructor() {
super();
@@ -17,7 +17,7 @@ export default class RelatedContent extends React.PureComponent {
this.getRecommendedContent();
}
- componentDidUpdate(prevProps: Props) {
+ componentDidUpdate(prevProps) {
const { claim, uri } = this.props;
if (uri !== prevProps.uri) {
@@ -38,7 +38,7 @@ export default class RelatedContent extends React.PureComponent {
}
}
- didSearch: ?boolean;
+ didSearch;
render() {
const { recommendedContent, isSearching, navigation } = this.props;
@@ -60,7 +60,9 @@ export default class RelatedContent extends React.PureComponent {
onPress={() => navigateToUri(navigation, recommendedUri, { autoplay: true })}
/>
))}
- {isSearching && }
+ {isSearching && (
+
+ )}
);
}
diff --git a/src/component/rewardCard/view.js b/src/component/rewardCard/view.js
index 1c4068a..0e35ab5 100644
--- a/src/component/rewardCard/view.js
+++ b/src/component/rewardCard/view.js
@@ -86,7 +86,7 @@ class RewardCard extends React.PureComponent {
)}
)}
- {isPending && }
+ {isPending && }
{reward.reward_title}
diff --git a/src/component/subscribeButton/view.js b/src/component/subscribeButton/view.js
index f11fadd..0c88b86 100644
--- a/src/component/subscribeButton/view.js
+++ b/src/component/subscribeButton/view.js
@@ -19,7 +19,7 @@ class SubscribeButton extends React.PureComponent {
const iconColor = isSubscribed ? null : Colors.Red;
const subscriptionHandler = isSubscribed ? doChannelUnsubscribe : doChannelSubscribe;
- const subscriptionLabel = isSubscribed ? null : __('Subscribe');
+ const subscriptionLabel = isSubscribed ? null : __('Follow');
const { claimName } = parseURI(uri);
return (
@@ -28,7 +28,7 @@ class SubscribeButton extends React.PureComponent {
theme={'light'}
icon={isSubscribed ? 'heart-broken' : 'heart'}
iconColor={iconColor}
- solid={isSubscribed ? false : true}
+ solid={!isSubscribed}
text={hideText ? null : subscriptionLabel}
onPress={() => {
subscriptionHandler({
diff --git a/src/component/suggestedSubscriptionItem/view.js b/src/component/suggestedSubscriptionItem/view.js
index 286566e..fe7a686 100644
--- a/src/component/suggestedSubscriptionItem/view.js
+++ b/src/component/suggestedSubscriptionItem/view.js
@@ -42,24 +42,22 @@ class SuggestedSubscriptionItem extends React.PureComponent {
-
- {title && (
-
- {title}
-
- )}
-
- {claim && claim.name}
+ {title && (
+
+ {title}
- {tags && (
-
- {tags &&
- tags
- .slice(0, 3)
- .map(tag => )}
-
- )}
-
+ )}
+
+ {claim && claim.name}
+
+ {tags && (
+
+ {tags &&
+ tags
+ .slice(0, 3)
+ .map(tag => )}
+
+ )}
diff --git a/src/component/suggestedSubscriptions/view.js b/src/component/suggestedSubscriptions/view.js
index 587a30c..99c1301 100644
--- a/src/component/suggestedSubscriptions/view.js
+++ b/src/component/suggestedSubscriptions/view.js
@@ -43,7 +43,7 @@ class SuggestedSubscriptions extends React.PureComponent {
if (loading) {
return (
-
+
);
}
diff --git a/src/component/tag/view.js b/src/component/tag/view.js
index 8f56bfd..2296931 100644
--- a/src/component/tag/view.js
+++ b/src/component/tag/view.js
@@ -1,20 +1,21 @@
import React from 'react';
import { Text, TouchableOpacity, View } from 'react-native';
+import { formatTagName } from 'utils/helper';
import tagStyle from 'styles/tag';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import Icon from 'react-native-vector-icons/FontAwesome5';
export default class Tag extends React.PureComponent {
onPressDefault = () => {
const { name, navigation, type, onAddPress, onRemovePress } = this.props;
- if ('add' === type) {
+ if (type === 'add') {
if (onAddPress) {
onAddPress(name);
}
return;
}
- if ('remove' === type) {
+ if (type === 'remove') {
if (onRemovePress) {
onRemovePress(name);
}
@@ -48,7 +49,7 @@ export default class Tag extends React.PureComponent {
return (
- {name}
+ {formatTagName(name)}
{type && }
diff --git a/src/constants.js b/src/constants.js
index e64178c..d2a892e 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -103,7 +103,7 @@ const Constants = {
TIME_ALL,
CLAIM_SEARCH_SORT_BY_ITEMS: [
- { icon: 'fire-alt', name: SORT_BY_HOT, label: 'Hot content' },
+ { icon: 'fire-alt', name: SORT_BY_HOT, label: 'Trending content' },
{ icon: 'certificate', name: SORT_BY_NEW, label: 'New content' },
{ icon: 'chart-line', name: SORT_BY_TOP, label: 'Top content' },
],
diff --git a/src/index.js b/src/index.js
index c35c75a..b6e0b91 100644
--- a/src/index.js
+++ b/src/index.js
@@ -18,6 +18,7 @@ import {
authReducer,
blacklistReducer,
costInfoReducer,
+ filteredReducer,
homepageReducer,
rewardsReducer,
subscriptionsReducer,
@@ -32,7 +33,6 @@ import AppWithNavigationState, {
} from 'component/AppNavigator';
import { REHYDRATE, PURGE, persistCombineReducers, persistStore } from 'redux-persist';
import getStoredStateMigrateV4 from 'redux-persist/lib/integration/getStoredStateMigrateV4';
-import AsyncStorage from '@react-native-community/async-storage';
import FilesystemStorage from 'redux-persist-filesystem-storage';
import createCompressor from 'redux-persist-transform-compress';
import createFilter from 'redux-persist-transform-filter';
@@ -43,7 +43,6 @@ import thunk from 'redux-thunk';
const globalExceptionHandler = (error, isFatal) => {
if (error && NativeModules.Firebase) {
- console.log(error);
NativeModules.Firebase.logException(isFatal, error.message ? error.message : 'No message', JSON.stringify(error));
}
};
@@ -80,7 +79,7 @@ function enableBatching(reducer) {
const compressor = createCompressor();
const authFilter = createFilter('auth', ['authToken']);
const contentFilter = createFilter('content', ['positions']);
-const saveClaimsFilter = createFilter('claims', ['byId', 'claimsByUri']);
+const saveClaimsFilter = createFilter('claims', ['claimsByUri']);
const subscriptionsFilter = createFilter('subscriptions', ['enabledChannelNotifications', 'subscriptions']);
const settingsFilter = createFilter('settings', ['clientSettings']);
const tagsFilter = createFilter('tags', ['followedTags']);
@@ -109,6 +108,7 @@ const reducers = persistCombineReducers(persistOptions, {
drawer: drawerReducer,
file: fileReducer,
fileInfo: fileInfoReducer,
+ filtered: filteredReducer,
homepage: homepageReducer,
nav: navigatorReducer,
notifications: notificationsReducer,
@@ -136,11 +136,29 @@ const store = createStore(
);
window.store = store;
-persistStore(store, persistOptions, err => {
+const persistor = persistStore(store, persistOptions, err => {
if (err) {
console.log('Unable to load saved SETTINGS');
}
});
+window.persistor = persistor;
+
+/*
+const persistFilter = {
+ 'auth': ['authToken'],
+ 'claims': ['byId', 'claimsByUri'],
+ 'content': ['positions'],
+ 'subscriptions': ['enabledChannelNotifications', 'subscriptions'],
+ 'settings': ['clientSettings'],
+ 'tags': ['followedTags'],
+ 'wallet': ['receiveAddress']
+};
+
+store.subscribe(() => {
+ const state = (({ auth, claims, content, subscriptions, settings, tags, wallet }) =>
+ ({ auth, claims, content, subscriptions, settings, tags, wallet }))(store.getState());
+ NativeModules.StatePersistor.update(state, persistFilter);
+}); */
// TODO: Find i18n module that is compatible with react-native
global.__ = str => str;
diff --git a/src/page/channel/view.js b/src/page/channel/view.js
index 142111f..d481ae5 100644
--- a/src/page/channel/view.js
+++ b/src/page/channel/view.js
@@ -4,7 +4,7 @@ import { ActivityIndicator, Dimensions, Image, ScrollView, Text, TouchableOpacit
import { TabView, SceneMap } from 'react-native-tab-view';
import { navigateBack } from 'utils/helper';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import Button from 'component/button';
import Link from 'component/link';
import FileList from 'component/fileList';
@@ -53,7 +53,7 @@ class ChannelPage extends React.PureComponent {
if (fetching) {
contentList = (
-
+
Fetching content...
);
@@ -123,21 +123,21 @@ class ChannelPage extends React.PureComponent {
);
}
- const { cover, description, thumbnail, email, website_url, title } = claim.value;
+ const { cover, description, thumbnail, email, website_url: websiteUrl, title } = claim.value;
return (
- {!website_url && !email && !description && (
+ {!websiteUrl && !email && !description && (
Nothing here yet. Please check back later.
)}
- {(website_url || email || description) && (
+ {(websiteUrl || email || description) && (
- {website_url && website_url.trim().length > 0 && (
+ {websiteUrl && websiteUrl.trim().length > 0 && (
Website
-
+
)}
diff --git a/src/page/discover/view.js b/src/page/discover/view.js
index 875abc5..8a0c737 100644
--- a/src/page/discover/view.js
+++ b/src/page/discover/view.js
@@ -207,7 +207,7 @@ class DiscoverPage extends React.PureComponent {
buildSections = () => {
return this.state.tagCollection.map(tags => ({
- title: tags.length === 1 ? tags[0] : 'Trending',
+ title: tags.length === 1 ? tags[0] : 'All tags you follow',
data: [tags],
}));
};
@@ -216,7 +216,9 @@ class DiscoverPage extends React.PureComponent {
const tags = followedTags.map(tag => tag.name);
// each of the followed tags
- const tagCollection = tags.map(tag => [tag]);
+ const tagCollection = _.shuffle(tags)
+ .slice(0, 6)
+ .map(tag => [tag]);
// everything
tagCollection.unshift(tags);
@@ -268,7 +270,8 @@ class DiscoverPage extends React.PureComponent {
renderItem={({ item, index, section }) => (
1 ? Constants.DEFAULT_ORDER_BY : orderBy}
+ orderBy={orderBy}
+ time={Constants.TIME_WEEK}
tags={item}
morePlaceholder
navigation={navigation}
diff --git a/src/page/downloads/view.js b/src/page/downloads/view.js
index cde7f3c..3bcde0c 100644
--- a/src/page/downloads/view.js
+++ b/src/page/downloads/view.js
@@ -3,7 +3,7 @@ import { Lbry, buildURI } from 'lbry-redux';
import { ActivityIndicator, Button, FlatList, Text, TextInput, View, ScrollView } from 'react-native';
import { navigateToUri, uriFromFileInfo } from 'utils/helper';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import PageHeader from 'component/pageHeader';
import FileListItem from 'component/fileListItem';
import FloatingWalletBalance from 'component/floatingWalletBalance';
@@ -65,7 +65,7 @@ class DownloadsPage extends React.PureComponent {
)}
{fetching && !hasDownloads && (
-
+
)}
{hasDownloads && (
diff --git a/src/page/file/view.js b/src/page/file/view.js
index 56b5957..700b3ca 100644
--- a/src/page/file/view.js
+++ b/src/page/file/view.js
@@ -563,11 +563,11 @@ class FilePage extends React.PureComponent {
let innerContent = null;
if ((isResolvingUri && !claim) || !claim) {
- innerContent = (
+ return (
{isResolvingUri && (
-
+
Loading decentralized data...
)}
@@ -579,9 +579,13 @@ class FilePage extends React.PureComponent {
);
- } else if (claim && claim.name.length && claim.name[0] === '@') {
- innerContent = ;
- } else if (claim) {
+ }
+
+ if (claim) {
+ if (claim && claim.name.length && claim.name[0] === '@') {
+ return ;
+ }
+
let isClaimBlackListed = false;
if (blackListedOutpoints) {
@@ -595,7 +599,7 @@ class FilePage extends React.PureComponent {
}
if (isClaimBlackListed) {
- innerContent = (
+ return (
@@ -607,358 +611,362 @@ class FilePage extends React.PureComponent {
);
- } else {
- let tags = [];
- if (claim && claim.value && claim.value.tags) {
- tags = claim.value.tags;
- }
+ }
- const completed = fileInfo && fileInfo.completed;
- const isRewardContent = rewardedContentClaimIds.includes(claim.claim_id);
- const description = metadata.description ? metadata.description : null;
- const mediaType = Lbry.getMediaType(contentType);
- const isPlayable = mediaType === 'video' || mediaType === 'audio';
- const { height, signing_channel: signingChannel, value } = claim;
- const channelName = signingChannel && signingChannel.name;
- const showActions =
- fileInfo &&
- fileInfo.download_path &&
- !this.state.fullscreenMode &&
- !this.state.showImageViewer &&
- !this.state.showWebView;
- const showFileActions =
- fileInfo &&
- fileInfo.download_path &&
- (completed || (fileInfo && !fileInfo.stopped && fileInfo.written_bytes < fileInfo.total_bytes));
- const channelClaimId = claim && claim.signing_channel && claim.signing_channel.claim_id;
- const canSendTip = this.state.tipAmount > 0;
- const fullChannelUri =
- channelClaimId && channelClaimId.trim().length > 0 ? `${channelName}#${channelClaimId}` : channelName;
+ let tags = [];
+ if (claim && claim.value && claim.value.tags) {
+ tags = claim.value.tags;
+ }
- const playerStyle = [
- filePageStyle.player,
- this.state.isLandscape
- ? filePageStyle.containedPlayerLandscape
- : this.state.fullscreenMode
- ? filePageStyle.fullscreenPlayer
- : filePageStyle.containedPlayer,
- ];
- const playerBgStyle = [filePageStyle.playerBackground, filePageStyle.containedPlayerBackground];
- const fsPlayerBgStyle = [filePageStyle.playerBackground, filePageStyle.fullscreenPlayerBackground];
- // at least 2MB (or the full download) before media can be loaded
- const canLoadMedia =
- this.state.streamingMode ||
- (fileInfo && (fileInfo.written_bytes >= 2097152 || fileInfo.written_bytes === fileInfo.total_bytes)); // 2MB = 1024*1024*2
- const isViewable = mediaType === 'image' || mediaType === 'text';
- const isWebViewable = mediaType === 'text';
- const canOpen = isViewable && completed;
- const localFileUri = this.localUriForFileInfo(fileInfo);
+ const completed = fileInfo && fileInfo.completed;
+ const isRewardContent = rewardedContentClaimIds.includes(claim.claim_id);
+ const description = metadata.description ? metadata.description : null;
+ const mediaType = Lbry.getMediaType(contentType);
+ const isPlayable = mediaType === 'video' || mediaType === 'audio';
+ const { height, signing_channel: signingChannel, value } = claim;
+ const channelName = signingChannel && signingChannel.name;
+ const showActions =
+ fileInfo &&
+ fileInfo.download_path &&
+ !this.state.fullscreenMode &&
+ !this.state.showImageViewer &&
+ !this.state.showWebView;
+ const showFileActions =
+ fileInfo &&
+ fileInfo.download_path &&
+ (completed || (fileInfo && !fileInfo.stopped && fileInfo.written_bytes < fileInfo.total_bytes));
+ const channelClaimId = claim && claim.signing_channel && claim.signing_channel.claim_id;
+ const canSendTip = this.state.tipAmount > 0;
+ const fullChannelUri =
+ channelClaimId && channelClaimId.trim().length > 0 ? `${channelName}#${channelClaimId}` : channelName;
- const openFile = () => {
- if (mediaType === 'image') {
- // use image viewer
- if (!this.state.showImageViewer) {
- this.setState({
- imageUrls: [
- {
- url: localFileUri,
- },
- ],
- showImageViewer: true,
- });
- }
+ const playerStyle = [
+ filePageStyle.player,
+ this.state.isLandscape
+ ? filePageStyle.containedPlayerLandscape
+ : this.state.fullscreenMode
+ ? filePageStyle.fullscreenPlayer
+ : filePageStyle.containedPlayer,
+ ];
+ const playerBgStyle = [filePageStyle.playerBackground, filePageStyle.containedPlayerBackground];
+ const fsPlayerBgStyle = [filePageStyle.playerBackground, filePageStyle.fullscreenPlayerBackground];
+ // at least 2MB (or the full download) before media can be loaded
+ const canLoadMedia =
+ this.state.streamingMode ||
+ (fileInfo && (fileInfo.written_bytes >= 2097152 || fileInfo.written_bytes === fileInfo.total_bytes)); // 2MB = 1024*1024*2
+ const isViewable = mediaType === 'image' || mediaType === 'text';
+ const isWebViewable = mediaType === 'text';
+ const canOpen = isViewable && completed;
+ const localFileUri = this.localUriForFileInfo(fileInfo);
+
+ const openFile = () => {
+ if (mediaType === 'image') {
+ // use image viewer
+ if (!this.state.showImageViewer) {
+ this.setState({
+ imageUrls: [
+ {
+ url: localFileUri,
+ },
+ ],
+ showImageViewer: true,
+ });
}
- if (isWebViewable) {
- // show webview
- if (!this.state.showWebView) {
- this.setState({
- showWebView: true,
- });
- }
+ }
+ if (isWebViewable) {
+ // show webview
+ if (!this.state.showWebView) {
+ this.setState({
+ showWebView: true,
+ });
}
- };
-
- if (
- fileInfo &&
- !this.state.autoDownloadStarted &&
- this.state.uriVars &&
- this.state.uriVars.download === 'true'
- ) {
- this.setState({ autoDownloadStarted: true }, () => {
- purchaseUri(uri, costInfo, !isPlayable);
- if (NativeModules.UtilityModule) {
- NativeModules.UtilityModule.checkDownloads();
- }
- });
}
+ };
- if (this.state.downloadPressed && canOpen) {
- // automatically open a web viewable or image file after the download button is pressed
- openFile();
- }
+ if (fileInfo && !this.state.autoDownloadStarted && this.state.uriVars && this.state.uriVars.download === 'true') {
+ this.setState({ autoDownloadStarted: true }, () => {
+ purchaseUri(uri, costInfo, !isPlayable);
+ if (NativeModules.UtilityModule) {
+ NativeModules.UtilityModule.checkDownloads();
+ }
+ });
+ }
- innerContent = (
-
- {!this.state.fullscreenMode && }
- {this.state.showWebView && isWebViewable && (
-
- )}
+ if (this.state.downloadPressed && canOpen) {
+ // automatically open a web viewable or image file after the download button is pressed
+ openFile();
+ }
- {this.state.showImageViewer && (
- null}
- />
- )}
+ return (
+
+ {!this.state.fullscreenMode && }
+ {this.state.showWebView && isWebViewable && (
+
+ )}
- {!this.state.showWebView && (
-
-
- {(canOpen || (!fileInfo || (isPlayable && !canLoadMedia)) || (!canOpen && fileInfo)) && (
-
- )}
- {(!this.state.downloadButtonShown || this.state.downloadPressed) && !this.state.mediaLoaded && (
-
- )}
- {((isPlayable && !completed && !canLoadMedia) ||
- canOpen ||
- (!completed && !this.state.streamingMode)) &&
- !this.state.downloadPressed && (
- this.setState({ downloadPressed: true })}
- onButtonLayout={() => this.setState({ downloadButtonShown: true })}
- />
- )}
- {!fileInfo && (
-
- )}
+ {this.state.showImageViewer && (
+ null}
+ />
+ )}
-
-
-
-
- {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
- {
- this.playerBackground = ref;
- }}
- onLayout={evt => {
- if (!this.state.playerBgHeight) {
- this.setState({ playerBgHeight: evt.nativeEvent.layout.height });
- }
- }}
- />
+ {!this.state.showWebView && (
+
+
+ {(canOpen || (!fileInfo || (isPlayable && !canLoadMedia)) || (!canOpen && fileInfo)) && (
+
)}
- {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) &&
- this.state.fullscreenMode && }
- {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
- {
- this.player = ref;
- }}
+ {(!this.state.downloadButtonShown || this.state.downloadPressed) && !this.state.mediaLoaded && (
+
+ )}
+ {((isPlayable && !completed && !canLoadMedia) ||
+ canOpen ||
+ (!completed && !this.state.streamingMode)) &&
+ !this.state.downloadPressed && (
+ {
- if (!this.state.playerHeight) {
- this.setState({ playerHeight: evt.nativeEvent.layout.height });
- }
- }}
- onMediaLoaded={() => this.onMediaLoaded(channelName, title, uri)}
- onBackButtonPressed={this.onBackButtonPressed}
- onPlaybackStarted={this.onPlaybackStarted}
- onPlaybackFinished={this.onPlaybackFinished}
- thumbnail={thumbnail}
- position={position}
+ style={filePageStyle.downloadButton}
+ openFile={openFile}
+ isPlayable={isPlayable}
+ isViewable={isViewable}
+ onPlay={this.onFileDownloadButtonPlayed}
+ onView={() => this.setState({ downloadPressed: true })}
+ onButtonLayout={() => this.setState({ downloadButtonShown: true })}
+ />
+ )}
+ {!fileInfo && (
+
)}
- {showActions && showFileActions && (
-
- {showFileActions && (
-
- {completed && (
-
- )}
- {!completed &&
- fileInfo &&
- !fileInfo.stopped &&
- fileInfo.written_bytes < fileInfo.total_bytes &&
- !this.state.stopDownloadConfirmed && (
-
- )}
+
+
+
+
+ {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
+ {
+ this.playerBackground = ref;
+ }}
+ onLayout={evt => {
+ if (!this.state.playerBgHeight) {
+ this.setState({ playerBgHeight: evt.nativeEvent.layout.height });
+ }
+ }}
+ />
+ )}
+ {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && this.state.fullscreenMode && (
+
+ )}
+ {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
+ {
+ this.player = ref;
+ }}
+ uri={uri}
+ source={this.playerUriForFileInfo(fileInfo)}
+ style={playerStyle}
+ autoPlay={autoplay || this.state.autoPlayMedia}
+ onFullscreenToggled={this.handleFullscreenToggle}
+ onLayout={evt => {
+ if (!this.state.playerHeight) {
+ this.setState({ playerHeight: evt.nativeEvent.layout.height });
+ }
+ }}
+ onMediaLoaded={() => this.onMediaLoaded(channelName, title, uri)}
+ onBackButtonPressed={this.onBackButtonPressed}
+ onPlaybackStarted={this.onPlaybackStarted}
+ onPlaybackFinished={this.onPlaybackFinished}
+ thumbnail={thumbnail}
+ position={position}
+ />
+ )}
+
+ {showActions && showFileActions && (
+
+ {showFileActions && (
+
+ {completed && (
+
+ )}
+ {!completed &&
+ fileInfo &&
+ !fileInfo.stopped &&
+ fileInfo.written_bytes < fileInfo.total_bytes &&
+ !this.state.stopDownloadConfirmed && (
+
+ )}
+
+ )}
+
+ )}
+ {
+ this.scrollView = ref;
+ }}
+ >
+ this.setState({ showDescription: !this.state.showDescription })}
+ >
+
+
+ {title}
+
+
+
+
+
+
+
+
+ {channelName && (
+ {
+ navigateToUri(navigation, normalizeURI(fullChannelUri));
+ }}
+ />
+ )}
+ {!channelName && (
+
+ Anonymous
+
+ )}
+
+
+
+ {false && ((isPlayable && !fileInfo) || (isPlayable && fileInfo && !fileInfo.download_path)) && (
+
+ )}
+
+
+
+ {this.state.showTipView && }
+ {this.state.showTipView && (
+
+
+
+ (this.tipAmountInput = ref)}
+ onChangeText={value => this.setState({ tipAmount: value })}
+ keyboardType={'numeric'}
+ placeholder={'0'}
+ value={this.state.tipAmount}
+ style={[filePageStyle.input, filePageStyle.tipAmountInput]}
+ />
+ LBC
+
+ this.setState({ showTipView: false })}
+ />
+
+
+
+ )}
+
+ {this.state.showDescription && description && description.length > 0 && (
+
+ )}
+ {this.state.showDescription && description && (
+
+
+ {this.linkify(description)}
+
+ {tags && tags.length > 0 && (
+
+ Tags
+ {this.renderTags(tags)}
)}
)}
- {
- this.scrollView = ref;
- }}
- >
- this.setState({ showDescription: !this.state.showDescription })}
- >
-
-
- {title}
-
-
-
-
-
-
- {channelName && (
-
-
- {
- navigateToUri(navigation, normalizeURI(fullChannelUri));
- }}
- />
-
-
-
- {false &&
- ((isPlayable && !fileInfo) || (isPlayable && fileInfo && !fileInfo.download_path)) && (
-
- )}
-
-
- )}
- {this.state.showTipView && }
- {this.state.showTipView && (
-
-
-
- (this.tipAmountInput = ref)}
- onChangeText={value => this.setState({ tipAmount: value })}
- keyboardType={'numeric'}
- placeholder={'0'}
- value={this.state.tipAmount}
- style={[filePageStyle.input, filePageStyle.tipAmountInput]}
- />
- LBC
-
- this.setState({ showTipView: false })}
- />
-
-
-
- )}
+ {costInfo && parseFloat(costInfo.cost) > balance && }
- {this.state.showDescription && description && description.length > 0 && (
-
- )}
- {this.state.showDescription && description && (
-
-
- {this.linkify(description)}
-
- {tags && tags.length > 0 && (
-
- Tags
- {this.renderTags(tags)}
-
- )}
-
- )}
-
- {costInfo && parseFloat(costInfo.cost) > balance && }
-
-
-
-
-
- )}
- {!this.state.fullscreenMode && !this.state.showImageViewer && !this.state.showWebView && (
-
- )}
-
- );
- }
+
+
+
+
+ )}
+ {!this.state.fullscreenMode && !this.state.showImageViewer && !this.state.showWebView && (
+
+ )}
+
+ );
}
- return innerContent;
+ return null;
}
}
diff --git a/src/page/publish/view.js b/src/page/publish/view.js
index 9013c73..c699780 100644
--- a/src/page/publish/view.js
+++ b/src/page/publish/view.js
@@ -550,7 +550,7 @@ class PublishPage extends React.PureComponent {
{(!videos || !thumbnailPath || !galleryThumbnailsChecked) && (
-
+
)}
{thumbnailPath && (!videos || videos.length === 0) && (
diff --git a/src/page/rewards/view.js b/src/page/rewards/view.js
index 5796f37..0a588cf 100644
--- a/src/page/rewards/view.js
+++ b/src/page/rewards/view.js
@@ -2,7 +2,7 @@ import React from 'react';
import { Lbry } from 'lbry-redux';
import { ActivityIndicator, NativeModules, ScrollView, Text, View } from 'react-native';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import Link from 'component/link';
import CustomRewardCard from 'component/customRewardCard';
import PageHeader from 'component/pageHeader';
@@ -87,7 +87,7 @@ class RewardsPage extends React.PureComponent {
// claim new_user and new_mobile rewards
for (let i = 0; i < rewards.length; i++) {
const { reward_type: type } = rewards[i];
- if ('new_user' === type || 'new_mobile' === type) {
+ if (type === 'new_user' || type === 'new_mobile') {
claimReward(rewards[i]);
}
}
@@ -127,7 +127,7 @@ class RewardsPage extends React.PureComponent {
if (fetching) {
return (
-
+
Fetching rewards...
);
diff --git a/src/page/search/view.js b/src/page/search/view.js
index a8a296e..3f65cf5 100644
--- a/src/page/search/view.js
+++ b/src/page/search/view.js
@@ -3,7 +3,7 @@ import { Lbry, parseURI, normalizeURI, isURIValid } from 'lbry-redux';
import { ActivityIndicator, Button, Text, TextInput, View, ScrollView } from 'react-native';
import { navigateToUri } from 'utils/helper';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import PageHeader from 'component/pageHeader';
import FileListItem from 'component/fileListItem';
import FloatingWalletBalance from 'component/floatingWalletBalance';
@@ -91,7 +91,7 @@ class SearchPage extends React.PureComponent {
{isSearching && (
-
+
)}
@@ -105,7 +105,7 @@ class SearchPage extends React.PureComponent {
navigateToUri(navigation, this.state.currentUri)}
@@ -113,14 +113,14 @@ class SearchPage extends React.PureComponent {
)}
{uris && uris.length
? uris.map(uri => (
- navigateToUri(navigation, uri)}
- />
- ))
+ navigateToUri(navigation, uri)}
+ />
+ ))
: null}
{(!uris || uris.length === 0) && (
diff --git a/src/page/splash/index.js b/src/page/splash/index.js
index 380ec47..d3b644e 100644
--- a/src/page/splash/index.js
+++ b/src/page/splash/index.js
@@ -3,6 +3,7 @@ import { doBalanceSubscribe, doUpdateBlockHeight, doToast } from 'lbry-redux';
import {
doAuthenticate,
doBlackListedOutpointsSubscribe,
+ doFilteredOutpointsSubscribe,
doCheckSubscriptionsInit,
doFetchMySubscriptions,
doFetchRewardedContent,
@@ -25,6 +26,7 @@ const perform = dispatch => ({
authenticate: (appVersion, os) => dispatch(doAuthenticate(appVersion, os)),
balanceSubscribe: () => dispatch(doBalanceSubscribe()),
blacklistedOutpointsSubscribe: () => dispatch(doBlackListedOutpointsSubscribe()),
+ filteredOutpointsSubscribe: () => dispatch(doFilteredOutpointsSubscribe()),
checkSubscriptionsInit: () => dispatch(doCheckSubscriptionsInit()),
fetchRewardedContent: () => dispatch(doFetchRewardedContent()),
fetchSubscriptions: callback => dispatch(doFetchMySubscriptions(callback)),
diff --git a/src/page/splash/view.js b/src/page/splash/view.js
index 38a88f0..266e07e 100644
--- a/src/page/splash/view.js
+++ b/src/page/splash/view.js
@@ -10,7 +10,7 @@ import Button from 'component/button';
import ProgressBar from 'component/progressBar';
import PropTypes from 'prop-types';
import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import splashStyle from 'styles/splash';
const BLOCK_HEIGHT_INTERVAL = 1000 * 60 * 2.5; // every 2.5 minutes
@@ -50,7 +50,7 @@ class SplashScreen extends React.PureComponent {
}
navigateToMain = () => {
- const { navigation } = this.props;
+ const { navigation, notify, verifyUserEmail, verifyUserEmailFailure } = this.props;
const resetAction = StackActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Main' })],
@@ -114,9 +114,8 @@ class SplashScreen extends React.PureComponent {
balanceSubscribe,
blacklistedOutpointsSubscribe,
checkSubscriptionsInit,
+ filteredOutpointsSubscribe,
getSync,
- navigation,
- notify,
updateBlockHeight,
user,
} = this.props;
@@ -125,11 +124,8 @@ class SplashScreen extends React.PureComponent {
// Leave the splash screen
balanceSubscribe();
blacklistedOutpointsSubscribe();
+ filteredOutpointsSubscribe();
checkSubscriptionsInit();
- updateBlockHeight();
- setInterval(() => {
- updateBlockHeight();
- }, BLOCK_HEIGHT_INTERVAL);
if (user && user.id && user.has_verified_email) {
// user already authenticated
@@ -186,7 +182,6 @@ class SplashScreen extends React.PureComponent {
this.finishSplashScreen();
})
.catch(() => this.handleAccountUnlockFailed());
- return;
} else {
this.setState({
message: testingNetwork,
@@ -222,7 +217,7 @@ class SplashScreen extends React.PureComponent {
});
} else if (walletStatus && walletStatus.blocks_behind > 0) {
const behind = walletStatus.blocks_behind;
- const behindText = behind + ' block' + (behind == 1 ? '' : 's') + ' behind';
+ const behindText = behind + ' block' + (behind === 1 ? '' : 's') + ' behind';
this.setState({
message: 'Blockchain Sync',
details: behindText,
@@ -254,7 +249,7 @@ class SplashScreen extends React.PureComponent {
// Start measuring the first launch time from the splash screen
// (time to first user interaction - after first run completed)
AsyncStorage.getItem('hasLaunched').then(value => {
- if ('true' !== value) {
+ if (value !== 'true') {
AsyncStorage.setItem('hasLaunched', 'true');
// only set firstLaunchTime since we've determined that this is the first app launch ever
AsyncStorage.setItem('firstLaunchTime', String(moment().unix()));
diff --git a/src/page/subscriptions/index.js b/src/page/subscriptions/index.js
index 2f9c7d9..e59a3d0 100644
--- a/src/page/subscriptions/index.js
+++ b/src/page/subscriptions/index.js
@@ -5,8 +5,9 @@ import {
doFetchRecommendedSubscriptions,
selectSubscriptionClaims,
selectSubscriptions,
- selectSubscriptionsBeingFetched,
selectIsFetchingSubscriptions,
+ selectIsFetchingSuggested,
+ selectSuggestedChannels,
selectUnreadSubscriptions,
selectViewMode,
selectFirstRunCompleted,
@@ -16,13 +17,15 @@ import { doPushDrawerStack, doSetPlayerVisible } from 'redux/actions/drawer';
import { doSetClientSetting } from 'redux/actions/settings';
import { makeSelectClientSetting } from 'redux/selectors/settings';
import { selectCurrentRoute } from 'redux/selectors/drawer';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
import SubscriptionsPage from './view';
const select = state => ({
currentRoute: selectCurrentRoute(state),
- loading: selectIsFetchingSubscriptions(state) || Boolean(Object.keys(selectSubscriptionsBeingFetched(state)).length),
+ loading: selectIsFetchingSubscriptions(state),
+ loadingSuggested: selectIsFetchingSuggested(state),
subscribedChannels: selectSubscriptions(state),
+ suggestedChannels: selectSuggestedChannels(state),
subscriptionsViewMode: makeSelectClientSetting(Constants.SETTING_SUBSCRIPTIONS_VIEW_MODE)(state),
allSubscriptions: selectSubscriptionClaims(state),
unreadSubscriptions: selectUnreadSubscriptions(state),
diff --git a/src/page/subscriptions/view.js b/src/page/subscriptions/view.js
index 46ca5e3..243c027 100644
--- a/src/page/subscriptions/view.js
+++ b/src/page/subscriptions/view.js
@@ -115,11 +115,12 @@ class SubscriptionsPage extends React.PureComponent {
render() {
const {
+ suggestedChannels,
subscribedChannels,
allSubscriptions,
- loading,
viewMode,
doSetViewMode,
+ loading,
loadingSuggested,
firstRunCompleted,
doCompleteFirstRun,
@@ -182,7 +183,7 @@ class SubscriptionsPage extends React.PureComponent {
{hasSubscriptions && loading && (
-
+
)}
@@ -209,8 +210,7 @@ class SubscriptionsPage extends React.PureComponent {
{loadingSuggested && (
-
- \\
+
)}
{!loadingSuggested && }
diff --git a/src/page/tag/view.js b/src/page/tag/view.js
index 843d4b9..dc02fac 100644
--- a/src/page/tag/view.js
+++ b/src/page/tag/view.js
@@ -78,7 +78,7 @@ class TagPage extends React.PureComponent {
};
handleTimeItemSelected = item => {
- this.setState({ time: item.name });
+ this.setState({ currentTimeItem: item, time: item.name, showTimePicker: false });
};
render() {
diff --git a/src/page/trending/view.js b/src/page/trending/view.js
index 3891eb0..7ab602b 100644
--- a/src/page/trending/view.js
+++ b/src/page/trending/view.js
@@ -95,6 +95,7 @@ class TrendingPage extends React.PureComponent {
orderBy={Constants.DEFAULT_ORDER_BY}
trendingForAll={TRENDING_FOR_ITEMS[0].name === currentTrendingForItem.name}
tags={followedTags.map(tag => tag.name)}
+ time={null}
navigation={navigation}
orientation={Constants.ORIENTATION_VERTICAL}
/>
diff --git a/src/redux/actions/performance.js b/src/redux/actions/performance.js
new file mode 100644
index 0000000..dcfc197
--- /dev/null
+++ b/src/redux/actions/performance.js
@@ -0,0 +1,96 @@
+// @flow
+import { NativeModules } from 'react-native';
+import {
+ ACTIONS,
+ batchActions,
+ buildURI,
+ doResolveUri,
+ doUpdateSearchQuery,
+ makeSelectSearchUris,
+ selectSuggestions,
+ makeSelectQueryWithOptions,
+ selectSearchValue,
+} from 'lbry-redux';
+
+let CONNECTION_STRING = 'https://lighthouse.lbry.com/';
+
+const handleNativeFetchResponse = str => {
+ const json = JSON.parse(str);
+ if (json.error) {
+ return Promise.reject(new Error(json.error));
+ }
+
+ return Promise.resolve(json);
+};
+
+// Use a native asyncTask to call the lighthouse api
+export const doNativeSearch = (
+ rawQuery: string, // pass in a query if you don't want to search for what's in the search bar
+ size: ?number, // only pass in if you don't want to use the users setting (ex: related content)
+ from: ?number,
+ isBackgroundSearch: boolean = false
+) => (dispatch: Dispatch, getState: GetState) => {
+ const query = rawQuery.replace(/^lbry:\/\//i, '').replace(/\//, ' ');
+
+ if (!query) {
+ dispatch({
+ type: ACTIONS.SEARCH_FAIL,
+ });
+ return;
+ }
+
+ const state = getState();
+ const queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch)(state);
+
+ // If we have already searched for something, we don't need to do anything
+ const urisForQuery = makeSelectSearchUris(queryWithOptions)(state);
+ if (urisForQuery && !!urisForQuery.length) {
+ return;
+ }
+
+ dispatch({
+ type: ACTIONS.SEARCH_START,
+ });
+
+ // If the user is on the file page with a pre-populated uri and they select
+ // the search option without typing anything, searchQuery will be empty
+ // We need to populate it so the input is filled on the search page
+ // isBackgroundSearch means the search is happening in the background, don't update the search query
+ if (!state.search.searchQuery && !isBackgroundSearch) {
+ dispatch(doUpdateSearchQuery(query));
+ }
+
+ const url = `${CONNECTION_STRING}search?${queryWithOptions}`;
+ NativeModules.Requests.get(url)
+ .then(handleNativeFetchResponse)
+ .then((data: Array<{ name: String, claimId: string }>) => {
+ const uris = [];
+ const actions = [];
+
+ data.forEach(result => {
+ if (result.name) {
+ const uri = buildURI({
+ claimName: result.name,
+ claimId: result.claimId,
+ });
+ actions.push(doResolveUri(uri));
+ uris.push(uri);
+ }
+ });
+
+ actions.push({
+ type: ACTIONS.SEARCH_SUCCESS,
+ data: {
+ query: queryWithOptions,
+ uris,
+ },
+ });
+ dispatch(batchActions(...actions));
+ })
+ .catch(e => {
+ console.log(e);
+ dispatch({
+ type: ACTIONS.SEARCH_FAIL,
+ });
+ });
+};
diff --git a/src/redux/actions/settings.js b/src/redux/actions/settings.js
index aa9f9e6..754f960 100644
--- a/src/redux/actions/settings.js
+++ b/src/redux/actions/settings.js
@@ -1,11 +1,17 @@
import { ACTIONS } from 'lbry-redux';
export function doSetClientSetting(key, value) {
- return {
- type: ACTIONS.CLIENT_SETTING_CHANGED,
- data: {
- key,
- value,
- },
+ return dispatch => {
+ dispatch({
+ type: ACTIONS.CLIENT_SETTING_CHANGED,
+ data: {
+ key,
+ value,
+ },
+ });
+
+ if (window.persistor) {
+ window.persistor.flush();
+ }
};
}
diff --git a/src/styles/filePage.js b/src/styles/filePage.js
index 812c414..ff01fa1 100644
--- a/src/styles/filePage.js
+++ b/src/styles/filePage.js
@@ -93,6 +93,11 @@ const filePageStyle = StyleSheet.create({
fontSize: 14,
color: Colors.LbryGreen,
},
+ anonChannelName: {
+ fontFamily: 'Inter-UI-Regular',
+ fontSize: 14,
+ color: Colors.DescriptionGrey,
+ },
publishDateText: {
fontFamily: 'Inter-UI-SemiBold',
fontSize: 12,
diff --git a/src/styles/subscriptions.js b/src/styles/subscriptions.js
index 8648421..f8c377d 100644
--- a/src/styles/subscriptions.js
+++ b/src/styles/subscriptions.js
@@ -197,7 +197,8 @@ const subscriptionsStyle = StyleSheet.create({
},
suggestedItemDetails: {
marginLeft: 16,
- flexDirection: 'row',
+ marginRight: 16,
+ flex: 0.8,
},
suggestedItemSubscribe: {
backgroundColor: Colors.White,
@@ -209,12 +210,14 @@ const subscriptionsStyle = StyleSheet.create({
fontFamily: 'Inter-UI-Regular',
fontSize: 16,
marginBottom: 4,
+ width: '85%',
},
suggestedItemName: {
fontFamily: 'Inter-UI-SemiBold',
fontSize: 14,
marginBottom: 4,
color: Colors.LbryGreen,
+ width: '95%',
},
suggestedItemTagList: {
flexDirection: 'row',
diff --git a/src/utils/helper.js b/src/utils/helper.js
index ed41011..ae6f023 100644
--- a/src/utils/helper.js
+++ b/src/utils/helper.js
@@ -3,6 +3,8 @@ import { buildURI, isURIValid } from 'lbry-redux';
import { doPopDrawerStack, doPushDrawerStack, doSetPlayerVisible } from 'redux/actions/drawer';
import Constants, { DrawerRoutes } from 'constants'; // eslint-disable-line node/no-deprecated-api
+const tagNameLength = 10;
+
function getRouteForSpecialUri(uri) {
let targetRoute;
const page = uri.substring(8).trim(); // 'lbry://?'.length == 8
@@ -191,6 +193,17 @@ export function formatTagTitle(title) {
return title.charAt(0).toUpperCase() + title.substring(1);
}
+export function formatTagName(name) {
+ if (!name) {
+ return null;
+ }
+ if (name.length <= tagNameLength) {
+ return name;
+ }
+
+ return name.substring(0, 7) + '...';
+}
+
// i18n placeholder until we find a good react-native i18n module
export function __(str) {
return str;