diff --git a/ui/component/claimListDiscover/view.jsx b/ui/component/claimListDiscover/view.jsx index 0c1aa3a60..382ba2adb 100644 --- a/ui/component/claimListDiscover/view.jsx +++ b/ui/component/claimListDiscover/view.jsx @@ -14,6 +14,7 @@ import ClaimPreviewTile from 'component/claimPreviewTile'; import I18nMessage from 'component/i18nMessage'; import ClaimListHeader from 'component/claimListHeader'; import { useIsLargeScreen } from 'effects/use-screensize'; +import { getLivestreamOnlyOptions } from 'util/search'; type Props = { uris: Array, @@ -23,11 +24,11 @@ type Props = { doClaimSearch: ({}) => void, loading: boolean, personalView: boolean, - doToggleTagFollowDesktop: string => void, + doToggleTagFollowDesktop: (string) => void, meta?: Node, showNsfw: boolean, hideReposts: boolean, - history: { action: string, push: string => void, replace: string => void }, + history: { action: string, push: (string) => void, replace: (string) => void }, location: { search: string, pathname: string }, claimSearchByQuery: { [string]: Array, @@ -52,7 +53,7 @@ type Props = { defaultClaimType?: Array, streamType?: string | Array, defaultStreamType?: string | Array, - renderProperties?: Claim => Node, + renderProperties?: (Claim) => Node, includeSupportAction?: boolean, repostedClaimId?: string, pageSize?: number, @@ -133,14 +134,14 @@ function ClaimListDiscover(props: Props) { const isLargeScreen = useIsLargeScreen(); const [orderParamEntry, setOrderParamEntry] = usePersistedState(`entry-${location.pathname}`, CS.ORDER_BY_TRENDING); const [orderParamUser, setOrderParamUser] = usePersistedState(`orderUser-${location.pathname}`, CS.ORDER_BY_TRENDING); - const followed = (followedTags && followedTags.map(t => t.name)) || []; + const followed = (followedTags && followedTags.map((t) => t.name)) || []; const urlParams = new URLSearchParams(search); const tagsParam = // can be 'x,y,z' or 'x' or ['x','y'] or CS.CONSTANT (tags && getParamFromTags(tags)) || (urlParams.get(CS.TAGS_KEY) !== null && urlParams.get(CS.TAGS_KEY)) || (defaultTags && getParamFromTags(defaultTags)); const freshnessParam = freshness || urlParams.get(CS.FRESH_KEY) || defaultFreshness; - const mutedAndBlockedChannelIds = Array.from(new Set(mutedUris.concat(blockedUris).map(uri => uri.split('#')[1]))); + const mutedAndBlockedChannelIds = Array.from(new Set(mutedUris.concat(blockedUris).map((uri) => uri.split('#')[1]))); const langParam = urlParams.get(CS.LANGUAGE_KEY) || null; const languageParams = searchInLanguage @@ -265,12 +266,7 @@ function ClaimListDiscover(props: Props) { if (claimType !== CS.CLAIM_CHANNEL) { if (orderParam === CS.ORDER_BY_TOP && freshnessParam !== CS.FRESH_ALL) { - options.release_time = `>${Math.floor( - moment() - .subtract(1, freshnessParam) - .startOf('hour') - .unix() - )}`; + options.release_time = `>${Math.floor(moment().subtract(1, freshnessParam).startOf('hour').unix())}`; } else if (orderParam === CS.ORDER_BY_NEW || orderParam === CS.ORDER_BY_TRENDING) { // Warning - hack below // If users are following more than 10 channels or tags, limit results to stuff less than a year old @@ -281,29 +277,15 @@ function ClaimListDiscover(props: Props) { (options.channel_ids && options.channel_ids.length > 20) || (options.any_tags && options.any_tags.length > 20) ) { - options.release_time = `>${Math.floor( - moment() - .subtract(3, CS.FRESH_MONTH) - .startOf('week') - .unix() - )}`; + options.release_time = `>${Math.floor(moment().subtract(3, CS.FRESH_MONTH).startOf('week').unix())}`; } else if ( (options.channel_ids && options.channel_ids.length > 10) || (options.any_tags && options.any_tags.length > 10) ) { - options.release_time = `>${Math.floor( - moment() - .subtract(1, CS.FRESH_YEAR) - .startOf('week') - .unix() - )}`; + options.release_time = `>${Math.floor(moment().subtract(1, CS.FRESH_YEAR).startOf('week').unix())}`; } else { // Hack for at least the New page until https://github.com/lbryio/lbry-sdk/issues/2591 is fixed - options.release_time = `<${Math.floor( - moment() - .startOf('minute') - .unix() - )}`; + options.release_time = `<${Math.floor(moment().startOf('minute').unix())}`; } } } @@ -351,14 +333,14 @@ function ClaimListDiscover(props: Props) { if (hideReposts && !options.reposted_claim_id && !forceShowReposts) { if (Array.isArray(options.claim_type)) { if (options.claim_type.length > 1) { - options.claim_type = options.claim_type.filter(claimType => claimType !== 'repost'); + options.claim_type = options.claim_type.filter((claimType) => claimType !== 'repost'); } } else { options.claim_type = ['stream', 'channel']; } } - const hasMatureTags = tagsParam && tagsParam.split(',').some(t => MATURE_TAGS.includes(t)); + const hasMatureTags = tagsParam && tagsParam.split(',').some((t) => MATURE_TAGS.includes(t)); const claimSearchCacheQuery = createNormalizedClaimSearchKey(options); const claimSearchResult = claimSearchByQuery[claimSearchCacheQuery]; const claimSearchResultLastPageReached = claimSearchByQueryLastPageReached[claimSearchCacheQuery]; @@ -471,9 +453,7 @@ function ClaimListDiscover(props: Props) { doClaimSearch(searchOptions); if (liveLivestreamsFirst && options.page === 1) { - delete searchOptions.has_source; - delete searchOptions.stream_types; - doClaimSearch({ ...searchOptions, has_no_source: true }); + doClaimSearch(getLivestreamOnlyOptions(searchOptions)); } } }, [doClaimSearch, shouldPerformSearch, optionsStringForEffect, forceRefresh]); diff --git a/ui/component/claimTilesDiscover/view.jsx b/ui/component/claimTilesDiscover/view.jsx index 62be9a1cf..36c924282 100644 --- a/ui/component/claimTilesDiscover/view.jsx +++ b/ui/component/claimTilesDiscover/view.jsx @@ -6,14 +6,7 @@ import React from 'react'; import { createNormalizedClaimSearchKey, MATURE_TAGS } from 'lbry-redux'; import ClaimPreviewTile from 'component/claimPreviewTile'; import { useHistory } from 'react-router'; - -const getNoSourceOptions = (options) => { - const newOptions = Object.assign({}, options); - delete newOptions.has_source; - delete newOptions.stream_types; - newOptions.has_no_source = true; - return newOptions; -}; +import { getLivestreamOnlyOptions } from 'util/search'; /** * Updates 'uris' by adding and/or moving active livestreams to the front of @@ -68,7 +61,7 @@ export function prioritizeActiveLivestreams( // 2. Now, repeat on the secondary search. if (options) { - const livestreamsOnlySearchCacheQuery = createNormalizedClaimSearchKey(getNoSourceOptions(options)); + const livestreamsOnlySearchCacheQuery = createNormalizedClaimSearchKey(getLivestreamOnlyOptions(options)); const livestreamsOnlyUris = claimSearchByQuery[livestreamsOnlySearchCacheQuery]; if (livestreamsOnlyUris) { livestreamsOnlyUris.forEach((uri) => { @@ -254,7 +247,7 @@ function ClaimTilesDiscover(props: Props) { doClaimSearch(searchOptions); if (liveLivestreamsFirst) { - doClaimSearch(getNoSourceOptions(searchOptions)); + doClaimSearch(getLivestreamOnlyOptions(searchOptions)); } } }, [doClaimSearch, shouldPerformSearch, optionsStringForEffect, liveLivestreamsFirst]); diff --git a/ui/util/search.js b/ui/util/search.js index 05be648b7..b9ec5a910 100644 --- a/ui/util/search.js +++ b/ui/util/search.js @@ -17,3 +17,19 @@ export function createNormalizedSearchKey(query: string) { } return normalizedQuery; } + +/** + * Returns the "livestream only" version of the given 'options'. + * + * Currently, the 'has_source' attribute is being used to identify livestreams. + * + * @param options + * @returns {*} + */ +export function getLivestreamOnlyOptions(options: any) { + const newOptions = Object.assign({}, options); + delete newOptions.has_source; + delete newOptions.stream_types; + newOptions.has_no_source = true; + return newOptions; +}