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,