// @flow import React, { Fragment, useEffect } from 'react'; import classnames from 'classnames'; import { parseURI, convertToShareLink } from 'lbry-redux'; import { withRouter } from 'react-router-dom'; import { openCopyLinkMenu } from 'util/context-menu'; import { formatLbryUriForWeb } from 'util/uri'; import CardMedia from 'component/cardMedia'; import UriIndicator from 'component/uriIndicator'; import TruncatedText from 'component/common/truncated-text'; import DateTime from 'component/dateTime'; import FileProperties from 'component/fileProperties'; import ClaimTags from 'component/claimTags'; import SubscribeButton from 'component/subscribeButton'; import ChannelThumbnail from 'component/channelThumbnail'; import BlockButton from 'component/blockButton'; import Button from 'component/button'; type Props = { uri: string, claim: ?Claim, obscureNsfw: boolean, showUserBlocked: boolean, claimIsMine: boolean, pending?: boolean, resolveUri: string => void, isResolvingUri: boolean, preventResolve: boolean, history: { push: string => void }, thumbnail: string, title: string, nsfw: boolean, placeholder: string, type: string, hasVisitedUri: boolean, blackListedOutpoints: Array<{ txid: string, nout: number, }>, filteredOutpoints: Array<{ txid: string, nout: number, }>, blockedChannelUris: Array, channelIsBlocked: boolean, isSubscribed: boolean, }; function ClaimPreview(props: Props) { const { obscureNsfw, claimIsMine, pending, history, uri, isResolvingUri, thumbnail, title, nsfw, resolveUri, claim, placeholder, type, blackListedOutpoints, filteredOutpoints, blockedChannelUris, hasVisitedUri, showUserBlocked, channelIsBlocked, isSubscribed, } = props; const haventFetched = claim === undefined; const abandoned = !isResolvingUri && !claim; const claimsInChannel = (claim && claim.meta.claims_in_channel) || 0; const showPublishLink = abandoned && placeholder === 'publish'; const includeChannelTooltip = type !== 'inline' && type !== 'tooltip'; const hideActions = type === 'small' || type === 'tooltip'; let isValid; try { parseURI(uri); isValid = true; } catch (e) { isValid = false; } const isChannel = isValid ? parseURI(uri).isChannel : false; const signingChannel = claim && claim.signing_channel; let shouldHide = placeholder !== 'loading' && ((abandoned && !showPublishLink) || (!claimIsMine && obscureNsfw && nsfw)); // This will be replaced once blocking is done at the wallet server level if (claim && !shouldHide && blackListedOutpoints) { shouldHide = blackListedOutpoints.some(outpoint => outpoint.txid === claim.txid && outpoint.nout === claim.nout); } // We're checking to see if the stream outpoint // or signing channel outpoint is in the filter list if (claim && !shouldHide && filteredOutpoints) { shouldHide = filteredOutpoints.some( outpoint => (signingChannel && outpoint.txid === signingChannel.txid && outpoint.nout === signingChannel.nout) || (outpoint.txid === claim.txid && outpoint.nout === claim.nout) ); } // block stream claims if (claim && !shouldHide && !showUserBlocked && blockedChannelUris.length && signingChannel) { shouldHide = blockedChannelUris.some(blockedUri => blockedUri === signingChannel.permanent_url); } // block channel claims if we can't control for them in claim search if (claim && isChannel && !shouldHide && !showUserBlocked && blockedChannelUris.length && isChannel) { shouldHide = blockedChannelUris.some(blockedUri => blockedUri === claim.permanent_url); } function handleContextMenu(e) { e.preventDefault(); e.stopPropagation(); if (claim) { openCopyLinkMenu(convertToShareLink(claim.permanent_url), e); } } function onClick(e) { if ((isChannel || title) && !pending) { history.push(formatLbryUriForWeb(uri)); } } useEffect(() => { if (isValid && !isResolvingUri && haventFetched && uri) { resolveUri(uri); } }, [isValid, isResolvingUri, uri, resolveUri, haventFetched]); if (shouldHide) { return null; } if (placeholder === 'loading' || (isResolvingUri && !claim)) { return (
  • ); } return (
  • {isChannel ? : }
    {claim ? : {__('Nothing here')}}
    {!hideActions && (
    {isChannel && !channelIsBlocked && ( )} {isChannel && !isSubscribed && } {!isChannel && }
    )}
    {pending &&
    Pending...
    } {!isResolvingUri && (
    {claim ? ( ) : (
    {__('Publish something and claim this spot!')}
    )}
    {isChannel ? ( type !== 'inline' && `${claimsInChannel} ${__('publishes')}` ) : ( )}
    )}
  • ); } export default withRouter(ClaimPreview);