diff --git a/.changeset/add_multiple_previews.md b/.changeset/add_multiple_previews.md new file mode 100644 index 000000000..7e1d70782 --- /dev/null +++ b/.changeset/add_multiple_previews.md @@ -0,0 +1,5 @@ +--- +default: minor +--- + +Reorganize Embed settings and reintroduce multiple embeds diff --git a/.gitignore b/.gitignore index d6c83cfb1..7ec719709 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ build.sh # the following line was added with the "git ignore" tool by itsrye.dev, version 0.1.0 .lh + +# the following line was added with nvim by Shea because its annoying to clear every so often +.vscode/bookmarks.json diff --git a/src/app/components/RenderMessageContent.tsx b/src/app/components/RenderMessageContent.tsx index cfc95b2cd..f7908c7bf 100644 --- a/src/app/components/RenderMessageContent.tsx +++ b/src/app/components/RenderMessageContent.tsx @@ -84,6 +84,7 @@ function RenderMessageContentInternal({ const [autoplayGifs] = useSetting(settingsAtom, 'autoplayGifs'); const [captionPosition] = useSetting(settingsAtom, 'captionPosition'); + const [multiplePreviews] = useSetting(settingsAtom, 'multiplePreviews'); const settingsLinkBaseUrl = useSettingsLinkBaseUrl(); const captionPositionMap = { [CaptionPosition.Above]: 'column-reverse', @@ -117,8 +118,7 @@ function RenderMessageContentInternal({ type: getMediaType(url), })); - const mediaLinks = analyzed.filter((item) => item.type !== null); - const toRender = mediaLinks.length > 0 ? mediaLinks : [analyzed[0]]; + const toRender = multiplePreviews ? analyzed : [analyzed[0]]; return ( {toRender.map(({ url, type }) => { @@ -136,7 +136,7 @@ function RenderMessageContentInternal({ ); }, - [ts, clientUrlPreview, settingsLinkBaseUrl, urlPreview] + [multiplePreviews, settingsLinkBaseUrl, clientUrlPreview, urlPreview, ts] ); const renderBundledPreviews = useCallback( (bundles: IPreviewUrlResponse[]) => ( diff --git a/src/app/components/message/content/ImageContent.tsx b/src/app/components/message/content/ImageContent.tsx index ad51d2a4f..60cb9cb09 100644 --- a/src/app/components/message/content/ImageContent.tsx +++ b/src/app/components/message/content/ImageContent.tsx @@ -197,6 +197,7 @@ export const ImageContent = as<'div', ImageContentProps>( hasDimensions ? css.AbsoluteContainer : undefined, blurred && css.Blur )} + style={{ width: '100%' }} > {renderImage({ alt: body, diff --git a/src/app/components/url-preview/UrlPreviewCard.tsx b/src/app/components/url-preview/UrlPreviewCard.tsx index 63586b436..9e3dbdd1d 100644 --- a/src/app/components/url-preview/UrlPreviewCard.tsx +++ b/src/app/components/url-preview/UrlPreviewCard.tsx @@ -108,6 +108,15 @@ export const UrlPreviewCard = as< } }; + const ogW = ((prev['og:video'] && prev['og:video:width']) || + (prev['og:image'] && prev['og:image:width']) || + 1) as number; + const ogH = ((prev['og:video'] && prev['og:video:height']) || + (prev['og:image'] && prev['og:image:height']) || + 1) as number; + + const aspectRatio = ogW && ogH ? `${ogW} / ${ogH}` : undefined; + return ( { - const ogW = prev['og:image:width']; - const ogH = prev['og:image:height']; - const aspectRatio = ogW && ogH ? `${ogW} / ${ogH}` : undefined; - return ( - ( + + - } - renderImage={(p) => ( - - )} - /> - - ); - })()} + autoPlay + onAuxClick={handleAuxClick} + body={prev['og:title']} + url={prev['og:image']} + renderViewer={(p) => } + renderImage={(p) => ( + + )} + /> + + ))()} {!prev['og:video'] && !prev['og:image'] && prev['og:audio'] && ( {previewContent} @@ -345,24 +356,31 @@ export const UrlPreviewHolder = as<'div'>(({ children, ...props }, ref) => { )} - + {children} - {canScrollRight && ( - <> -
- - - - - )} + {canScrollRight && ( + <> +
+ + + + + )} diff --git a/src/app/features/settings/general/General.tsx b/src/app/features/settings/general/General.tsx index 6a5f7d5c5..a0844ce2b 100644 --- a/src/app/features/settings/general/General.tsx +++ b/src/app/features/settings/general/General.tsx @@ -882,18 +882,6 @@ function Messages() { 'hideNickAvatarEvents' ); const [mediaAutoLoad, setMediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); - const [bundledPreview, setBundledPreview] = useSetting(settingsAtom, 'bundledPreview'); - const [urlPreview, setUrlPreview] = useSetting(settingsAtom, 'urlPreview'); - const [encUrlPreview, setEncUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); - const [clientUrlPreview, setClientUrlPreview] = useSetting(settingsAtom, 'clientUrlPreview'); - const [encClientUrlPreview, setEncClientUrlPreview] = useSetting( - settingsAtom, - 'encClientUrlPreview' - ); - const [clientPreviewYoutube, setClientPreviewYoutube] = useSetting( - settingsAtom, - 'clientPreviewYoutube' - ); const [showHiddenEvents, setShowHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); const [showTombstoneEvents, setShowTombstoneEvents] = useSetting( settingsAtom, @@ -947,6 +935,19 @@ function Messages() { /> )} + + setMediaAutoLoad(!v)} + /> + } + /> + setMediaAutoLoad(!v)} + value={hideMembershipInReadOnly} + onChange={setHideMembershipInReadOnly} + /> + } + /> + + + + + + } + /> + + + ); +} + +function Embeds() { + const [multiplePreviews, setMultiplePreviews] = useSetting(settingsAtom, 'multiplePreviews'); + const [bundledPreview, setBundledPreview] = useSetting(settingsAtom, 'bundledPreview'); + const [urlPreview, setUrlPreview] = useSetting(settingsAtom, 'urlPreview'); + const [encUrlPreview, setEncUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); + const [clientUrlPreview, setClientUrlPreview] = useSetting(settingsAtom, 'clientUrlPreview'); + const [encClientUrlPreview, setEncClientUrlPreview] = useSetting( + settingsAtom, + 'encClientUrlPreview' + ); + const [clientPreviewYoutube, setClientPreviewYoutube] = useSetting( + settingsAtom, + 'clientPreviewYoutube' + ); + return ( + + Embeds + + + } + /> + - - - } - /> - - - - - - } - /> - ); } @@ -1408,6 +1427,7 @@ export function General({ requestBack, requestClose }: Readonly) { + diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index e26fff911..16be2770d 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -53,6 +53,7 @@ export interface Settings { legacyUsernameColor: boolean; mediaAutoLoad: boolean; + multiplePreviews: boolean; bundledPreview: boolean; urlPreview: boolean; encUrlPreview: boolean; @@ -148,6 +149,7 @@ const defaultSettings: Settings = { hideMembershipEvents: false, hideNickAvatarEvents: true, mediaAutoLoad: true, + multiplePreviews: true, bundledPreview: true, urlPreview: true, encUrlPreview: false,