From b59fdfa1d8191b0930ec97b2c70e2918e790c843 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Mon, 15 Jul 2019 03:44:02 +0100 Subject: [PATCH] support multiple simultaneous claim_search requests --- dist/bundle.es.js | 89 +++++++++++++++++++++++++++++++++++ src/constants/action_types.js | 3 ++ src/index.js | 5 ++ src/redux/actions/claims.js | 38 +++++++++++++++ src/redux/reducers/claims.js | 35 ++++++++++++++ src/redux/selectors/claims.js | 22 +++++++++ 6 files changed, 192 insertions(+) diff --git a/dist/bundle.es.js b/dist/bundle.es.js index 9d26ff4..eefdaaa 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -117,6 +117,9 @@ const CLEAR_CONTENT_HISTORY_ALL = 'CLEAR_CONTENT_HISTORY_ALL'; const CLAIM_SEARCH_STARTED = 'CLAIM_SEARCH_STARTED'; const CLAIM_SEARCH_COMPLETED = 'CLAIM_SEARCH_COMPLETED'; const CLAIM_SEARCH_FAILED = 'CLAIM_SEARCH_FAILED'; +const CLAIM_SEARCH_BY_TAGS_STARTED = 'CLAIM_SEARCH_BY_TAGS_STARTED'; +const CLAIM_SEARCH_BY_TAGS_COMPLETED = 'CLAIM_SEARCH_BY_TAGS_COMPLETED'; +const CLAIM_SEARCH_BY_TAGS_FAILED = 'CLAIM_SEARCH_BY_TAGS_FAILED'; // Comments const COMMENT_LIST_STARTED = 'COMMENT_LIST_STARTED'; @@ -345,6 +348,9 @@ var action_types = /*#__PURE__*/Object.freeze({ CLAIM_SEARCH_STARTED: CLAIM_SEARCH_STARTED, CLAIM_SEARCH_COMPLETED: CLAIM_SEARCH_COMPLETED, CLAIM_SEARCH_FAILED: CLAIM_SEARCH_FAILED, + CLAIM_SEARCH_BY_TAGS_STARTED: CLAIM_SEARCH_BY_TAGS_STARTED, + CLAIM_SEARCH_BY_TAGS_COMPLETED: CLAIM_SEARCH_BY_TAGS_COMPLETED, + CLAIM_SEARCH_BY_TAGS_FAILED: CLAIM_SEARCH_BY_TAGS_FAILED, COMMENT_LIST_STARTED: COMMENT_LIST_STARTED, COMMENT_LIST_COMPLETED: COMMENT_LIST_COMPLETED, COMMENT_LIST_FAILED: COMMENT_LIST_FAILED, @@ -1511,6 +1517,14 @@ const selectLastClaimSearchUris = reselect.createSelector(selectState$1, state = const makeSelectShortUrlForUri = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => claim && claim.short_url); +const selectFetchingClaimSearchByTags = reselect.createSelector(selectState$1, state => state.fetchingClaimSearchByTags); + +const selectClaimSearchUrisByTags = reselect.createSelector(selectState$1, state => state.claimSearchUrisByTags); + +const makeSelectFetchingClaimSearchForTags = tags => reselect.createSelector(selectFetchingClaimSearchByTags, byTags => byTags[tags]); + +const makeSelectClaimSearchUrisForTags = tags => reselect.createSelector(selectClaimSearchUrisByTags, byTags => byTags[tags]); + const selectState$2 = state => state.wallet || {}; const selectWalletState = selectState$2; @@ -2336,6 +2350,43 @@ function doClaimSearch(amount = 20, options = {}) { }; } +// tags can be one or many (comma separated) +function doClaimSearchByTags(tags, amount = 10, options = {}) { + return dispatch => { + const tagList = tags.join(','); + dispatch({ + type: CLAIM_SEARCH_BY_TAGS_STARTED, + data: { tags: tagList } + }); + + const success = data => { + const resolveInfo = {}; + const uris = []; + data.items.forEach(stream => { + resolveInfo[stream.permanent_url] = { stream }; + uris.push(stream.permanent_url); + }); + + dispatch({ + type: CLAIM_SEARCH_BY_TAGS_COMPLETED, + data: { tags: tagList, resolveInfo, uris, append: options.page && options.page !== 1 } + }); + }; + + const failure = err => { + dispatch({ + type: CLAIM_SEARCH_BY_TAGS_FAILED, + data: { tags: tagList }, + error: err + }); + }; + + lbryProxy.claim_search(_extends$3({ + page_size: amount + }, options)).then(success, failure); + }; +} + const selectState$3 = state => state.fileInfo || {}; const selectFileInfosByOutpoint = reselect.createSelector(selectState$3, state => state.byOutpoint || {}); @@ -3332,6 +3383,8 @@ const defaultState = { abandoningById: {}, pendingById: {}, fetchingClaimSearch: false, + claimSearchUrisByTags: [], + fetchingClaimSearchByTags: [], lastClaimSearchUris: [] }; @@ -3587,6 +3640,37 @@ reducers[CLAIM_SEARCH_FAILED] = state => { }); }; +reducers[CLAIM_SEARCH_BY_TAGS_STARTED] = (state, action) => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + fetchingClaimSearchByTags[action.data.tags] = true; + + return Object.assign({}, state, { + fetchingClaimSearchByTags + }); +}; +reducers[CLAIM_SEARCH_BY_TAGS_COMPLETED] = (state, action) => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + const claimSearchUrisByTags = Object.assign({}, state.claimSearchUrisByTags); + const { tags, uris } = action.data; + + // TODO: append? + claimSearchUrisByTags[tags] = uris; + fetchingClaimSearchByTags[tags] = false; // or delete the key instead? + + return Object.assign({}, state, { + claimSearchUrisByTags, + fetchingClaimSearchByTags + }); +}; +reducers[CLAIM_SEARCH_BY_TAGS_FAILED] = (state, action) => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + fetchingClaimSearchByTags[action.data.tags] = false; + + return Object.assign({}, state, { + fetchingClaimSearchByTags + }); +}; + function claimsReducer(state = defaultState, action) { const handler = reducers[action.type]; if (handler) return handler(state, action); @@ -4664,6 +4748,7 @@ exports.doBlurSearchInput = doBlurSearchInput; exports.doCheckAddressIsMine = doCheckAddressIsMine; exports.doCheckPendingPublishes = doCheckPendingPublishes; exports.doClaimSearch = doClaimSearch; +exports.doClaimSearchByTags = doClaimSearchByTags; exports.doClearPublish = doClearPublish; exports.doCommentCreate = doCommentCreate; exports.doCommentList = doCommentList; @@ -4725,6 +4810,7 @@ exports.makeSelectClaimForUri = makeSelectClaimForUri; exports.makeSelectClaimIsMine = makeSelectClaimIsMine; exports.makeSelectClaimIsNsfw = makeSelectClaimIsNsfw; exports.makeSelectClaimIsPending = makeSelectClaimIsPending; +exports.makeSelectClaimSearchUrisForTags = makeSelectClaimSearchUrisForTags; exports.makeSelectClaimsInChannelForCurrentPageState = makeSelectClaimsInChannelForCurrentPageState; exports.makeSelectClaimsInChannelForPage = makeSelectClaimsInChannelForPage; exports.makeSelectCommentsForUri = makeSelectCommentsForUri; @@ -4734,6 +4820,7 @@ exports.makeSelectCoverForUri = makeSelectCoverForUri; exports.makeSelectDateForUri = makeSelectDateForUri; exports.makeSelectDownloadingForUri = makeSelectDownloadingForUri; exports.makeSelectFetchingChannelClaims = makeSelectFetchingChannelClaims; +exports.makeSelectFetchingClaimSearchForTags = makeSelectFetchingClaimSearchForTags; exports.makeSelectFileInfoForUri = makeSelectFileInfoForUri; exports.makeSelectFirstRecommendedFileForUri = makeSelectFirstRecommendedFileForUri; exports.makeSelectIsUriResolving = makeSelectIsUriResolving; @@ -4769,6 +4856,7 @@ exports.selectAllMyClaimsByOutpoint = selectAllMyClaimsByOutpoint; exports.selectBalance = selectBalance; exports.selectBlocks = selectBlocks; exports.selectChannelClaimCounts = selectChannelClaimCounts; +exports.selectClaimSearchUrisByTags = selectClaimSearchUrisByTags; exports.selectClaimsById = selectClaimsById; exports.selectClaimsByUri = selectClaimsByUri; exports.selectCurrentChannelPage = selectCurrentChannelPage; @@ -4782,6 +4870,7 @@ exports.selectDraftTransactionError = selectDraftTransactionError; exports.selectError = selectError; exports.selectFailedPurchaseUris = selectFailedPurchaseUris; exports.selectFetchingClaimSearch = selectFetchingClaimSearch; +exports.selectFetchingClaimSearchByTags = selectFetchingClaimSearchByTags; exports.selectFetchingMyChannels = selectFetchingMyChannels; exports.selectFileInfosByOutpoint = selectFileInfosByOutpoint; exports.selectFileInfosDownloaded = selectFileInfosDownloaded; diff --git a/src/constants/action_types.js b/src/constants/action_types.js index bdbad5d..d4e3a3e 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -94,6 +94,9 @@ export const CLEAR_CONTENT_HISTORY_ALL = 'CLEAR_CONTENT_HISTORY_ALL'; export const CLAIM_SEARCH_STARTED = 'CLAIM_SEARCH_STARTED'; export const CLAIM_SEARCH_COMPLETED = 'CLAIM_SEARCH_COMPLETED'; export const CLAIM_SEARCH_FAILED = 'CLAIM_SEARCH_FAILED'; +export const CLAIM_SEARCH_BY_TAGS_STARTED = 'CLAIM_SEARCH_BY_TAGS_STARTED'; +export const CLAIM_SEARCH_BY_TAGS_COMPLETED = 'CLAIM_SEARCH_BY_TAGS_COMPLETED'; +export const CLAIM_SEARCH_BY_TAGS_FAILED = 'CLAIM_SEARCH_BY_TAGS_FAILED'; // Comments export const COMMENT_LIST_STARTED = 'COMMENT_LIST_STARTED'; diff --git a/src/index.js b/src/index.js index 3c7c82f..5cbdb71 100644 --- a/src/index.js +++ b/src/index.js @@ -55,6 +55,7 @@ export { doCreateChannel, doUpdateChannel, doClaimSearch, + doClaimSearchByTags, } from 'redux/actions/claims'; export { doDeletePurchasedUri, doPurchaseUri, doFileGet } from 'redux/actions/file'; @@ -193,6 +194,10 @@ export { selectCurrentChannelPage, selectFetchingClaimSearch, selectLastClaimSearchUris, + selectFetchingClaimSearchByTags, + selectClaimSearchUrisByTags, + makeSelectFetchingClaimSearchForTags, + makeSelectClaimSearchUrisForTags, } from 'redux/selectors/claims'; export { makeSelectCommentsForUri } from 'redux/selectors/comments'; diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js index 51fd397..b52faed 100644 --- a/src/redux/actions/claims.js +++ b/src/redux/actions/claims.js @@ -332,3 +332,41 @@ export function doClaimSearch(amount: number = 20, options: { page?: number } = }).then(success, failure); }; } + +// tags can be one or many (comma separated) +export function doClaimSearchByTags(tags: Array, amount: number = 10, options: { page?: number } = {}) { + return (dispatch: Dispatch) => { + const tagList = tags.join(','); + dispatch({ + type: ACTIONS.CLAIM_SEARCH_BY_TAGS_STARTED, + data: { tags: tagList }, + }); + + const success = (data: ClaimSearchResponse) => { + const resolveInfo = {}; + const uris = []; + data.items.forEach((stream: Claim) => { + resolveInfo[stream.permanent_url] = { stream }; + uris.push(stream.permanent_url); + }); + + dispatch({ + type: ACTIONS.CLAIM_SEARCH_BY_TAGS_COMPLETED, + data: { tags: tagList, resolveInfo, uris, append: options.page && options.page !== 1 }, + }); + }; + + const failure = err => { + dispatch({ + type: ACTIONS.CLAIM_SEARCH_BY_TAGS_FAILED, + data: { tags: tagList }, + error: err, + }); + }; + + Lbry.claim_search({ + page_size: amount, + ...options, + }).then(success, failure); + }; +} diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js index 99a8f7f..e6e7794 100644 --- a/src/redux/reducers/claims.js +++ b/src/redux/reducers/claims.js @@ -22,6 +22,8 @@ type State = { fetchingChannelClaims: { [string]: number }, fetchingMyChannels: boolean, lastClaimSearchUris: Array, + fetchingClaimSearchByTags: { [string]: boolean }, + claimSearchUrisByTags: { [string]: { all: Array } }, claimsByChannel: { [string]: { all: Array, @@ -45,6 +47,8 @@ const defaultState = { abandoningById: {}, pendingById: {}, fetchingClaimSearch: false, + claimSearchUrisByTags: [], + fetchingClaimSearchByTags: [], lastClaimSearchUris: [], }; @@ -312,6 +316,37 @@ reducers[ACTIONS.CLAIM_SEARCH_FAILED] = (state: State): State => { }); }; +reducers[ACTIONS.CLAIM_SEARCH_BY_TAGS_STARTED] = (state: State, action: any): State => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + fetchingClaimSearchByTags[action.data.tags] = true; + + return Object.assign({}, state, { + fetchingClaimSearchByTags + }); +}; +reducers[ACTIONS.CLAIM_SEARCH_BY_TAGS_COMPLETED] = (state: State, action: any): State => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + const claimSearchUrisByTags = Object.assign({}, state.claimSearchUrisByTags); + const { tags, uris } = action.data; + + // TODO: append? + claimSearchUrisByTags[tags] = uris; + fetchingClaimSearchByTags[tags] = false; // or delete the key instead? + + return Object.assign({}, state, { + claimSearchUrisByTags, + fetchingClaimSearchByTags, + }); +}; +reducers[ACTIONS.CLAIM_SEARCH_BY_TAGS_FAILED] = (state: State, action: any): State => { + const fetchingClaimSearchByTags = Object.assign({}, state.fetchingClaimSearchByTags); + fetchingClaimSearchByTags[action.data.tags] = false; + + return Object.assign({}, state, { + fetchingClaimSearchByTags, + }); +}; + export function claimsReducer(state: State = defaultState, action: any) { const handler = reducers[action.type]; if (handler) return handler(state, action); diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index ee59028..a451615 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -484,3 +484,25 @@ export const makeSelectShortUrlForUri = (uri: string) => makeSelectClaimForUri(uri), claim => claim && claim.short_url ); + +export const selectFetchingClaimSearchByTags = createSelector( + selectState, + state => state.fetchingClaimSearchByTags +); + +export const selectClaimSearchUrisByTags = createSelector( + selectState, + state => state.claimSearchUrisByTags +); + +export const makeSelectFetchingClaimSearchForTags = (tags: string) => + createSelector( + selectFetchingClaimSearchByTags, + byTags => byTags[tags] + ); + +export const makeSelectClaimSearchUrisForTags = (tags: string) => + createSelector( + selectClaimSearchUrisByTags, + byTags => byTags[tags] + );