Cancel resolving URis when unmounting discover/file list pages

This commit is contained in:
6ea86b96 2017-06-29 14:58:15 +07:00
parent e6f1dea9d5
commit ef8bd5f986
9 changed files with 60 additions and 11 deletions

View file

@ -50,6 +50,37 @@ export function doResolveUri(uri) {
}; };
} }
export function doCancelResolveUri(uri) {
return function(dispatch, getState) {
uri = lbryuri.normalize(uri);
const state = getState();
const alreadyResolving = selectResolvingUris(state).indexOf(uri) !== -1;
if (alreadyResolving) {
lbry.cancelResolve({ uri });
dispatch({
type: types.RESOLVE_URI_CANCELED,
data: {
uri,
},
});
}
};
}
export function doCancelAllResolvingUris() {
return function(dispatch, getState) {
const state = getState();
const resolvingUris = selectResolvingUris(state);
const actions = [];
resolvingUris.forEach(uri => actions.push(doCancelResolveUri(uri)));
dispatch(batchActions(...actions));
};
}
export function doFetchFeaturedUris() { export function doFetchFeaturedUris() {
return function(dispatch, getState) { return function(dispatch, getState) {
const state = getState(); const state = getState();

View file

@ -40,6 +40,7 @@ export const FETCH_FEATURED_CONTENT_COMPLETED =
"FETCH_FEATURED_CONTENT_COMPLETED"; "FETCH_FEATURED_CONTENT_COMPLETED";
export const RESOLVE_URI_STARTED = "RESOLVE_URI_STARTED"; export const RESOLVE_URI_STARTED = "RESOLVE_URI_STARTED";
export const RESOLVE_URI_COMPLETED = "RESOLVE_URI_COMPLETED"; export const RESOLVE_URI_COMPLETED = "RESOLVE_URI_COMPLETED";
export const RESOLVE_URI_CANCELED = "RESOLVE_URI_CANCELED";
export const FETCH_CHANNEL_CLAIMS_STARTED = "FETCH_CHANNEL_CLAIMS_STARTED"; export const FETCH_CHANNEL_CLAIMS_STARTED = "FETCH_CHANNEL_CLAIMS_STARTED";
export const FETCH_CHANNEL_CLAIMS_COMPLETED = "FETCH_CHANNEL_CLAIMS_COMPLETED"; export const FETCH_CHANNEL_CLAIMS_COMPLETED = "FETCH_CHANNEL_CLAIMS_COMPLETED";
export const FETCH_CLAIM_LIST_MINE_STARTED = "FETCH_CLAIM_LIST_MINE_STARTED"; export const FETCH_CLAIM_LIST_MINE_STARTED = "FETCH_CLAIM_LIST_MINE_STARTED";

View file

@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { doFetchFeaturedUris } from "actions/content"; import { doFetchFeaturedUris, doCancelAllResolvingUris } from "actions/content";
import { import {
selectFeaturedUris, selectFeaturedUris,
selectFetchingFeaturedUris, selectFetchingFeaturedUris,
@ -14,6 +14,7 @@ const select = state => ({
const perform = dispatch => ({ const perform = dispatch => ({
fetchFeaturedUris: () => dispatch(doFetchFeaturedUris()), fetchFeaturedUris: () => dispatch(doFetchFeaturedUris()),
cancelResolvingUris: () => dispatch(doCancelAllResolvingUris()),
}); });
export default connect(select, perform)(DiscoverPage); export default connect(select, perform)(DiscoverPage);

View file

@ -39,6 +39,10 @@ class DiscoverPage extends React.PureComponent {
this.props.fetchFeaturedUris(); this.props.fetchFeaturedUris();
} }
componentWillUnmount() {
this.props.cancelResolvingUris();
}
render() { render() {
const { featuredUris, fetchingFeaturedUris } = this.props; const { featuredUris, fetchingFeaturedUris } = this.props;
const failedToLoad = const failedToLoad =
@ -62,7 +66,9 @@ class DiscoverPage extends React.PureComponent {
: "" : ""
)} )}
{failedToLoad && {failedToLoad &&
<div className="empty">{__("Failed to load landing content.")}</div>} <div className="empty">
{__("Failed to load landing content.")}
</div>}
</main> </main>
); );
} }

View file

@ -6,6 +6,7 @@ import {
selectFileListDownloadedOrPublishedIsPending, selectFileListDownloadedOrPublishedIsPending,
} from "selectors/file_info"; } from "selectors/file_info";
import { doNavigate } from "actions/app"; import { doNavigate } from "actions/app";
import { doCancelAllResolvingUris } from "actions/content";
import FileListDownloaded from "./view"; import FileListDownloaded from "./view";
const select = state => ({ const select = state => ({
@ -17,6 +18,7 @@ const perform = dispatch => ({
navigate: path => dispatch(doNavigate(path)), navigate: path => dispatch(doNavigate(path)),
fetchFileInfosDownloaded: () => fetchFileInfosDownloaded: () =>
dispatch(doFetchFileInfosAndPublishedClaims()), dispatch(doFetchFileInfosAndPublishedClaims()),
cancelResolvingUris: () => dispatch(doCancelAllResolvingUris()),
}); });
export default connect(select, perform)(FileListDownloaded); export default connect(select, perform)(FileListDownloaded);

View file

@ -15,6 +15,10 @@ class FileListDownloaded extends React.PureComponent {
if (!this.props.isPending) this.props.fetchFileInfosDownloaded(); if (!this.props.isPending) this.props.fetchFileInfosDownloaded();
} }
componentWillUnmount() {
this.props.cancelResolvingUris();
}
render() { render() {
const { fileInfos, isPending, navigate } = this.props; const { fileInfos, isPending, navigate } = this.props;
@ -27,8 +31,7 @@ class FileListDownloaded extends React.PureComponent {
} else { } else {
content = ( content = (
<span> <span>
{__("You haven't downloaded anything from LBRY yet. Go")} {__("You haven't downloaded anything from LBRY yet. Go")}{" "}
{" "}
<Link <Link
onClick={() => navigate("/discover")} onClick={() => navigate("/discover")}
label={__("search for your first download")} label={__("search for your first download")}

View file

@ -8,6 +8,7 @@ import {
} from "selectors/file_info"; } from "selectors/file_info";
import { doClaimRewardType } from "actions/rewards"; import { doClaimRewardType } from "actions/rewards";
import { doNavigate } from "actions/app"; import { doNavigate } from "actions/app";
import { doCancelAllResolvingUris } from "actions/content";
import FileListPublished from "./view"; import FileListPublished from "./view";
const select = state => ({ const select = state => ({
@ -20,6 +21,7 @@ const perform = dispatch => ({
fetchFileListPublished: () => dispatch(doFetchFileInfosAndPublishedClaims()), fetchFileListPublished: () => dispatch(doFetchFileInfosAndPublishedClaims()),
claimFirstPublishReward: () => claimFirstPublishReward: () =>
dispatch(doClaimRewardType(rewards.TYPE_FIRST_PUBLISH)), dispatch(doClaimRewardType(rewards.TYPE_FIRST_PUBLISH)),
cancelResolvingUris: () => dispatch(doCancelAllResolvingUris()),
}); });
export default connect(select, perform)(FileListPublished); export default connect(select, perform)(FileListPublished);

View file

@ -19,6 +19,10 @@ class FileListPublished extends React.PureComponent {
if (this.props.fileInfos.length > 0) this.props.claimFirstPublishReward(); if (this.props.fileInfos.length > 0) this.props.claimFirstPublishReward();
} }
componentWillUnmount() {
this.props.cancelResolvingUris();
}
render() { render() {
const { fileInfos, isPending, navigate } = this.props; const { fileInfos, isPending, navigate } = this.props;
@ -38,8 +42,9 @@ class FileListPublished extends React.PureComponent {
} else { } else {
content = ( content = (
<span> <span>
{__("It looks like you haven't published anything to LBRY yet. Go")} {__(
{" "} "It looks like you haven't published anything to LBRY yet. Go"
)}{" "}
<Link <Link
onClick={() => navigate("/publish")} onClick={() => navigate("/publish")}
label={__("share your beautiful cats with the world")} label={__("share your beautiful cats with the world")}

View file

@ -31,7 +31,9 @@ reducers[types.RESOLVE_URI_STARTED] = function(state, action) {
}); });
}; };
reducers[types.RESOLVE_URI_COMPLETED] = function(state, action) { reducers[types.RESOLVE_URI_CANCELED] = reducers[
types.RESOLVE_URI_COMPLETED
] = function(state, action) {
const { uri } = action.data; const { uri } = action.data;
const resolvingUris = state.resolvingUris; const resolvingUris = state.resolvingUris;
const index = state.resolvingUris.indexOf(uri); const index = state.resolvingUris.indexOf(uri);
@ -45,10 +47,6 @@ reducers[types.RESOLVE_URI_COMPLETED] = function(state, action) {
}); });
}; };
reducers[types.RESOLVE_URI_CANCELED] = function(state, action) {
return reducers[types.RESOLVE_URI_COMPLETED](state, action);
};
export default function reducer(state = defaultState, action) { export default function reducer(state = defaultState, action) {
const handler = reducers[action.type]; const handler = reducers[action.type];
if (handler) return handler(state, action); if (handler) return handler(state, action);