feat: show file/image labels instead of link when requirePostLinkIsMedia is truthy

This commit is contained in:
plebeius
2026-02-27 14:42:46 +08:00
parent b813c38f7a
commit 549300f20d
5 changed files with 16 additions and 6 deletions
+1
View File
@@ -174,6 +174,7 @@
"user_banned": "User was banned for this post", "user_banned": "User was banned for this post",
"replies": "replies", "replies": "replies",
"links": "links", "links": "links",
"images": "images",
"animated_gif": "Animated GIF", "animated_gif": "Animated GIF",
"pending": "Pending", "pending": "Pending",
"failed": "Failed", "failed": "Failed",
@@ -3,7 +3,7 @@ import { Link, useLocation, useNavigate, useParams } from 'react-router-dom';
import { useAccountComment, useComment, useSubscribe } from '@plebbit/plebbit-react-hooks'; import { useAccountComment, useComment, useSubscribe } from '@plebbit/plebbit-react-hooks';
import { isAllView, isCatalogView, isModView, isModQueueView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils'; import { isAllView, isCatalogView, isModView, isModQueueView, isPendingPostView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils';
import { usePostPageNumber } from '../../hooks/use-post-page-number'; import { usePostPageNumber } from '../../hooks/use-post-page-number';
import { useDirectories } from '../../hooks/use-directories'; import { useDirectories, useDirectoryByAddress } from '../../hooks/use-directories';
import { getBoardPath, isDirectoryBoard } from '../../lib/utils/route-utils'; import { getBoardPath, isDirectoryBoard } from '../../lib/utils/route-utils';
import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address'; import { useResolvedSubplebbitAddress } from '../../hooks/use-resolved-subplebbit-address';
import useCatalogFiltersStore from '../../stores/use-catalog-filters-store'; import useCatalogFiltersStore from '../../stores/use-catalog-filters-store';
@@ -470,6 +470,8 @@ export const PostPageStats = () => {
const { closed, pinned, replyCount } = post || {}; const { closed, pinned, replyCount } = post || {};
const linkCount = useCountLinksInReplies(post); const linkCount = useCountLinksInReplies(post);
const directoryEntry = useDirectoryByAddress(subplebbitAddress);
const requirePostLinkIsMedia = directoryEntry?.features?.requirePostLinkIsMedia === true;
const isThreadView = isPostPageView(location.pathname, params); const isThreadView = isPostPageView(location.pathname, params);
const pageNumber = usePostPageNumber({ const pageNumber = usePostPageNumber({
@@ -485,7 +487,8 @@ export const PostPageStats = () => {
<span> <span>
{pinned && `${capitalize(t('sticky'))} / `} {pinned && `${capitalize(t('sticky'))} / `}
{closed && `${capitalize(t('closed'))} / `} {closed && `${capitalize(t('closed'))} / `}
<Tooltip content={replyCountTooltip}>{displayReplyCount}</Tooltip> / <Tooltip content={capitalize(t('links'))}>{linkCount?.toString()}</Tooltip> <Tooltip content={replyCountTooltip}>{displayReplyCount}</Tooltip> /{' '}
<Tooltip content={capitalize(requirePostLinkIsMedia ? t('images') : t('links'))}>{linkCount?.toString()}</Tooltip>
{isThreadView && ( {isThreadView && (
<> <>
{' '} {' '}
+4 -2
View File
@@ -128,6 +128,8 @@ const CatalogPost = memo(
const isInAllView = isAllView(location.pathname); const isInAllView = isAllView(location.pathname);
const isInSubscriptionsView = isSubscriptionsView(location.pathname, params); const isInSubscriptionsView = isSubscriptionsView(location.pathname, params);
const directories = useDirectories(); const directories = useDirectories();
const directoryEntry = directories?.find((c) => c.address === subplebbitAddress);
const requirePostLinkIsMedia = directoryEntry?.features?.requirePostLinkIsMedia === true;
const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : ''; const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : '';
const postMenuProps = useMemo(() => selectPostMenuProps(post), [post]); const postMenuProps = useMemo(() => selectPostMenuProps(post), [post]);
@@ -257,12 +259,12 @@ const CatalogPost = memo(
) : ( ) : (
threadIcons threadIcons
)} )}
<div className={styles.meta} title='(R)eplies / (L)ink Replies'> <div className={styles.meta} title={requirePostLinkIsMedia ? '(R)eplies / (I)mage Replies' : '(R)eplies / (L)ink Replies'}>
R: <b>{replyCount || '0'}</b> R: <b>{replyCount || '0'}</b>
{linkCount > 0 && ( {linkCount > 0 && (
<span> <span>
{' '} {' '}
/ L: <b>{linkCount}</b> / {requirePostLinkIsMedia ? 'I' : 'L'}: <b>{linkCount}</b>
</span> </span>
)} )}
<span className={`${styles.postMenu} ${hoveredCid && styles.postMenuVisible}`}> <span className={`${styles.postMenu} ${hoveredCid && styles.postMenuVisible}`}>
+3 -1
View File
@@ -556,6 +556,8 @@ const PostMedia = ({
const [showThumbnail, setShowThumbnail] = useState(true); const [showThumbnail, setShowThumbnail] = useState(true);
const mediaDimensions = getMediaDimensions(commentMediaInfo); const mediaDimensions = getMediaDimensions(commentMediaInfo);
const directoryEntry = directories?.find((c) => c.address === subplebbitAddress);
const requirePostLinkIsMedia = directoryEntry?.features?.requirePostLinkIsMedia === true;
const boardPath = getBoardPath(subplebbitAddress, directories); const boardPath = getBoardPath(subplebbitAddress, directories);
const displayBoardPath = const displayBoardPath =
boardPath !== subplebbitAddress boardPath !== subplebbitAddress
@@ -572,7 +574,7 @@ const PostMedia = ({
{t('board')}: <Link to={`/${boardPath}`}>{displayBoardPath}</Link>{' '} {t('board')}: <Link to={`/${boardPath}`}>{displayBoardPath}</Link>{' '}
</> </>
)} )}
{t('link')}:{' '} {requirePostLinkIsMedia ? t('file') : t('link')}:{' '}
<a href={url} target='_blank' rel='noopener noreferrer'> <a href={url} target='_blank' rel='noopener noreferrer'>
{spoiler ? capitalize(t('spoiler')) : url && url.length > 30 ? url.slice(0, 30) + '...' : url} {spoiler ? capitalize(t('spoiler')) : url && url.length > 30 ? url.slice(0, 30) + '...' : url}
</a>{' '} </a>{' '}
+3 -1
View File
@@ -537,6 +537,8 @@ const PostMobile = ({
const isInPendingPostView = isPendingPostView(location.pathname, params); const isInPendingPostView = isPendingPostView(location.pathname, params);
const isInPostView = isPostPageView(location.pathname, params); const isInPostView = isPostPageView(location.pathname, params);
const directories = useDirectories(); const directories = useDirectories();
const directoryEntry = directories?.find((c) => c.address === subplebbitAddress);
const requirePostLinkIsMedia = directoryEntry?.features?.requirePostLinkIsMedia === true;
const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : undefined; const boardPath = subplebbitAddress ? getBoardPath(subplebbitAddress, directories) : undefined;
const linksCount = useCountLinksInReplies(post); const linksCount = useCountLinksInReplies(post);
const shouldFetchReplies = showReplies && !isModQueue; const shouldFetchReplies = showReplies && !isModQueue;
@@ -695,7 +697,7 @@ const PostMobile = ({
<div className={styles.postLink}> <div className={styles.postLink}>
<span className={styles.info}> <span className={styles.info}>
{replyCount > 0 && `${replyCount} Replies`} {replyCount > 0 && `${replyCount} Replies`}
{linksCount > 0 && ` / ${linksCount} Links`} {linksCount > 0 && ` / ${linksCount} ${requirePostLinkIsMedia ? 'Images' : 'Links'}`}
</span> </span>
{isModQueue ? ( {isModQueue ? (
<div className={styles.modQueueActions}> <div className={styles.modQueueActions}>