From a57c207e60967615ce18b527d8d3e03002d724b7 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 00:19:26 -0400 Subject: [PATCH 01/12] don't show notification for new subscription if on subscription page --- src/renderer/redux/actions/subscriptions.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/renderer/redux/actions/subscriptions.js b/src/renderer/redux/actions/subscriptions.js index d677d51a6..2b13840e2 100644 --- a/src/renderer/redux/actions/subscriptions.js +++ b/src/renderer/redux/actions/subscriptions.js @@ -7,7 +7,7 @@ import type { Dispatch, SubscriptionNotifications } from 'redux/reducers/subscri import type { Subscription } from 'types/subscription'; import { selectSubscriptions } from 'redux/selectors/subscriptions'; import { makeSelectClientSetting } from 'redux/selectors/settings'; -import { Lbry, buildURI, parseURI } from 'lbry-redux'; +import { Lbry, buildURI, parseURI, selectCurrentPage } from 'lbry-redux'; import { doPurchaseUri, doFetchClaimsByChannel } from 'redux/actions/content'; import { doClaimRewardType } from 'redux/actions/rewards'; import Promise from 'bluebird'; @@ -133,6 +133,7 @@ export const doCheckSubscription = (subscriptionUri: string, notify?: boolean) = // no dispatching FETCH_CHANNEL_CLAIMS_STARTED; causes loading issues on const state = getState(); + const currentPage = selectCurrentPage(state); const savedSubscription = state.subscriptions.subscriptions.find( sub => sub.uri === subscriptionUri ); @@ -141,6 +142,11 @@ export const doCheckSubscription = (subscriptionUri: string, notify?: boolean) = const claimResult = result[subscriptionUri] || {}; const { claims_in_channel: claimsInChannel } = claimResult; + // may happen if subscribed to an abandoned channel or an empty channel + if (!claimsInChannel) { + return; + } + const latestIndex = claimsInChannel.findIndex( claim => `${claim.name}#${claim.claim_id}` === savedSubscription.latest ); @@ -158,7 +164,7 @@ export const doCheckSubscription = (subscriptionUri: string, notify?: boolean) = !claim.value.stream.metadata.fee && makeSelectClientSetting(SETTINGS.AUTO_DOWNLOAD)(state) ); - if (notify) { + if (notify && currentPage !== 'subscriptions') { dispatch( setSubscriptionNotification( savedSubscription, From 52f3fab3a6d4139ede218e677c66fb45a6f8ff93 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 11:35:24 -0400 Subject: [PATCH 02/12] add spinner to related content --- src/renderer/component/recommendedContent/view.jsx | 2 ++ src/renderer/component/spinner/view.jsx | 1 + src/renderer/scss/component/_spinner.scss | 14 ++++++++++++++ yarn.lock | 4 ++-- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/renderer/component/recommendedContent/view.jsx b/src/renderer/component/recommendedContent/view.jsx index 4a12aecb3..902229c47 100644 --- a/src/renderer/component/recommendedContent/view.jsx +++ b/src/renderer/component/recommendedContent/view.jsx @@ -2,6 +2,7 @@ import React from 'react'; import FileTile from 'component/fileTile'; import type { Claim } from 'types/claim'; +import Spinner from 'component/spinner'; type Props = { uri: string, @@ -65,6 +66,7 @@ export default class RecommendedContent extends React.PureComponent { {recommendedContent && !recommendedContent.length && !isSearching &&
No related content found
} + {isSearching && } ); } diff --git a/src/renderer/component/spinner/view.jsx b/src/renderer/component/spinner/view.jsx index 836971041..4d5030b83 100644 --- a/src/renderer/component/spinner/view.jsx +++ b/src/renderer/component/spinner/view.jsx @@ -19,6 +19,7 @@ const Spinner = (props: Props) => { 'spinner--dark': !light && (dark || theme === LIGHT_THEME), 'spinner--light': !dark && (light || theme === DARK_THEME), 'spinner--splash': type === 'splash', + 'spinner--small': type === 'small', })} >
diff --git a/src/renderer/scss/component/_spinner.scss b/src/renderer/scss/component/_spinner.scss index d6e4cb937..5ef690181 100644 --- a/src/renderer/scss/component/_spinner.scss +++ b/src/renderer/scss/component/_spinner.scss @@ -50,6 +50,20 @@ } } +.spinner--small { + margin: $spacing-vertical * 1/3 0; + width: 40px; + height: 32px; + text-align: center; + font-size: 10px; + + .rect { + height: 100%; + width: 3px; + margin: 0 2px; + } +} + @keyframes sk-stretchdelay { 0%, 40%, diff --git a/yarn.lock b/yarn.lock index 3b366088b..db1f53c7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5655,9 +5655,9 @@ lazy-val@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.3.tgz#bb97b200ef00801d94c317e29dc6ed39e31c5edc" -lbry-redux@lbryio/lbry-redux#ccda4117ee503e30abae355c77d3783a141e9492: +lbry-redux@lbryio/lbry-redux#eae0d134d92d83f733b85a8ecebf529a6e9799cf: version "0.0.1" - resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/ccda4117ee503e30abae355c77d3783a141e9492" + resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/eae0d134d92d83f733b85a8ecebf529a6e9799cf" dependencies: proxy-polyfill "0.1.6" reselect "^3.0.0" From 75fadb8a1de64158741b866c81c0112c863e80d5 Mon Sep 17 00:00:00 2001 From: YULIUS KURNIAWAN KRISTIANTO Date: Wed, 29 Aug 2018 03:23:09 +0700 Subject: [PATCH 03/12] added learn more faq to wallet security section --- src/renderer/page/settings/view.jsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/renderer/page/settings/view.jsx b/src/renderer/page/settings/view.jsx index 729ba7059..ed1c7620c 100644 --- a/src/renderer/page/settings/view.jsx +++ b/src/renderer/page/settings/view.jsx @@ -348,12 +348,17 @@ class SettingsPage extends React.PureComponent { name="encrypt_wallet" onChange={e => this.onChangeEncryptWallet(e)} checked={walletEncrypted} - postfix={__('Encrypt my wallet with a custom password.')} - helper={__( + postfix={__('Encrypt my wallet with a custom password.')}/> +
{__( 'Secure your local wallet data with a custom password. Lost passwords cannot be recovered.' - )} - /> - + )}{' '} +
+ +
{__('Application Cache')}
From afa8c1627e870462262b55d73da507a214ac925b Mon Sep 17 00:00:00 2001 From: YULIUS KURNIAWAN KRISTIANTO Date: Wed, 29 Aug 2018 03:26:27 +0700 Subject: [PATCH 04/12] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5b8f113e..ae34201ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). * 3D File viewer features and performance/memory usage improvements ([#1870](https://github.com/lbryio/lbry-desktop/pull/1870)) * Desktop notification when publish is completed ([#1892](https://github.com/lbryio/lbry-desktop/pull/1892)) * FAQ to Publishing Area ([#1833](https://github.com/lbryio/lbry-desktop/pull/1833)) - + * FAQ to wallet security area ([#1917](https://github.com/lbryio/lbry-desktop/pull/1917)) ### Changed * Upgraded LBRY Protocol to [version 0.21.2](https://github.com/lbryio/lbry/releases/tag/v0.21.2) fixing a download bug. * Searching now shows results by default, including direct lbry:// URL tile From de631ac0392c8f327140b8792b1e1ff241b40756 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 16:46:50 -0400 Subject: [PATCH 05/12] fetch new rewards and properly call reward claim after view event has been fired --- src/renderer/analytics.js | 16 ++++++++++++++-- src/renderer/component/fileViewer/index.js | 4 +++- src/renderer/component/fileViewer/view.jsx | 8 +++++--- src/renderer/component/rewardSummary/index.js | 2 ++ src/renderer/component/rewardSummary/view.jsx | 2 ++ src/renderer/page/discover/index.js | 9 ++++++--- src/renderer/page/discover/view.jsx | 10 ++++++++-- 7 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/renderer/analytics.js b/src/renderer/analytics.js index 808106bfc..7ab84e448 100644 --- a/src/renderer/analytics.js +++ b/src/renderer/analytics.js @@ -44,7 +44,13 @@ const analytics: Analytics = { } analyticsEnabled = enabled; }, - apiLogView: (uri: string, outpoint: string, claimId: string, timeToStart?: number): void => { + apiLogView: ( + uri: string, + outpoint: string, + claimId: string, + timeToStart?: number, + onSuccessCb: ?() => void + ): void => { if (analyticsEnabled) { const params = { uri, @@ -56,7 +62,13 @@ const analytics: Analytics = { params.time_to_start = timeToStart; } - Lbryio.call('file', 'view', params).catch(() => {}); + Lbryio.call('file', 'view', params) + .then(() => { + if (onSuccessCb) { + onSuccessCb(); + } + }) + .catch(() => {}); } }, }; diff --git a/src/renderer/component/fileViewer/index.js b/src/renderer/component/fileViewer/index.js index 2e77b38d4..c21e5f5c1 100644 --- a/src/renderer/component/fileViewer/index.js +++ b/src/renderer/component/fileViewer/index.js @@ -4,6 +4,7 @@ import { doChangeVolume } from 'redux/actions/app'; import { selectVolume } from 'redux/selectors/app'; import { doPlayUri, doSetPlayingUri } from 'redux/actions/content'; import { doPlay, doPause, savePosition } from 'redux/actions/media'; +import { doClaimEligiblePurchaseRewards } from 'redux/actions/rewards'; import { makeSelectMetadataForUri, makeSelectContentTypeForUri, @@ -35,7 +36,7 @@ const select = (state, props) => ({ mediaPosition: makeSelectMediaPositionForUri(props.uri)(state), autoplay: makeSelectClientSetting(settings.AUTOPLAY)(state), searchBarFocused: selectSearchBarFocused(state), - fileInfoErrors: selectFileInfoErrors(state) + fileInfoErrors: selectFileInfoErrors(state), }); const perform = dispatch => ({ @@ -45,6 +46,7 @@ const perform = dispatch => ({ doPlay: () => dispatch(doPlay()), doPause: () => dispatch(doPause()), savePosition: (claimId, position) => dispatch(savePosition(claimId, position)), + claimRewards: () => dispatch(doClaimEligiblePurchaseRewards()), }); export default connect( diff --git a/src/renderer/component/fileViewer/view.jsx b/src/renderer/component/fileViewer/view.jsx index aed32f07c..3e51bab10 100644 --- a/src/renderer/component/fileViewer/view.jsx +++ b/src/renderer/component/fileViewer/view.jsx @@ -44,6 +44,7 @@ type Props = { play: string => void, searchBarFocused: boolean, mediaType: string, + claimRewards: () => void, }; class FileViewer extends React.PureComponent { @@ -169,7 +170,8 @@ class FileViewer extends React.PureComponent { } } - fireAnalyticsEvent = (claim, startTime, playTime) => { + fireAnalyticsEvent(claim, startTime, playTime) { + const { claimRewards } = this.props; const { name, claim_id: claimId, txid, nout } = claim; // ideally outpoint would exist inside of claim information @@ -181,8 +183,8 @@ class FileViewer extends React.PureComponent { timeToStart = playTime - startTime; } - analytics.apiLogView(`${name}#${claimId}`, outpoint, claimId, timeToStart); - }; + analytics.apiLogView(`${name}#${claimId}`, outpoint, claimId, timeToStart, claimRewards); + } startedPlayingCb: ?() => void; startTime: ?number; diff --git a/src/renderer/component/rewardSummary/index.js b/src/renderer/component/rewardSummary/index.js index 3ac4d29e9..331825385 100644 --- a/src/renderer/component/rewardSummary/index.js +++ b/src/renderer/component/rewardSummary/index.js @@ -1,6 +1,7 @@ import { connect } from 'react-redux'; import { selectUnclaimedRewardValue, selectFetchingRewards } from 'redux/selectors/rewards'; import { doRewardList } from 'redux/actions/rewards'; +import { doFetchRewardedContent } from 'redux/actions/content'; import RewardSummary from './view'; const select = state => ({ @@ -10,6 +11,7 @@ const select = state => ({ const perform = dispatch => ({ fetchRewards: () => dispatch(doRewardList()), + fetchRewardedContent: () => dispatch(doFetchRewardedContent()), }); export default connect( diff --git a/src/renderer/component/rewardSummary/view.jsx b/src/renderer/component/rewardSummary/view.jsx index 87b20ca6c..b849f1344 100644 --- a/src/renderer/component/rewardSummary/view.jsx +++ b/src/renderer/component/rewardSummary/view.jsx @@ -8,11 +8,13 @@ type Props = { unclaimedRewardAmount: number, fetching: boolean, fetchRewards: () => void, + fetchRewardedContent: () => void, }; class RewardSummary extends React.Component { componentDidMount() { this.props.fetchRewards(); + this.props.fetchRewardedContent(); } render() { diff --git a/src/renderer/page/discover/index.js b/src/renderer/page/discover/index.js index ea3fc0fd0..e1c16600c 100644 --- a/src/renderer/page/discover/index.js +++ b/src/renderer/page/discover/index.js @@ -1,7 +1,6 @@ -import React from 'react'; import { connect } from 'react-redux'; import { doFetchFeaturedUris } from 'redux/actions/content'; -import { selectFeaturedUris, selectFetchingFeaturedUris } from 'redux/selectors/content'; +import { selectFeaturedUris, selectFetchingFeaturedUris, doFetchRewardedContent } from 'redux/selectors/content'; import DiscoverPage from './view'; const select = state => ({ @@ -11,6 +10,10 @@ const select = state => ({ const perform = dispatch => ({ fetchFeaturedUris: () => dispatch(doFetchFeaturedUris()), + fetchRewards: () => dispatch(doFetchRewardedContent()), }); -export default connect(select, perform)(DiscoverPage); +export default connect( + select, + perform +)(DiscoverPage); diff --git a/src/renderer/page/discover/view.jsx b/src/renderer/page/discover/view.jsx index 084fbebf3..64f1e0c96 100644 --- a/src/renderer/page/discover/view.jsx +++ b/src/renderer/page/discover/view.jsx @@ -5,6 +5,7 @@ import CategoryList from 'component/categoryList'; type Props = { fetchFeaturedUris: () => void, + fetchRewards: () => void, fetchingFeaturedUris: boolean, featuredUris: {}, }; @@ -16,9 +17,14 @@ class DiscoverPage extends React.PureComponent { } componentWillMount() { - const { fetchFeaturedUris } = this.props; + const { fetchFeaturedUris, fetchRewards } = this.props; fetchFeaturedUris(); - this.continousFetch = setInterval(fetchFeaturedUris, 1000 * 60 * 60); + fetchRewards(); + + this.continousFetch = setInterval(() => { + fetchFeaturedUris(); + fetchRewards(); + }, 1000 * 60 * 60); } componentWillUnmount() { From 387a277322265f862400658eb5c3a0618171e74b Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 16:51:50 -0400 Subject: [PATCH 06/12] typo --- src/renderer/page/discover/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/page/discover/index.js b/src/renderer/page/discover/index.js index e1c16600c..e567e6a73 100644 --- a/src/renderer/page/discover/index.js +++ b/src/renderer/page/discover/index.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import { doFetchFeaturedUris } from 'redux/actions/content'; -import { selectFeaturedUris, selectFetchingFeaturedUris, doFetchRewardedContent } from 'redux/selectors/content'; +import { doFetchFeaturedUris, doFetchRewardedContent } from 'redux/actions/content'; +import { selectFeaturedUris, selectFetchingFeaturedUris } from 'redux/selectors/content'; import DiscoverPage from './view'; const select = state => ({ From 649c28dad69aa5606fe562cb9bd4f478bada43a6 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 17:14:52 -0400 Subject: [PATCH 07/12] bump lbry-redux --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ca7edcaa..49f0a23ce 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "formik": "^0.10.4", "hast-util-sanitize": "^1.1.2", "keytar": "^4.2.1", - "lbry-redux": "lbryio/lbry-redux#feffbe966fc568cef595ab66b314766261e855df", + "lbry-redux": "lbryio/lbry-redux#421321a78397251589e5a890f4caa95e79975e2b", "localforage": "^1.7.1", "mammoth": "^1.4.6", "mime": "^2.3.1", From 6f91908005b509edb680faec5a7d6d595ec392c2 Mon Sep 17 00:00:00 2001 From: YULIUS KURNIAWAN KRISTIANTO Date: Wed, 29 Aug 2018 04:15:29 +0700 Subject: [PATCH 08/12] Update view.jsx --- src/renderer/page/settings/view.jsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/renderer/page/settings/view.jsx b/src/renderer/page/settings/view.jsx index ed1c7620c..107ea6d45 100644 --- a/src/renderer/page/settings/view.jsx +++ b/src/renderer/page/settings/view.jsx @@ -348,16 +348,15 @@ class SettingsPage extends React.PureComponent { name="encrypt_wallet" onChange={e => this.onChangeEncryptWallet(e)} checked={walletEncrypted} - postfix={__('Encrypt my wallet with a custom password.')}/> -
{__( + postfix={__('Encrypt my wallet with a custom password.')} + helper={__( 'Secure your local wallet data with a custom password. Lost passwords cannot be recovered.' - )}{' '} -
- + )}/> +
{__('Application Cache')}
From f51ba5c6155f41a674dab30cd35e79f588d44c75 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 17:20:11 -0400 Subject: [PATCH 09/12] fix typo --- src/renderer/redux/actions/subscriptions.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/redux/actions/subscriptions.js b/src/renderer/redux/actions/subscriptions.js index 2b13840e2..0b7a39f78 100644 --- a/src/renderer/redux/actions/subscriptions.js +++ b/src/renderer/redux/actions/subscriptions.js @@ -249,8 +249,7 @@ export const doChannelSubscribe = (subscription: Subscription) => ( dispatch(doClaimRewardType(rewards.SUBSCRIPTION, { failSilently: true })); } - // should be subUri - dispatch(doCheckSubscription(subscription, true)); + dispatch(doCheckSubscription(subscription.uri, true)); }; export const doChannelUnsubscribe = (subscription: Subscription) => ( From 82f2d24dd33a9e8ec9ea227bcab515e72e26ba97 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 17:53:20 -0400 Subject: [PATCH 10/12] change name to fetchRewardedContent --- src/renderer/page/discover/index.js | 2 +- src/renderer/page/discover/view.jsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderer/page/discover/index.js b/src/renderer/page/discover/index.js index e567e6a73..6a35f0029 100644 --- a/src/renderer/page/discover/index.js +++ b/src/renderer/page/discover/index.js @@ -10,7 +10,7 @@ const select = state => ({ const perform = dispatch => ({ fetchFeaturedUris: () => dispatch(doFetchFeaturedUris()), - fetchRewards: () => dispatch(doFetchRewardedContent()), + fetchRewardedContent: () => dispatch(doFetchRewardedContent()), }); export default connect( diff --git a/src/renderer/page/discover/view.jsx b/src/renderer/page/discover/view.jsx index 64f1e0c96..4579f5394 100644 --- a/src/renderer/page/discover/view.jsx +++ b/src/renderer/page/discover/view.jsx @@ -5,7 +5,7 @@ import CategoryList from 'component/categoryList'; type Props = { fetchFeaturedUris: () => void, - fetchRewards: () => void, + fetchRewardedContent: () => void, fetchingFeaturedUris: boolean, featuredUris: {}, }; @@ -17,13 +17,13 @@ class DiscoverPage extends React.PureComponent { } componentWillMount() { - const { fetchFeaturedUris, fetchRewards } = this.props; + const { fetchFeaturedUris, fetchRewardedContent } = this.props; fetchFeaturedUris(); - fetchRewards(); + fetchRewardedContent(); this.continousFetch = setInterval(() => { fetchFeaturedUris(); - fetchRewards(); + fetchRewardedContent(); }, 1000 * 60 * 60); } From 6091bdec18896a0b6def744fffa897fd1b9ef7c5 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 17:54:23 -0400 Subject: [PATCH 11/12] remove old reward call --- src/renderer/redux/actions/content.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index d0db1980b..0a4e96130 100644 --- a/src/renderer/redux/actions/content.js +++ b/src/renderer/redux/actions/content.js @@ -2,7 +2,6 @@ import * as NOTIFICATION_TYPES from 'constants/notification_types'; import { ipcRenderer } from 'electron'; import Lbryio from 'lbryio'; import { doAlertError } from 'redux/actions/app'; -import { doClaimEligiblePurchaseRewards } from 'redux/actions/rewards'; import { doNavigate } from 'redux/actions/navigation'; import { setSubscriptionLatest, @@ -230,7 +229,6 @@ export function doStartDownload(uri, outpoint) { export function doDownloadFile(uri, streamInfo) { return dispatch => { dispatch(doStartDownload(uri, streamInfo.outpoint)); - dispatch(doClaimEligiblePurchaseRewards()); }; } From edf8cd65e561df389fda64de261e76bc8bf9a171 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Tue, 28 Aug 2018 20:05:14 -0400 Subject: [PATCH 12/12] update formatting --- src/renderer/page/settings/view.jsx | 23 ++++++++++++++--------- yarn.lock | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/renderer/page/settings/view.jsx b/src/renderer/page/settings/view.jsx index 107ea6d45..ab844c95c 100644 --- a/src/renderer/page/settings/view.jsx +++ b/src/renderer/page/settings/view.jsx @@ -349,15 +349,20 @@ class SettingsPage extends React.PureComponent { onChange={e => this.onChangeEncryptWallet(e)} checked={walletEncrypted} postfix={__('Encrypt my wallet with a custom password.')} - helper={__( - 'Secure your local wallet data with a custom password. Lost passwords cannot be recovered.' - )}/> -
+ helper={ + + {__( + 'Secure your local wallet data with a custom password. Lost passwords cannot be recovered.' + )}{' '} +