171 lines
5.1 KiB
JavaScript
171 lines
5.1 KiB
JavaScript
// @flow
|
|
import React from 'react';
|
|
import classnames from 'classnames';
|
|
import { NavLink, useHistory } from 'react-router-dom';
|
|
import ClaimPreviewTile from 'component/claimPreviewTile';
|
|
import TruncatedText from 'component/common/truncated-text';
|
|
import CollectionCount from './collectionCount';
|
|
import CollectionPrivate from './collectionPrivate';
|
|
import CollectionMenuList from 'component/collectionMenuList';
|
|
import { formatLbryUrlForWeb } from 'util/url';
|
|
import { COLLECTIONS_CONSTS } from 'lbry-redux';
|
|
import FileThumbnail from 'component/fileThumbnail';
|
|
|
|
type Props = {
|
|
uri: string,
|
|
collectionId: string,
|
|
collectionName: string,
|
|
collectionCount: number,
|
|
editedCollection?: Collection,
|
|
pendingCollection?: Collection,
|
|
claim: ?Claim,
|
|
channelClaim: ?ChannelClaim,
|
|
collectionItemUrls: Array<string>,
|
|
resolveUri: (string) => void,
|
|
isResolvingUri: boolean,
|
|
thumbnail?: string,
|
|
title?: string,
|
|
placeholder: boolean,
|
|
blackListedOutpoints: Array<{
|
|
txid: string,
|
|
nout: number,
|
|
}>,
|
|
filteredOutpoints: Array<{
|
|
txid: string,
|
|
nout: number,
|
|
}>,
|
|
blockedChannelUris: Array<string>,
|
|
isMature?: boolean,
|
|
showMature: boolean,
|
|
collectionId: string,
|
|
deleteCollection: (string) => void,
|
|
resolveCollectionItems: (any) => void,
|
|
isResolvingCollectionClaims: boolean,
|
|
};
|
|
|
|
function CollectionPreviewTile(props: Props) {
|
|
const {
|
|
uri,
|
|
collectionId,
|
|
collectionName,
|
|
collectionCount,
|
|
isResolvingUri,
|
|
isResolvingCollectionClaims,
|
|
collectionItemUrls,
|
|
claim,
|
|
resolveCollectionItems,
|
|
} = props;
|
|
|
|
const { push } = useHistory();
|
|
const hasClaim = Boolean(claim);
|
|
React.useEffect(() => {
|
|
if (collectionId && hasClaim && resolveCollectionItems) {
|
|
resolveCollectionItems({ collectionId, page_size: 5 });
|
|
}
|
|
}, [collectionId, hasClaim]);
|
|
|
|
// const signingChannel = claim && claim.signing_channel;
|
|
|
|
let navigateUrl = formatLbryUrlForWeb(collectionItemUrls[0] || '/');
|
|
if (collectionId) {
|
|
const collectionParams = new URLSearchParams();
|
|
collectionParams.set(COLLECTIONS_CONSTS.COLLECTION_ID, collectionId);
|
|
navigateUrl = navigateUrl + `?` + collectionParams.toString();
|
|
}
|
|
|
|
function handleClick(e) {
|
|
if (navigateUrl) {
|
|
push(navigateUrl);
|
|
}
|
|
}
|
|
|
|
const navLinkProps = {
|
|
to: navigateUrl,
|
|
onClick: (e) => e.stopPropagation(),
|
|
};
|
|
|
|
/* REMOVE IF WORKS
|
|
let shouldHide = false;
|
|
|
|
if (isMature && !showMature) {
|
|
// Unfortunately needed until this is resolved
|
|
// https://github.com/lbryio/lbry-sdk/issues/2785
|
|
shouldHide = true;
|
|
}
|
|
|
|
// This will be replaced once blocking is done at the wallet server level
|
|
if (claim && !shouldHide && blackListedOutpoints) {
|
|
shouldHide = blackListedOutpoints.some(
|
|
(outpoint) =>
|
|
(signingChannel && outpoint.txid === signingChannel.txid && outpoint.nout === signingChannel.nout) ||
|
|
(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 && blockedChannelUris.length && signingChannel) {
|
|
shouldHide = blockedChannelUris.some((blockedUri) => blockedUri === signingChannel.permanent_url);
|
|
}
|
|
// block channel claims if we can't control for them in claim search
|
|
// e.g. fetchRecommendedSubscriptions
|
|
|
|
if (shouldHide) {
|
|
return null;
|
|
}
|
|
*/
|
|
|
|
if (isResolvingUri || isResolvingCollectionClaims) {
|
|
return (
|
|
<li className={classnames('claim-preview--tile', {})}>
|
|
<div className="placeholder media__thumb" />
|
|
<div className="placeholder__wrapper">
|
|
<div className="placeholder claim-tile__title" />
|
|
<div className="placeholder claim-tile__info" />
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|
|
if (uri) {
|
|
return <ClaimPreviewTile uri={uri} />;
|
|
}
|
|
|
|
return (
|
|
<li role="link" onClick={handleClick} className={'card claim-preview--tile'}>
|
|
<NavLink {...navLinkProps}>
|
|
<FileThumbnail uri={collectionItemUrls && collectionItemUrls.length && collectionItemUrls[0]}>
|
|
<React.Fragment>
|
|
<div className="claim-preview__claim-property-overlay">
|
|
<CollectionCount count={collectionCount} />
|
|
</div>
|
|
</React.Fragment>
|
|
</FileThumbnail>
|
|
</NavLink>
|
|
<NavLink {...navLinkProps}>
|
|
<h2 className="claim-tile__title">
|
|
<TruncatedText text={collectionName} lines={1} />
|
|
<CollectionMenuList collectionId={collectionId} />
|
|
</h2>
|
|
</NavLink>
|
|
<div>
|
|
<div className="claim-tile__info">
|
|
<React.Fragment>
|
|
<div className="claim-tile__about">
|
|
<CollectionPrivate />
|
|
</div>
|
|
</React.Fragment>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
export default CollectionPreviewTile;
|