From 9786752a4f70fce6cb92eeb28c2cf31f7a1aa833 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 15 Oct 2023 18:28:04 +0800 Subject: [PATCH] Group similar captions Some folks really just copy/paste same desc for multiple media's --- src/components/status.css | 17 ++++++-- src/components/status.jsx | 81 ++++++++++++++++++++++++++++----------- 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/components/status.css b/src/components/status.css index 2a563421..515858a5 100644 --- a/src/components/status.css +++ b/src/components/status.css @@ -1015,32 +1015,41 @@ body:has(#modal-container .carousel) .status .media img:hover { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + display: inline-flex; + gap: 4px; &:hover { color: var(--text-color); cursor: pointer; } + + &:only-child { + white-space: pre-line; + overflow: auto; + text-overflow: unset; + } } sup { opacity: 0.75; font-variant-numeric: tabular-nums; + flex-shrink: 0; } } /* Only 4, for now. Would be better if this is a for loop */ &:has(.media[data-has-alt]:nth-child(1):is(:hover, :focus)) figcaption - > div[data-caption-index='1'], + > div[data-caption-index~='1'], &:has(.media[data-has-alt]:nth-child(2):is(:hover, :focus)) figcaption - > div[data-caption-index='2'], + > div[data-caption-index~='2'], &:has(.media[data-has-alt]:nth-child(3):is(:hover, :focus)) figcaption - > div[data-caption-index='3'], + > div[data-caption-index~='3'], &:has(.media[data-has-alt]:nth-child(4):is(:hover, :focus)) figcaption - > div[data-caption-index='4'] { + > div[data-caption-index~='4'] { color: var(--text-color); } } diff --git a/src/components/status.jsx b/src/components/status.jsx index a2f57adf..9eb846e9 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -877,6 +877,62 @@ function Status({ displayedMediaAttachments.some( (media) => !!media.description && !isMediaCaptionLong(media.description), ); + const captionChildren = useMemo(() => { + if (!showMultipleMediaCaptions) return null; + const attachments = []; + displayedMediaAttachments.forEach((media, i) => { + if (!media.description) return; + const index = attachments.findIndex( + (attachment) => attachment.media.description === media.description, + ); + if (index === -1) { + attachments.push({ + media, + indices: [i], + }); + } else { + attachments[index].indices.push(i); + } + }); + return attachments.map(({ media, indices }) => ( +
i + 1).join(' ')} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + states.showMediaAlt = { + alt: media.description, + lang: language, + }; + }} + title={media.description} + > + {indices.map((i) => i + 1).join(' ')} {media.description} +
+ )); + + // return displayedMediaAttachments.map( + // (media, i) => + // !!media.description && ( + //
{ + // e.preventDefault(); + // e.stopPropagation(); + // states.showMediaAlt = { + // alt: media.description, + // lang: language, + // }; + // }} + // title={media.description} + // > + // {i + 1} {media.description} + //
+ // ), + // ); + }, [showMultipleMediaCaptions, displayedMediaAttachments, language]); return (
{ - return displayedMediaAttachments.map( - (media, i) => - !!media.description && ( -
{ - e.preventDefault(); - e.stopPropagation(); - states.showMediaAlt = { - alt: media.description, - lang: language, - }; - }} - title={media.description} - > - {i + 1} {media.description} -
- ), - ); - }} + captionChildren={captionChildren} >
{children}
- {captionChildren?.()} + {captionChildren}
);