import { useState } from 'react'; import { Link, useLocation, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Comment } from '@plebbit/plebbit-react-hooks'; import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js'; import { getCommentMediaInfoMemoized, getHasThumbnail } from '../../lib/utils/media-utils'; import { getFormattedDate } from '../../lib/utils/time-utils'; import { isPostPageView } from '../../lib/utils/view-utils'; import useCountLinksInReplies from '../../hooks/use-count-links-in-replies'; import useReplies from '../../hooks/use-replies'; import styles from './post.module.css'; import Markdown from '../markdown'; import Media from '../media'; const ReplyDesktop = ({ reply }: Comment) => { const { t } = useTranslation(); const { author, content, link, linkHeight, linkWidth, parentCid, pinned, postCid, shortCid, subplebbitAddress, timestamp } = reply || {}; const { displayName, shortAddress } = author || {}; const commentMediaInfo = getCommentMediaInfoMemoized(reply); const hasThumbnail = getHasThumbnail(commentMediaInfo, link); const [showThumbnail, setShowThumbnail] = useState(true); const isReplyingToReply = postCid !== parentCid; return (
{'>>'}
{displayName || 'Anonymous'} (u/{shortAddress}) {getFormattedDate(timestamp)} c/ {shortCid} {pinned && ( )}
{link && (
{t('link')}:{' '} {link.length > 30 ? link?.slice(0, 30) + '...' : link} {!showThumbnail && (commentMediaInfo?.type === 'iframe' || commentMediaInfo?.type === 'video') && ( {' '} [ setShowThumbnail(true)}> {t('close')} ] )}
{hasThumbnail && ( )}
)} {content && (
{isReplyingToReply && ( <> {`c/${Plebbit.getShortCid(parentCid)}`}
)}
)}
); }; const PostDesktop = ({ post, showAllReplies }: { post: Comment; showAllReplies: boolean }) => { const { t } = useTranslation(); const { author, cid, content, link, linkHeight, linkWidth, locked, pinned, postCid, replyCount, shortCid, subplebbitAddress, timestamp, title } = post || {}; const { displayName, shortAddress } = author || {}; const isInPostPage = isPostPageView(useLocation().pathname, useParams()); const displayTitle = title && title.length > 75 ? title?.slice(0, 75) + '...' : title; const displayContent = content && !isInPostPage && content.length > 1000 ? content?.slice(0, 1000) + '(...)' : content; const commentMediaInfo = getCommentMediaInfoMemoized(post); const hasThumbnail = getHasThumbnail(commentMediaInfo, link); const [showThumbnail, setShowThumbnail] = useState(true); const replies = useReplies(post); const visibleLinkCount = useCountLinksInReplies(post, 5); const totalLinkCount = useCountLinksInReplies(post); const repliesCount = pinned ? replyCount : replyCount - 5; const linkCount = pinned ? totalLinkCount : totalLinkCount - visibleLinkCount; return (

{!isInPostPage && ( )} {commentMediaInfo?.url && (
{t('link')}:{' '} {commentMediaInfo.url.length > 30 ? commentMediaInfo?.url?.slice(0, 30) + '...' : commentMediaInfo?.url} {' '} ({commentMediaInfo?.type}) {!showThumbnail && (commentMediaInfo?.type === 'iframe' || commentMediaInfo?.type === 'video') && ( {' '} [ setShowThumbnail(true)}> {t('close')} ] )}
{hasThumbnail && ( )}
)}
{title && {displayTitle} } {displayName || 'Anonymous'} (u/{shortAddress}) {getFormattedDate(timestamp)} c/ {shortCid} {pinned && ( )} {locked && ( )} [{t('reply')}]
{!content &&
} {content && (
{content.length > 1000 && !isInPostPage && (
Comment too long. Click here to view the full text.
)}
)} {(replies.length > 5 || pinned) && !isInPostPage && ( {repliesCount} replies {linkCount > 0 && `and ${linkCount} links`} omitted.{' '} Click here to view. )} {!(pinned && !isInPostPage) && replies && replies.slice(0, showAllReplies ? replies.length : 5).map((reply, index) => (
))}
); }; const ReplyMobile = ({ reply }: Comment) => { const { author, content, link, linkHeight, linkWidth, parentCid, pinned, postCid, shortCid, subplebbitAddress, timestamp } = reply || {}; const { displayName, shortAddress } = author || {}; const commentMediaInfo = getCommentMediaInfoMemoized(reply); const hasThumbnail = getHasThumbnail(commentMediaInfo, link); const [showThumbnail, setShowThumbnail] = useState(true); const isReplyingToReply = postCid !== parentCid; return (
... {displayName || 'Anonymous'} (u/{shortAddress}) {getFormattedDate(timestamp)} c/ {shortCid}
{hasThumbnail && ( )} {content && (
{isReplyingToReply && ( <> {`c/${Plebbit.getShortCid(parentCid)}`}
)}
)}
); }; const PostMobile = ({ post, showAllReplies }: { post: Comment; showAllReplies: boolean }) => { const { t } = useTranslation(); const { author, cid, content, link, linkHeight, linkWidth, pinned, replyCount, shortCid, subplebbitAddress, timestamp, title } = post || {}; const { address, displayName, shortAddress } = author || {}; const linkCount = useCountLinksInReplies(post); const isInPostPage = isPostPageView(useLocation().pathname, useParams()); const displayTitle = title && title.length > 30 ? title?.slice(0, 30) + '(...)' : title; const displayContent = content && !isInPostPage && content.length > 1000 ? content?.slice(0, 1000) : content; const commentMediaInfo = getCommentMediaInfoMemoized(post); const hasThumbnail = getHasThumbnail(commentMediaInfo, link); const [showThumbnail, setShowThumbnail] = useState(true); const replies = useReplies(post); return (

... {displayName || 'Anonymous'} (u/{shortAddress || address?.slice(0, 12) + '...'}) {title && ( <>
{displayTitle} )}
{getFormattedDate(timestamp)} c/ {shortCid}
{hasThumbnail && ( )} {content && (
{content.length > 1000 && !isInPostPage && (
Comment too long. Click here to view the full text.
)}
)}
{!isInPostPage && (
{replyCount} Replies {linkCount > 0 && ` / ${linkCount} Links`} {t('view_thread')}
)}
{!(pinned && !isInPostPage) && replies && replies.slice(0, showAllReplies ? replies.length : 5).map((reply, index) => (
))}
); }; interface PostProps { index?: number; post: Comment; showAllReplies?: boolean; } const Post = ({ post, showAllReplies = false }: PostProps) => { return (
); }; export default Post;