// @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 claimsInChannel = 9999; 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. Content may also be blocked due to DMCA Red Flag rules which are obvious copyright violations we come across, are discussed in public channels, or reported to us.' )}

)} {!fetching && channelIsBlocked && (

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

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