diff --git a/dist/bundle.es.js b/dist/bundle.es.js index bbb0504..6c3b9df 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -1805,7 +1805,7 @@ const selectClaimsByUri = reselect.createSelector(selectState$2, selectClaimsByI return claims; }); -const selectAllClaimsByChannel = reselect.createSelector(selectState$2, state => state.claimsByChannel || {}); +const selectAllClaimsByChannel = reselect.createSelector(selectState$2, state => state.paginatedClaimsByChannel || {}); const selectPendingById = reselect.createSelector(selectState$2, state => state.pendingById || {}); @@ -1891,6 +1891,16 @@ const makeSelectClaimsInChannelForPage = (uri, page) => reselect.createSelector( return claimIds.map(claimId => byId[claimId]); }); +const makeSelectTotalClaimsInChannelSearch = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, (byId, allClaims) => { + const byChannel = allClaims[uri] || {}; + return byChannel['itemCount']; +}); + +const makeSelectTotalPagesInChannelSearch = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, (byId, allClaims) => { + const byChannel = allClaims[uri] || {}; + return byChannel['pageCount']; +}); + const makeSelectClaimsInChannelForCurrentPageState = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, selectCurrentChannelPage, (byId, allClaims, page) => { const byChannel = allClaims[uri] || {}; const claimIds = byChannel[page || 1]; @@ -2031,6 +2041,12 @@ const makeSelectNsfwCountForChannel = uri => reselect.createSelector(selectClaim }, 0); }); +const makeSelectOmittedCountForChannel = uri => reselect.createSelector(makeSelectTotalItemsForChannel(uri), makeSelectTotalClaimsInChannelSearch(uri), (claimsInChannel, claimsInSearch) => { + if (claimsInChannel && claimsInSearch) { + return claimsInChannel - claimsInSearch; + } else return 0; +}); + const makeSelectClaimIsNsfw = uri => reselect.createSelector(makeSelectClaimForUri(uri), // Eventually these will come from some list of tags that are considered adult // Or possibly come from users settings of what tags they want to hide @@ -3981,7 +3997,7 @@ const reducers = {}; const defaultState = { byId: {}, claimsByUri: {}, - claimsByChannel: {}, + paginatedClaimsByChannel: {}, channelClaimCounts: {}, fetchingChannelClaims: {}, resolvingUris: [], @@ -4174,11 +4190,17 @@ reducers[FETCH_CHANNEL_CLAIMS_COMPLETED] = (state, action) => { uri, claims, claimsInChannel, - page + page, + totalPages } = action.data; + + // byChannel keeps claim_search relevant results by page. If the total changes, erase it. const channelClaimCounts = Object.assign({}, state.channelClaimCounts); - const claimsByChannel = Object.assign({}, state.claimsByChannel); - const byChannel = Object.assign({}, claimsByChannel[uri]); + + const paginatedClaimsByChannel = Object.assign({}, state.paginatedClaimsByChannel); + // check if count has changed - that means cached pagination will be wrong, so clear it + const previousCount = paginatedClaimsByChannel[uri] && paginatedClaimsByChannel[uri]['itemCount']; + const byChannel = claimsInChannel === previousCount ? Object.assign({}, paginatedClaimsByChannel[uri]) : {}; const allClaimIds = new Set(byChannel.all); const currentPageClaimIds = []; const byId = Object.assign({}, state.byId); @@ -4194,17 +4216,15 @@ reducers[FETCH_CHANNEL_CLAIMS_COMPLETED] = (state, action) => { }); } - if (claimsInChannel) { - channelClaimCounts[uri] = claimsInChannel; - } - byChannel.all = allClaimIds; + byChannel.pageCount = totalPages; + byChannel.itemCount = claimsInChannel; byChannel[page] = currentPageClaimIds; - claimsByChannel[uri] = byChannel; + paginatedClaimsByChannel[uri] = byChannel; delete fetchingChannelClaims[uri]; return Object.assign({}, state, { - claimsByChannel, + paginatedClaimsByChannel, byId, fetchingChannelClaims, claimsByUri, @@ -5481,6 +5501,7 @@ exports.makeSelectMetadataItemForUri = makeSelectMetadataItemForUri; exports.makeSelectMyStreamUrlsForPage = makeSelectMyStreamUrlsForPage; exports.makeSelectNsfwCountForChannel = makeSelectNsfwCountForChannel; exports.makeSelectNsfwCountFromUris = makeSelectNsfwCountFromUris; +exports.makeSelectOmittedCountForChannel = makeSelectOmittedCountForChannel; exports.makeSelectPendingByUri = makeSelectPendingByUri; exports.makeSelectPermanentUrlForUri = makeSelectPermanentUrlForUri; exports.makeSelectPublishFormValue = makeSelectPublishFormValue; @@ -5495,8 +5516,10 @@ exports.makeSelectSupportsForUri = makeSelectSupportsForUri; exports.makeSelectTagsForUri = makeSelectTagsForUri; exports.makeSelectThumbnailForUri = makeSelectThumbnailForUri; exports.makeSelectTitleForUri = makeSelectTitleForUri; +exports.makeSelectTotalClaimsInChannelSearch = makeSelectTotalClaimsInChannelSearch; exports.makeSelectTotalItemsForChannel = makeSelectTotalItemsForChannel; exports.makeSelectTotalPagesForChannel = makeSelectTotalPagesForChannel; +exports.makeSelectTotalPagesInChannelSearch = makeSelectTotalPagesInChannelSearch; exports.makeSelectUriIsStreamable = makeSelectUriIsStreamable; exports.normalizeURI = normalizeURI; exports.notificationsReducer = notificationsReducer; diff --git a/src/index.js b/src/index.js index 7812297..9b9f572 100644 --- a/src/index.js +++ b/src/index.js @@ -159,6 +159,8 @@ export { makeSelectClaimIsMine, makeSelectFetchingChannelClaims, makeSelectClaimsInChannelForPage, + makeSelectTotalPagesInChannelSearch, + makeSelectTotalClaimsInChannelSearch, makeSelectMetadataForUri, makeSelectMetadataItemForUri, makeSelectThumbnailForUri, @@ -173,6 +175,7 @@ export { makeSelectTotalPagesForChannel, makeSelectNsfwCountFromUris, makeSelectNsfwCountForChannel, + makeSelectOmittedCountForChannel, makeSelectClaimIsNsfw, makeSelectRecommendedContentForUri, makeSelectFirstRecommendedFileForUri, diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js index d5154a4..8e6b121 100644 --- a/src/redux/reducers/claims.js +++ b/src/redux/reducers/claims.js @@ -28,9 +28,11 @@ type State = { claimSearchByQuery: { [string]: Array<string> }, claimSearchByQueryLastPageReached: { [string]: Array<boolean> }, creatingChannel: boolean, - claimsByChannel: { + paginatedClaimsByChannel: { [string]: { all: Array<string>, + pageCount: number, + itemCount: number, [number]: Array<string>, }, }, @@ -43,7 +45,7 @@ const reducers = {}; const defaultState = { byId: {}, claimsByUri: {}, - claimsByChannel: {}, + paginatedClaimsByChannel: {}, channelClaimCounts: {}, fetchingChannelClaims: {}, resolvingUris: [], @@ -248,15 +250,22 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state: State, action: any): claims, claimsInChannel, page, + totalPages, }: { uri: string, claims: Array<StreamClaim>, claimsInChannel?: number, page: number, + totalPages: number, } = action.data; + + // byChannel keeps claim_search relevant results by page. If the total changes, erase it. const channelClaimCounts = Object.assign({}, state.channelClaimCounts); - const claimsByChannel = Object.assign({}, state.claimsByChannel); - const byChannel = Object.assign({}, claimsByChannel[uri]); + + const paginatedClaimsByChannel = Object.assign({}, state.paginatedClaimsByChannel); + // check if count has changed - that means cached pagination will be wrong, so clear it + const previousCount = paginatedClaimsByChannel[uri] && paginatedClaimsByChannel[uri]['itemCount']; + const byChannel = (claimsInChannel === previousCount) ? Object.assign({}, paginatedClaimsByChannel[uri]) : {}; const allClaimIds = new Set(byChannel.all); const currentPageClaimIds = []; const byId = Object.assign({}, state.byId); @@ -272,17 +281,15 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state: State, action: any): }); } - if (claimsInChannel) { - channelClaimCounts[uri] = claimsInChannel; - } - byChannel.all = allClaimIds; + byChannel.pageCount = totalPages; + byChannel.itemCount = claimsInChannel; byChannel[page] = currentPageClaimIds; - claimsByChannel[uri] = byChannel; + paginatedClaimsByChannel[uri] = byChannel; delete fetchingChannelClaims[uri]; return Object.assign({}, state, { - claimsByChannel, + paginatedClaimsByChannel, byId, fetchingChannelClaims, claimsByUri, diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index d90936e..b6cb93c 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -54,7 +54,7 @@ export const selectClaimsByUri = createSelector( export const selectAllClaimsByChannel = createSelector( selectState, - state => state.claimsByChannel || {} + state => state.paginatedClaimsByChannel || {} ); export const selectPendingById = createSelector( @@ -192,6 +192,27 @@ export const makeSelectClaimsInChannelForPage = (uri: string, page?: number) => } ); +export const makeSelectTotalClaimsInChannelSearch = (uri: string) => + createSelector( + selectClaimsById, + selectAllClaimsByChannel, + (byId, allClaims) => { + const byChannel = allClaims[uri] || {}; + return byChannel['itemCount']; + } + ); + +export const makeSelectTotalPagesInChannelSearch = (uri: string) => + createSelector( + selectClaimsById, + selectAllClaimsByChannel, + (byId, allClaims) => { + const byChannel = allClaims[uri] || {}; + return byChannel['pageCount']; + } + ); + + export const makeSelectClaimsInChannelForCurrentPageState = (uri: string) => createSelector( selectClaimsById, @@ -445,6 +466,18 @@ export const makeSelectNsfwCountForChannel = (uri: string) => } ); +export const makeSelectOmittedCountForChannel = (uri: string) => + createSelector( + makeSelectTotalItemsForChannel(uri), + makeSelectTotalClaimsInChannelSearch(uri), + (claimsInChannel, claimsInSearch) => { + if (claimsInChannel && claimsInSearch) { + return claimsInChannel - claimsInSearch; + } + else return 0; + } + ); + export const makeSelectClaimIsNsfw = (uri: string): boolean => createSelector( makeSelectClaimForUri(uri),