From 13be7c3535fbdefb1db1394e863a0fba90c68ead Mon Sep 17 00:00:00 2001 From: Thomas Zarebczan Date: Tue, 4 Dec 2018 13:49:22 -0500 Subject: [PATCH 1/5] fix: windows startup checking Need to check lbrynet start with 2 spaces on Windows. lbrynet.exe does not work properly. https://github.com/yibn2008/find-process/issues/18 --- src/main/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/index.js b/src/main/index.js index 016d7d9f6..37c817ff9 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -64,7 +64,8 @@ if (isDev) { } app.on('ready', async () => { - const processListArgs = process.platform === 'win32' ? 'lbrynet.exe' : 'lbrynet start'; + // Windows WMIC returns lbrynet start with 2 spaces. https://github.com/yibn2008/find-process/issues/18 + const processListArgs = process.platform === 'win32' ? 'lbrynet start' : 'lbrynet start'; const processList = await findProcess('name', processListArgs); const isDaemonRunning = processList.length > 0; From afecace3adfaaaa756553c5640578ad77de2c09e Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 4 Dec 2018 15:11:37 -0500 Subject: [PATCH 2/5] update lbryinc --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6163f0919..3a61e239a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "hast-util-sanitize": "^1.1.2", "keytar": "^4.2.1", "lbry-redux": "lbryio/lbry-redux#84b7d396934d57a37802aadbef71db91230a9404", - "lbryinc": "lbryio/lbryinc#26adc910bf0bbe4cd24bc7c195a5aa88b1a69a9f", + "lbryinc": "lbryio/lbryinc#68c8ce6b7608dabc9180fff9b4841d10e1c62284", "localforage": "^1.7.1", "mammoth": "^1.4.6", "mime": "^2.3.1", diff --git a/yarn.lock b/yarn.lock index 071aec54c..5db0c78c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5671,9 +5671,9 @@ lbry-redux@lbryio/lbry-redux#84b7d396934d57a37802aadbef71db91230a9404: reselect "^3.0.0" uuid "^3.3.2" -lbryinc@lbryio/lbryinc#26adc910bf0bbe4cd24bc7c195a5aa88b1a69a9f: +lbryinc@lbryio/lbryinc#68c8ce6b7608dabc9180fff9b4841d10e1c62284: version "0.0.1" - resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/26adc910bf0bbe4cd24bc7c195a5aa88b1a69a9f" + resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/68c8ce6b7608dabc9180fff9b4841d10e1c62284" dependencies: lbry-redux lbryio/lbry-redux#84b7d396934d57a37802aadbef71db91230a9404 reselect "^3.0.0" From 0394854128ebda7d59c332f7429c6e504f9ae031 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 4 Dec 2018 15:12:03 -0500 Subject: [PATCH 3/5] show loading spinner for suggested content --- src/renderer/component/spinner/view.jsx | 94 ++++++++++++++----- .../component/subscribeSuggested/index.js | 3 +- .../component/subscribeSuggested/view.jsx | 12 ++- src/renderer/redux/selectors/subscriptions.js | 5 +- 4 files changed, 87 insertions(+), 27 deletions(-) diff --git a/src/renderer/component/spinner/view.jsx b/src/renderer/component/spinner/view.jsx index 4d5030b83..e30f04f5b 100644 --- a/src/renderer/component/spinner/view.jsx +++ b/src/renderer/component/spinner/view.jsx @@ -1,5 +1,5 @@ // @flow -import * as React from 'react'; +import React, { PureComponent } from 'react'; import classnames from 'classnames'; import { DARK_THEME, LIGHT_THEME } from 'constants/themes'; @@ -8,32 +8,78 @@ type Props = { light?: boolean, // always a light spinner theme: string, type: ?string, + delayed: boolean, }; -const Spinner = (props: Props) => { - const { dark, light, theme, type } = props; - - return ( -
-
-
-
-
-
-
- ); +type State = { + show: boolean, }; -Spinner.defaultProps = { - dark: false, - light: false, -}; +class Spinner extends PureComponent { + static defaultProps = { + // We may want a dark/light spinner regardless of the current theme + dark: false, + light: false, + delayed: false, + }; + + constructor() { + super(); + + this.state = { show: false }; + this.delayedTimeout = null; + } + + componentDidMount() { + const { delayed } = this.props; + if (!delayed) { + // We can disable this because the default state is to render nothing so there won't be any content thrashing + // eslint-disable-next-line react/no-did-mount-set-state + this.setState({ show: true }); + } else { + // If the delayed prop is passed in, wait some time before showing the loading indicator + // We don't want the spinner to just flash for a fraction of a second + this.delayedTimeout = setTimeout(() => { + // eslint-disable-next-line react/no-did-mount-set-state + this.setState({ show: true }); + }, 750); + } + } + + componentWillUnmount() { + if (this.delayedTimeout) { + clearTimeout(this.delayedTimeout); + this.delayedTimeout = null; + } + } + + delayedTimeout: ?TimeoutID; + + render() { + const { dark, light, theme, type } = this.props; + const { show } = this.state; + + if (!show) { + return null; + } + + return ( +
+
+
+
+
+
+
+ ); + } +} export default Spinner; diff --git a/src/renderer/component/subscribeSuggested/index.js b/src/renderer/component/subscribeSuggested/index.js index 782664e65..f82582bae 100644 --- a/src/renderer/component/subscribeSuggested/index.js +++ b/src/renderer/component/subscribeSuggested/index.js @@ -1,9 +1,10 @@ import { connect } from 'react-redux'; -import { selectSuggestedChannels } from 'redux/selectors/subscriptions'; +import { selectSuggestedChannels, selectIsFetchingSuggested } from 'redux/selectors/subscriptions'; import SuggestedSubscriptions from './view'; const select = state => ({ suggested: selectSuggestedChannels(state), + loading: selectIsFetchingSuggested(state), }); export default connect( diff --git a/src/renderer/component/subscribeSuggested/view.jsx b/src/renderer/component/subscribeSuggested/view.jsx index b9368e95e..952ec3485 100644 --- a/src/renderer/component/subscribeSuggested/view.jsx +++ b/src/renderer/component/subscribeSuggested/view.jsx @@ -1,14 +1,24 @@ // @flow import React, { PureComponent } from 'react'; import CategoryList from 'component/categoryList'; +import Spinner from 'component/spinner'; type Props = { suggested: Array<{ label: string, uri: string }>, + loading: boolean, }; class SuggestedSubscriptions extends PureComponent { render() { - const { suggested } = this.props; + const { suggested, loading } = this.props; + + if (loading) { + return ( +
+ +
+ ); + } return suggested ? (
diff --git a/src/renderer/redux/selectors/subscriptions.js b/src/renderer/redux/selectors/subscriptions.js index 1b3d66690..7b556ff3d 100644 --- a/src/renderer/redux/selectors/subscriptions.js +++ b/src/renderer/redux/selectors/subscriptions.js @@ -24,7 +24,10 @@ export const selectViewMode = createSelector(selectState, state => state.viewMod // Suggested subscriptions from internal apis export const selectSuggested = createSelector(selectState, state => state.suggested); -export const selectLoadingSuggested = createSelector(selectState, state => state.loadingSuggested); +export const selectIsFetchingSuggested = createSelector( + selectState, + state => state.loadingSuggested +); export const selectSuggestedChannels = createSelector( selectSubscriptions, selectSuggested, From b9c4e6ffdd29f9dc6453da345f8e3606d48ca3a2 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 4 Dec 2018 15:30:14 -0500 Subject: [PATCH 4/5] prevent error timeout if user's wallet is locked --- src/renderer/component/splash/view.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/renderer/component/splash/view.jsx b/src/renderer/component/splash/view.jsx index 5a79541c3..8ac0cbfc5 100644 --- a/src/renderer/component/splash/view.jsx +++ b/src/renderer/component/splash/view.jsx @@ -114,6 +114,11 @@ export class SplashScreen extends React.PureComponent { // If the wallet is locked, stop doing anything and make the user input their password if (wallet && wallet.is_locked) { + // Clear the error timeout, it might sit on this step for a while until someone enters their password + if (this.timeout) { + clearTimeout(this.timeout); + } + this.setState({ isRunning: true, }); @@ -122,6 +127,10 @@ export class SplashScreen extends React.PureComponent { this.setState({ launchedModal: true }, () => notifyUnlockWallet()); } } else if (status.is_running) { + // If we cleared the error timout due to a wallet being locked, make sure to start it back up + if (!this.timeout) { + this.adjustErrorTimeout(); + } // Wait until we are able to resolve a name before declaring // that we are done. // TODO: This is a hack, and the logic should live in the daemon From c9c1fdbb1913fb0c1c9c093cdfd59684ae9a7aa6 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 4 Dec 2018 17:39:27 -0500 Subject: [PATCH 5/5] show incompatible daemon modal before anything else --- src/renderer/component/splash/view.jsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/renderer/component/splash/view.jsx b/src/renderer/component/splash/view.jsx index 8ac0cbfc5..f93e4fad3 100644 --- a/src/renderer/component/splash/view.jsx +++ b/src/renderer/component/splash/view.jsx @@ -52,7 +52,12 @@ export class SplashScreen extends React.PureComponent { this.adjustErrorTimeout(); Lbry.connect() - .then(checkDaemonVersion) + .then(() => { + this.setState({ + isRunning: true, + }); + checkDaemonVersion(); + }) .then(() => { this.updateStatus(); }) @@ -89,9 +94,12 @@ export class SplashScreen extends React.PureComponent { } updateStatus() { - Lbry.status().then(status => { - this.updateStatusCallback(status); - }); + const { daemonVersionMatched } = this.props; + if (daemonVersionMatched) { + Lbry.status().then(status => { + this.updateStatusCallback(status); + }); + } } updateStatusCallback(status: Status) { @@ -119,10 +127,6 @@ export class SplashScreen extends React.PureComponent { clearTimeout(this.timeout); } - this.setState({ - isRunning: true, - }); - if (launchedModal === false) { this.setState({ launchedModal: true }, () => notifyUnlockWallet()); }