// @flow import { ENABLE_NO_SOURCE_CLAIMS, SIMPLE_SITE } from 'config'; import * as CS from 'constants/claim_search'; import type { Node } from 'react'; import React from 'react'; import { createNormalizedClaimSearchKey, MATURE_TAGS } from 'lbry-redux'; import ClaimPreviewTile from 'component/claimPreviewTile'; import { useHistory } from 'react-router'; type Props = { prefixUris?: Array, uris: Array, doClaimSearch: ({}) => void, showNsfw: boolean, hideReposts: boolean, history: { action: string, push: (string) => void, replace: (string) => void }, claimSearchByQuery: { [string]: Array, }, fetchingClaimSearchByQuery: { [string]: boolean, }, // claim search options are below tags: Array, blockedUris: Array, mutedUris: Array, claimIds?: Array, channelIds?: Array, pageSize: number, orderBy?: Array, releaseTime?: string, languages?: Array, claimType?: string | Array, streamTypes?: Array, timestamp?: string, feeAmount?: string, limitClaimsPerChannel?: number, hasNoSource?: boolean, renderProperties?: (Claim) => ?Node, }; function ClaimTilesDiscover(props: Props) { const { doClaimSearch, claimSearchByQuery, showNsfw, hideReposts, // Below are options to pass that are forwarded to claim_search tags, channelIds, claimIds, orderBy, pageSize = 8, releaseTime, languages, claimType, streamTypes, prefixUris, timestamp, feeAmount, limitClaimsPerChannel, fetchingClaimSearchByQuery, hasNoSource, renderProperties, blockedUris, mutedUris, } = props; const { location } = useHistory(); const urlParams = new URLSearchParams(location.search); const feeAmountInUrl = urlParams.get('fee_amount'); const feeAmountParam = feeAmountInUrl || feeAmount; const mutedAndBlockedChannelIds = Array.from(new Set(mutedUris.concat(blockedUris).map((uri) => uri.split('#')[1]))); const options: { page_size: number, no_totals: boolean, any_tags: Array, channel_ids: Array, claim_ids?: Array, not_channel_ids: Array, not_tags: Array, order_by: Array, languages?: Array, release_time?: string, claim_type?: string | Array, timestamp?: string, fee_amount?: string, limit_claims_per_channel?: number, stream_types?: Array, has_source?: boolean, has_no_source?: boolean, } = { page_size: pageSize, claim_type: claimType || undefined, // no_totals makes it so the sdk doesn't have to calculate total number pages for pagination // it's faster, but we will need to remove it if we start using total_pages no_totals: true, any_tags: tags || [], not_tags: !showNsfw ? MATURE_TAGS : [], any_languages: languages, channel_ids: channelIds || [], not_channel_ids: mutedAndBlockedChannelIds, order_by: orderBy || ['trending_group', 'trending_mixed'], stream_types: streamTypes === null ? undefined : SIMPLE_SITE ? [CS.FILE_VIDEO, CS.FILE_AUDIO] : undefined, }; if (ENABLE_NO_SOURCE_CLAIMS && hasNoSource) { options.has_no_source = true; } else if (!ENABLE_NO_SOURCE_CLAIMS && (!claimType || claimType === 'stream')) { options.has_source = true; } if (releaseTime) { options.release_time = releaseTime; } if (feeAmountParam) { options.fee_amount = feeAmountParam; } if (limitClaimsPerChannel) { options.limit_claims_per_channel = limitClaimsPerChannel; } // https://github.com/lbryio/lbry-desktop/issues/3774 if (hideReposts) { if (Array.isArray(options.claim_type)) { options.claim_type = options.claim_type.filter((claimType) => claimType !== 'repost'); } else { options.claim_type = ['stream', 'channel']; } } if (claimType) { options.claim_type = claimType; } if (timestamp) { options.timestamp = timestamp; } if (claimIds) { options.claim_ids = claimIds; } const claimSearchCacheQuery = createNormalizedClaimSearchKey(options); const uris = (prefixUris || []).concat(claimSearchByQuery[claimSearchCacheQuery] || []); // Don't use the query from createNormalizedClaimSearchKey for the effect since that doesn't include page & release_time const optionsStringForEffect = JSON.stringify(options); const isLoading = fetchingClaimSearchByQuery[claimSearchCacheQuery]; const shouldPerformSearch = !isLoading && uris.length === 0; React.useEffect(() => { if (shouldPerformSearch) { const searchOptions = JSON.parse(optionsStringForEffect); doClaimSearch(searchOptions); } }, [doClaimSearch, shouldPerformSearch, optionsStringForEffect]); return (
    {uris && uris.length ? uris.map((uri) => ) : new Array(pageSize).fill(1).map((x, i) => )}
); } export default ClaimTilesDiscover;