post: Post;
}
-interface MetadataCardState {
- expanded: boolean;
-}
-
-export class MetadataCard extends Component<
- MetadataCardProps,
- MetadataCardState
-> {
+export class MetadataCard extends Component<MetadataCardProps> {
constructor(props: any, context: any) {
super(props, context);
}
render() {
const post = this.props.post;
- return (
- <>
- {post.embed_title && post.url && (
- <div className="post-metadata-card card border-secondary mt-3 mb-2">
- <div className="row">
- <div className="col-12">
- <div className="card-body">
- {post.name !== post.embed_title && (
- <>
- <h5 className="card-title d-inline">
- <a className="text-body" href={post.url} rel={relTags}>
- {post.embed_title}
- </a>
- </h5>
- <span className="d-inline-block ms-2 mb-2 small text-muted">
- <a
- className="text-muted fst-italic"
- href={post.url}
- rel={relTags}
- >
- {new URL(post.url).hostname}
- <Icon icon="external-link" classes="ms-1" />
- </a>
- </span>
- </>
- )}
- {post.embed_description && (
- <div
- className="card-text small text-muted md-div"
- dangerouslySetInnerHTML={{
- __html: sanitizeHtml(post.embed_description),
- }}
- />
- )}
- </div>
+
+ if (post.embed_title && post.url) {
+ return (
+ <div className="post-metadata-card card border-secondary mt-3 mb-2">
+ <div className="row">
+ <div className="col-12">
+ <div className="card-body">
+ {post.name !== post.embed_title && (
+ <>
+ <h5 className="card-title d-inline">
+ <a className="text-body" href={post.url} rel={relTags}>
+ {post.embed_title}
+ </a>
+ </h5>
+ <span className="d-inline-block ms-2 mb-2 small text-muted">
+ <a
+ className="text-muted fst-italic"
+ href={post.url}
+ rel={relTags}
+ >
+ {new URL(post.url).hostname}
+ <Icon icon="external-link" classes="ms-1" />
+ </a>
+ </span>
+ </>
+ )}
+ {post.embed_description && (
+ <div
+ className="card-text small text-muted md-div"
+ dangerouslySetInnerHTML={{
+ __html: sanitizeHtml(post.embed_description),
+ }}
+ />
+ )}
</div>
</div>
</div>
- )}
- </>
- );
+ </div>
+ );
+ } else {
+ return <></>;
+ }
}
}
allLanguages: Language[];
siteLanguages: number[];
showCommunity?: boolean;
+ /**
+ * Controls whether to show both the body *and* the metadata preview card
+ */
showBody?: boolean;
hideImage?: boolean;
enableDownvotes?: boolean;
<>
{this.listing()}
{this.state.imageExpanded && !this.props.hideImage && this.img}
- {post.url && this.state.showBody && post.embed_title && (
+ {this.showBody && post.url && post.embed_title && (
<MetadataCard post={post} />
)}
{this.showBody && this.body()}
</h5>
{/**
- * If there is a URL, or if the post has a body and we were told not to
- * show the body, show the MetadataCard/body toggle.
+ * If there is a URL, an embed title, and we were not told to show the
+ * body by the parent component, show the MetadataCard/body toggle.
*/}
- {(post.url || (post.body && !this.props.showBody)) && (
+ {!this.props.showBody && post.url && post.embed_title && (
<button
className="btn btn-sm btn-link link-dark link-opacity-75 link-opacity-100-hover py-0 align-baseline"
data-tippy-content={post.body && mdNoImages.render(post.body)}