diff --git a/dist/bundle.es.js b/dist/bundle.es.js index 6fc012c..035f91c 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -1042,7 +1042,7 @@ function toQueryString(params) { return parts.join('&'); } -const getSearchQueryString = (query, options = {}, includeUserOptions = false) => { +const getSearchQueryString = (query, options = {}, includeUserOptions = false, additionalOptions = {}) => { const encodedQuery = encodeURIComponent(query); const queryParams = [`s=${encodedQuery}`, `size=${options.size || DEFAULT_SEARCH_SIZE}`, `from=${options.from || DEFAULT_SEARCH_RESULT_FROM}`]; @@ -1056,6 +1056,13 @@ const getSearchQueryString = (query, options = {}, includeUserOptions = false) = } } + if (additionalOptions) { + Object.keys(additionalOptions).forEach(key => { + const option = additionalOptions[key]; + queryParams.push(`${key}=${option}`); + }); + } + return queryParams.join('&'); }; @@ -1124,7 +1131,7 @@ function parseURI(URL, requireProto = false) { rest.forEach(urlPiece => { if (urlPiece && urlPiece.includes(' ')) { - throw new Error('URL can not include a space'); + console.error('URL can not include a space'); } }); @@ -1170,7 +1177,7 @@ function parseURIModifier(modSeperator, modValue) { if (modSeperator) { if (!modValue) { - console.error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator })); + throw new Error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator })); } if (modSeperator === '#') { @@ -1183,15 +1190,15 @@ function parseURIModifier(modSeperator, modValue) { } if (claimId && (claimId.length > claimIdMaxLength || !claimId.match(/^[0-9a-f]+$/))) { - console.error(__(`Invalid claim ID %claimId%.`, { claimId })); + throw new Error(__(`Invalid claim ID %claimId%.`, { claimId })); } if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { - console.error(__('Claim sequence must be a number.')); + throw new Error(__('Claim sequence must be a number.')); } if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { - console.error(__('Bid position must be a number.')); + throw new Error(__('Bid position must be a number.')); } return [claimId, claimSequence, bidPosition]; @@ -1395,11 +1402,11 @@ const selectSearchSuggestions = reselect.createSelector(selectSearchValue, selec // Creates a query string based on the state in the search reducer // Can be overrided by passing in custom sizes/from values for other areas pagination -const makeSelectQueryWithOptions = (customQuery, customSize, customFrom, isBackgroundSearch = false // If it's a background search, don't use the users settings -) => reselect.createSelector(selectSearchValue, selectSearchOptions, (query, options) => { +const makeSelectQueryWithOptions = (customQuery, customSize, customFrom, isBackgroundSearch = false, // If it's a background search, don't use the users settings +additionalOptions = {}) => reselect.createSelector(selectSearchValue, selectSearchOptions, (query, options) => { const size = customSize || options[SEARCH_OPTIONS.RESULT_COUNT]; - const queryString = getSearchQueryString(customQuery || query, _extends$1({}, options, { size, from: customFrom }), !isBackgroundSearch); + const queryString = getSearchQueryString(customQuery || query, _extends$1({}, options, { size, from: customFrom }), !isBackgroundSearch, additionalOptions); return queryString; }); @@ -2179,7 +2186,13 @@ const makeSelectRecommendedContentForUri = uri => reselect.createSelector(makeSe const { title } = claim.value; - const searchQuery = getSearchQueryString(title ? title.replace(/\//, ' ') : ''); + if (!title) { + return; + } + + const searchQuery = getSearchQueryString(title.replace(/\//, ' '), undefined, undefined, { + related_to: claim.claim_id + }); let searchUris = searchUrisByQuery[searchQuery]; if (searchUris) { @@ -2339,6 +2352,8 @@ function doUpdateBalance() { } }); } + }).catch(() => { + walletBalancePromise = null; }); } @@ -3908,9 +3923,8 @@ const doUpdateSearchQuery = (query, shouldSkipSuggestions) => dispatch => { } }; -const doSearch = (rawQuery, // pass in a query if you don't want to search for what's in the search bar -size, // only pass in if you don't want to use the users setting (ex: related content) -from, isBackgroundSearch = false, resolveResults = true) => (dispatch, getState) => { +const doSearch = (rawQuery, size, // only pass in if you don't want to use the users setting (ex: related content) +from, isBackgroundSearch = false, options = {}, resolveResults = true) => (dispatch, getState) => { const query = rawQuery.replace(/^lbry:\/\//i, '').replace(/\//, ' '); if (!query) { @@ -3921,7 +3935,7 @@ from, isBackgroundSearch = false, resolveResults = true) => (dispatch, getState) } const state = getState(); - const queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch)(state); + let queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch, options)(state); // If we have already searched for something, we don't need to do anything const urisForQuery = makeSelectSearchUris(queryWithOptions)(state); diff --git a/src/lbryURI.js b/src/lbryURI.js index e6fce46..15ab4e6 100644 --- a/src/lbryURI.js +++ b/src/lbryURI.js @@ -73,7 +73,7 @@ export function parseURI(URL: string, requireProto: boolean = false): LbryUrlObj rest.forEach(urlPiece => { if (urlPiece && urlPiece.includes(' ')) { - throw new Error('URL can not include a space'); + console.error('URL can not include a space'); } }); @@ -138,7 +138,7 @@ function parseURIModifier(modSeperator: ?string, modValue: ?string) { if (modSeperator) { if (!modValue) { - console.error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator })); + throw new Error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator })); } if (modSeperator === '#') { @@ -151,15 +151,15 @@ function parseURIModifier(modSeperator: ?string, modValue: ?string) { } if (claimId && (claimId.length > claimIdMaxLength || !claimId.match(/^[0-9a-f]+$/))) { - console.error(__(`Invalid claim ID %claimId%.`, { claimId })); + throw new Error(__(`Invalid claim ID %claimId%.`, { claimId })); } if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { - console.error(__('Claim sequence must be a number.')); + throw new Error(__('Claim sequence must be a number.')); } if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { - console.error(__('Bid position must be a number.')); + throw new Error(__('Bid position must be a number.')); } return [claimId, claimSequence, bidPosition]; diff --git a/src/redux/actions/search.js b/src/redux/actions/search.js index 567e1c5..3cd3a47 100644 --- a/src/redux/actions/search.js +++ b/src/redux/actions/search.js @@ -75,11 +75,14 @@ export const doUpdateSearchQuery = (query: string, shouldSkipSuggestions: ?boole }; export const doSearch = ( - rawQuery: string, // pass in a query if you don't want to search for what's in the search bar + rawQuery: string, size: ?number, // only pass in if you don't want to use the users setting (ex: related content) from: ?number, isBackgroundSearch: boolean = false, - resolveResults: boolean = true, + options: { + related_to?: string, + } = {}, + resolveResults: boolean = true ) => (dispatch: Dispatch, getState: GetState) => { const query = rawQuery.replace(/^lbry:\/\//i, '').replace(/\//, ' '); @@ -91,7 +94,9 @@ export const doSearch = ( } const state = getState(); - const queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch)(state); + let queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch, options)( + state + ); // If we have already searched for something, we don't need to do anything const urisForQuery = makeSelectSearchUris(queryWithOptions)(state); diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js index 4ae4f02..fe0a4f1 100644 --- a/src/redux/actions/wallet.js +++ b/src/redux/actions/wallet.js @@ -13,27 +13,31 @@ export function doUpdateBalance() { } = getState(); if (walletBalancePromise === null) { - walletBalancePromise = Lbry.wallet_balance().then(response => { - walletBalancePromise = null; + walletBalancePromise = Lbry.wallet_balance() + .then(response => { + walletBalancePromise = null; - const { available, reserved, reserved_subtotals, total } = response; - const { claims, supports, tips } = reserved_subtotals; - const totalFloat = parseFloat(total); + const { available, reserved, reserved_subtotals, total } = response; + const { claims, supports, tips } = reserved_subtotals; + const totalFloat = parseFloat(total); - if (totalInStore !== totalFloat) { - dispatch({ - type: ACTIONS.UPDATE_BALANCE, - data: { - totalBalance: totalFloat, - balance: parseFloat(available), - reservedBalance: parseFloat(reserved), - claimsBalance: parseFloat(claims), - supportsBalance: parseFloat(supports), - tipsBalance: parseFloat(tips), - }, - }); - } - }); + if (totalInStore !== totalFloat) { + dispatch({ + type: ACTIONS.UPDATE_BALANCE, + data: { + totalBalance: totalFloat, + balance: parseFloat(available), + reservedBalance: parseFloat(reserved), + claimsBalance: parseFloat(claims), + supportsBalance: parseFloat(supports), + tipsBalance: parseFloat(tips), + }, + }); + } + }) + .catch(() => { + walletBalancePromise = null; + }); } return walletBalancePromise; diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js index dafdd43..e825188 100644 --- a/src/redux/selectors/claims.js +++ b/src/redux/selectors/claims.js @@ -212,7 +212,6 @@ export const makeSelectTotalPagesInChannelSearch = (uri: string) => } ); - export const makeSelectClaimsInChannelForCurrentPageState = (uri: string) => createSelector( selectClaimsById, @@ -261,8 +260,8 @@ export const makeSelectDateForUri = (uri: string) => (claim.value.release_time ? claim.value.release_time * 1000 : claim.meta && claim.meta.creation_timestamp - ? claim.meta.creation_timestamp * 1000 - : null); + ? claim.meta.creation_timestamp * 1000 + : null); if (!timestamp) { return undefined; } @@ -473,8 +472,7 @@ export const makeSelectOmittedCountForChannel = (uri: string) => (claimsInChannel, claimsInSearch) => { if (claimsInChannel && typeof claimsInSearch === 'number' && claimsInSearch >= 0) { return claimsInChannel - claimsInSearch; - } - else return 0; + } else return 0; } ); @@ -508,7 +506,13 @@ export const makeSelectRecommendedContentForUri = (uri: string) => const { title } = claim.value; - const searchQuery = getSearchQueryString(title ? title.replace(/\//, ' ') : ''); + if (!title) { + return; + } + + const searchQuery = getSearchQueryString(title.replace(/\//, ' '), undefined, undefined, { + related_to: claim.claim_id, + }); let searchUris = searchUrisByQuery[searchQuery]; if (searchUris) { @@ -625,11 +629,9 @@ export const makeSelectMyStreamUrlsForPage = (page: number = 1) => createSelector( selectMyClaimUrisWithoutChannels, urls => { - const start = ((Number(page) - 1) * Number(PAGE_SIZE)); - const end = (Number(page) * Number(PAGE_SIZE)); - return (urls && urls.length) - ? urls.slice(start, end) - : []; + const start = (Number(page) - 1) * Number(PAGE_SIZE); + const end = Number(page) * Number(PAGE_SIZE); + return urls && urls.length ? urls.slice(start, end) : []; } ); diff --git a/src/redux/selectors/search.js b/src/redux/selectors/search.js index aada012..d556602 100644 --- a/src/redux/selectors/search.js +++ b/src/redux/selectors/search.js @@ -137,7 +137,10 @@ export const makeSelectQueryWithOptions = ( customQuery: ?string, customSize: ?number, customFrom: ?number, - isBackgroundSearch: boolean = false // If it's a background search, don't use the users settings + isBackgroundSearch: boolean = false, // If it's a background search, don't use the users settings + additionalOptions: { + related_to?: string, + } = {} ) => createSelector( selectSearchValue, @@ -148,7 +151,8 @@ export const makeSelectQueryWithOptions = ( const queryString = getSearchQueryString( customQuery || query, { ...options, size, from: customFrom }, - !isBackgroundSearch + !isBackgroundSearch, + additionalOptions ); return queryString; diff --git a/src/util/query-params.js b/src/util/query-params.js index 9f6ae1f..7a3da29 100644 --- a/src/util/query-params.js +++ b/src/util/query-params.js @@ -36,7 +36,8 @@ export function toQueryString(params: { [string]: string | number }) { export const getSearchQueryString = ( query: string, options: any = {}, - includeUserOptions: boolean = false + includeUserOptions: boolean = false, + additionalOptions: {} = {} ) => { const encodedQuery = encodeURIComponent(query); const queryParams = [ @@ -67,5 +68,12 @@ export const getSearchQueryString = ( } } + if (additionalOptions) { + Object.keys(additionalOptions).forEach(key => { + const option = additionalOptions[key]; + queryParams.push(`${key}=${option}`); + }); + } + return queryParams.join('&'); };