// @flow import { SHOW_ADS, SIMPLE_SITE } from 'config'; import * as CS from 'constants/claim_search'; import * as ICONS from 'constants/icons'; import React, { Fragment } from 'react'; import HiddenNsfwClaims from 'component/hiddenNsfwClaims'; import { useHistory } from 'react-router-dom'; import Button from 'component/button'; import ClaimListDiscover from 'component/claimListDiscover'; import Ads from 'web/component/ads'; import Icon from 'component/common/icon'; import LivestreamLink from 'component/livestreamLink'; import { Form, FormField } from 'component/common/form'; import { DEBOUNCE_WAIT_DURATION_MS } from 'constants/search'; import { lighthouse } from 'redux/actions/search'; const TYPES_TO_ALLOW_FILTER = ['stream', 'repost']; type Props = { uri: string, totalPages: number, fetching: boolean, params: { page: number }, pageOfClaimsInChannel: Array, channelIsBlocked: boolean, channelIsMine: boolean, fetchClaims: (string, number) => void, channelIsBlackListed: boolean, defaultPageSize?: number, defaultInfiniteScroll?: Boolean, claim: Claim, isAuthenticated: boolean, showMature: boolean, tileLayout: boolean, viewHiddenChannels: boolean, doResolveUris: (Array, boolean) => void, claimType: string, empty?: string, }; function ChannelContent(props: Props) { const { uri, fetching, channelIsMine, channelIsBlocked, channelIsBlackListed, claim, isAuthenticated, defaultPageSize = CS.PAGE_SIZE, defaultInfiniteScroll = true, showMature, tileLayout, viewHiddenChannels, doResolveUris, claimType, empty, } = props; const claimsInChannel = (claim && claim.meta.claims_in_channel) || 0; const [searchQuery, setSearchQuery] = React.useState(''); const [searchResults, setSearchResults] = React.useState(undefined); const { location: { pathname, search }, } = useHistory(); const url = `${pathname}${search}`; const claimId = claim && claim.claim_id; const showFilters = !claimType || (Array.isArray(claimType) ? claimType.every((ct) => TYPES_TO_ALLOW_FILTER.includes(ct)) : TYPES_TO_ALLOW_FILTER.includes(claimType)); function handleInputChange(e) { const { value } = e.target; setSearchQuery(value); } React.useEffect(() => { const timer = setTimeout(() => { if (searchQuery === '' || !claimId) { // In order to display original search results, search results must be set to null. A query of '' should display original results. return setSearchResults(null); } else { lighthouse .search( `s=${encodeURIComponent(searchQuery)}&channel_id=${encodeURIComponent(claimId)}${ !showMature ? '&nsfw=false&size=50&from=0' : '' }` ) .then(({ body: results }) => { const urls = results.map(({ name, claimId }) => { return `lbry://${name}#${claimId}`; }); // Batch-resolve the urls before calling 'setSearchResults', as the // latter will immediately cause the tiles to resolve, ending up // calling doResolveUri one by one before the batched one. doResolveUris(urls, true); setSearchResults(urls); }) .catch(() => { setSearchResults(null); }); } }, DEBOUNCE_WAIT_DURATION_MS); return () => clearTimeout(timer); }, [claimId, searchQuery, showMature]); React.useEffect(() => { setSearchQuery(''); setSearchResults(null); }, [url]); return ( {!fetching && Boolean(claimsInChannel) && !channelIsBlocked && !channelIsBlackListed && ( )} {!fetching && channelIsBlackListed && (

{__( 'In response to a complaint we received under the US Digital Millennium Copyright Act, we have blocked access to this channel from our applications.' )}

)} {!fetching && channelIsBlocked && (

{__('You have blocked this channel content.')}

)} {!channelIsMine && claimsInChannel > 0 && } } meta={ showFilters && (
{}} className="wunderbar--inline"> ) } isChannel channelIsMine={channelIsMine} empty={empty} />
); } export default ChannelContent;