From 3735498785ca3e5aed3c35d19db9db0bc5559c8c Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Thu, 12 Oct 2017 09:37:24 -0400 Subject: [PATCH] saner paging, fix resolving uri state, fix counts in channel results, fix search prefix --- app/package.json | 2 +- ui/js/actions/content.js | 9 ++++--- ui/js/actions/search.js | 4 ++- ui/js/component/channelTile/index.js | 6 +++-- ui/js/component/channelTile/view.jsx | 18 ++++++++------ ui/js/reducers/content.js | 37 +++++++++++++++++----------- ui/js/selectors/content.js | 14 +++++------ ui/js/selectors/search.js | 6 ++++- 8 files changed, 57 insertions(+), 39 deletions(-) diff --git a/app/package.json b/app/package.json index 37c2f2ab3..92b1ff311 100644 --- a/app/package.json +++ b/app/package.json @@ -20,7 +20,7 @@ "electron-rebuild": "^1.5.11" }, "lbrySettings": { - "lbrynetDaemonVersion": "0.17.0rc13", + "lbrynetDaemonVersion": "0.17.0rc16", "lbrynetDaemonUrlTemplate": "https://github.com/lbryio/lbry/releases/download/vDAEMONVER/lbrynet-daemon-vDAEMONVER-OSNAME.zip" }, "license": "MIT" diff --git a/ui/js/actions/content.js b/ui/js/actions/content.js index 912b06d11..be444a26a 100644 --- a/ui/js/actions/content.js +++ b/ui/js/actions/content.js @@ -45,11 +45,12 @@ export function doResolveUris(uris) { let resolveInfo = {}; lbry.resolve({ uris: urisToResolve }).then(result => { for (let [uri, uriResolveInfo] of Object.entries(result)) { - const { claim, certificate } = uriResolveInfo || { - claim: null, - certificate: null, + const { claim, certificate, claims_in_channel } = uriResolveInfo || { + claim: undefined, + claims_in_channel: undefined, + certificate: undefined, }; - resolveInfo[uri] = { claim, certificate }; + resolveInfo[uri] = { claim, certificate, claims_in_channel }; } dispatch({ diff --git a/ui/js/actions/search.js b/ui/js/actions/search.js index a83ce60bb..e26251e3e 100644 --- a/ui/js/actions/search.js +++ b/ui/js/actions/search.js @@ -5,11 +5,13 @@ import { doNavigate } from "actions/navigation"; import { selectCurrentPage } from "selectors/navigation"; import batchActions from "util/batchActions"; -export function doSearch(query) { +export function doSearch(rawQuery) { return function(dispatch, getState) { const state = getState(); const page = selectCurrentPage(state); + const query = rawQuery.replace(/^lbry:\/\//, ""); + if (!query) { return dispatch({ type: types.SEARCH_CANCELLED, diff --git a/ui/js/component/channelTile/index.js b/ui/js/component/channelTile/index.js index 2e4c438f7..6cc68149f 100644 --- a/ui/js/component/channelTile/index.js +++ b/ui/js/component/channelTile/index.js @@ -1,19 +1,21 @@ import React from "react"; import { connect } from "react-redux"; -import { doFetchClaimCountByChannel } from "actions/content"; import { makeSelectClaimForUri } from "selectors/claims"; import { doNavigate } from "actions/navigation"; +import { doResolveUri } from "actions/content"; import { makeSelectTotalItemsForChannel } from "selectors/content"; +import { makeSelectIsUriResolving } from "selectors/content"; import ChannelTile from "./view"; const select = (state, props) => ({ claim: makeSelectClaimForUri(props.uri)(state), + isResolvingUri: makeSelectIsUriResolving(props.uri)(state), totalItems: makeSelectTotalItemsForChannel(props.uri)(state), }); const perform = dispatch => ({ - fetchClaimCount: uri => dispatch(doFetchClaimCountByChannel(uri)), navigate: (path, params) => dispatch(doNavigate(path, params)), + resolveUri: uri => dispatch(doResolveUri(uri)), }); export default connect(select, perform)(ChannelTile); diff --git a/ui/js/component/channelTile/view.jsx b/ui/js/component/channelTile/view.jsx index 973d1dff5..6082ec58a 100644 --- a/ui/js/component/channelTile/view.jsx +++ b/ui/js/component/channelTile/view.jsx @@ -3,21 +3,21 @@ import { TruncatedText, BusyMessage } from "component/common.js"; class ChannelTile extends React.PureComponent { componentDidMount() { - const { uri, fetchClaimCount } = this.props; + const { uri, resolveUri } = this.props; - fetchClaimCount(uri); + resolveUri(uri); } componentWillReceiveProps(nextProps) { - const { uri, fetchClaimCount } = this.props; + const { uri, resolveUri } = this.props; if (nextProps.uri != uri) { - fetchClaimCount(uri); + resolveUri(uri); } } render() { - const { navigate, totalItems, uri } = this.props; + const { claim, navigate, isResolvingUri, totalItems, uri } = this.props; let onClick = () => navigate("/show", { uri }); @@ -31,13 +31,15 @@ class ChannelTile extends React.PureComponent {
- {isNaN(totalItems) && + {isResolvingUri && } {totalItems > 0 && - This is a channel with over {totalItems} items inside of it. + This is a channel with {totalItems}{" "} + {totalItems === 1 ? " item" : " items"} inside of it. } - {totalItems === 0 && + {!isResolvingUri && + !totalItems && This is an empty channel.}
diff --git a/ui/js/reducers/content.js b/ui/js/reducers/content.js index 5afb2790a..0d2b8cd09 100644 --- a/ui/js/reducers/content.js +++ b/ui/js/reducers/content.js @@ -4,7 +4,7 @@ const reducers = {}; const defaultState = { playingUri: null, rewardedContentClaimIds: [], - channelPages: {}, + channelClaimCounts: {}, }; reducers[types.FETCH_FEATURED_CONTENT_STARTED] = function(state, action) { @@ -48,31 +48,38 @@ reducers[types.RESOLVE_URIS_STARTED] = function(state, action) { }); }; +reducers[types.RESOLVE_URIS_COMPLETED] = function(state, action) { + const { resolveInfo } = action.data; + const channelClaimCounts = Object.assign({}, state.channelClaimCounts); + + for (let [uri, { certificate, claims_in_channel }] of Object.entries( + resolveInfo + )) { + if (certificate && !isNaN(claims_in_channel)) { + channelClaimCounts[uri] = claims_in_channel; + } + } + + return Object.assign({}, state, { + channelClaimCounts, + resolvingUris: (state.resolvingUris || []).filter(uri => !resolveInfo[uri]), + }); +}; + reducers[types.SET_PLAYING_URI] = (state, action) => { return Object.assign({}, state, { playingUri: action.data.uri, }); }; -// reducers[types.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) { -// const channelPages = Object.assign({}, state.channelPages); -// const { uri, claims } = action.data; -// -// channelPages[uri] = totalPages; -// -// return Object.assign({}, state, { -// channelPages, -// }); -// }; - reducers[types.FETCH_CHANNEL_CLAIM_COUNT_COMPLETED] = function(state, action) { - const channelPages = Object.assign({}, state.channelPages); + const channelClaimCounts = Object.assign({}, state.channelClaimCounts); const { uri, totalClaims } = action.data; - channelPages[uri] = Math.ceil(totalClaims / 10); + channelClaimCounts[uri] = totalClaims; return Object.assign({}, state, { - channelPages, + channelClaimCounts, }); }; diff --git a/ui/js/selectors/content.js b/ui/js/selectors/content.js index 8e083ca93..a1c98f049 100644 --- a/ui/js/selectors/content.js +++ b/ui/js/selectors/content.js @@ -29,20 +29,20 @@ export const makeSelectIsUriResolving = uri => { ); }; -export const selectChannelPages = createSelector( +export const selectChannelClaimCounts = createSelector( _selectState, - state => state.channelPages || {} + state => state.channelClaimCounts || {} ); export const makeSelectTotalItemsForChannel = uri => { - return createSelector( - selectChannelPages, - byUri => (byUri && byUri[uri]) * 10 - ); + return createSelector(selectChannelClaimCounts, byUri => byUri && byUri[uri]); }; export const makeSelectTotalPagesForChannel = uri => { - return createSelector(selectChannelPages, byUri => byUri && byUri[uri]); + return createSelector( + selectChannelClaimCounts, + byUri => byUri && byUri[uri] && Math.ceil(byUri[uri] / 10) + ); }; export const selectRewardContentClaimIds = createSelector( diff --git a/ui/js/selectors/search.js b/ui/js/selectors/search.js index 09468a43c..b1792c4a0 100644 --- a/ui/js/selectors/search.js +++ b/ui/js/selectors/search.js @@ -24,7 +24,11 @@ export const selectSearchUrisByQuery = createSelector( ); export const makeSelectSearchUris = query => { - return createSelector(selectSearchUrisByQuery, byQuery => byQuery[query]); + //replace statement below is kind of ugly, and repeated in doSearch action + return createSelector( + selectSearchUrisByQuery, + byQuery => byQuery[query ? query.replace(/^lbry:\/\//, "") : query] + ); }; export const selectWunderBarAddress = createSelector(