From 74986eca04e98a4575cd03cb24d940d72156bde0 Mon Sep 17 00:00:00 2001
From: William Grant <willmgrant@gmail.com>
Date: Wed, 1 May 2024 17:17:09 +1000
Subject: [PATCH 1/7] fix: note to self messages from other devices should be
 outgoing

---
 ts/receiver/dataMessage.ts | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts
index 07be321d5..84e70c3bb 100644
--- a/ts/receiver/dataMessage.ts
+++ b/ts/receiver/dataMessage.ts
@@ -251,7 +251,9 @@ export async function handleSwarmDataMessage({
   }
 
   let msgModel =
-    isSyncedMessage || (envelope.senderIdentity && isUsFromCache(envelope.senderIdentity))
+    isSyncedMessage ||
+    (envelope.senderIdentity && isUsFromCache(envelope.senderIdentity)) ||
+    (envelope.source && isUsFromCache(envelope.source))
       ? createSwarmMessageSentFromUs({
           conversationId: convoIdToAddTheMessageTo,
           messageHash,

From cd6f7f8189b94ac8856026ac6f9ce06e4fcdb888 Mon Sep 17 00:00:00 2001
From: William Grant <willmgrant@gmail.com>
Date: Thu, 2 May 2024 12:17:49 +1000
Subject: [PATCH 2/7] fix: arm64 now builds locally

we still have an issue with building on ci
---
 build/entitlements.mac.plist | 2 ++
 build/entitlements.mas.plist | 4 ++++
 build/notarize.js            | 2 +-
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist
index dba866fb6..059da5104 100644
--- a/build/entitlements.mac.plist
+++ b/build/entitlements.mac.plist
@@ -5,6 +5,8 @@
     <!-- Mac distribution -->
     <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
     <true/>
+    <key>com.apple.security.cs.allow-jit</key>
+    <true/>
     <key>com.apple.security.cs.disable-library-validation</key>
     <true/>
     <key>com.apple.security.device.audio-input</key>
diff --git a/build/entitlements.mas.plist b/build/entitlements.mas.plist
index cc799ebf9..b132fd3b4 100644
--- a/build/entitlements.mas.plist
+++ b/build/entitlements.mas.plist
@@ -5,6 +5,10 @@
     <!-- Mac app store  -->
     <key>com.apple.security.app-sandbox</key>
     <true/>
+    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+    <true/>
+    <key>com.apple.security.cs.allow-jit</key>
+    <true/>
     <key>com.apple.security.network.client</key>
     <true/>
     <key>com.apple.security.files.user-selected.read-only</key>
diff --git a/build/notarize.js b/build/notarize.js
index 6e05292dc..038e6d736 100644
--- a/build/notarize.js
+++ b/build/notarize.js
@@ -29,7 +29,7 @@ exports.default = async function notarizing(context) {
   }
 
   const options = {
-    appBundleId: 'org.getsession.desktop',
+    appBundleId: 'com.loki-project.messenger-desktop',
     appPath: `${appOutDir}/${appName}.app`,
     appleId: SIGNING_APPLE_ID,
     appleIdPassword: SIGNING_APP_PASSWORD,

From 2fb88cfba89e3360bd3607ccfdd5f01291e0fd35 Mon Sep 17 00:00:00 2001
From: Ryan Miller <ryan.m@getsession.org>
Date: Thu, 2 May 2024 14:35:02 +1000
Subject: [PATCH 3/7] fix: change max avatar size to match other platforms

---
 ts/util/attachmentsUtil.ts | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/ts/util/attachmentsUtil.ts b/ts/util/attachmentsUtil.ts
index 913e96c9c..3e5703848 100644
--- a/ts/util/attachmentsUtil.ts
+++ b/ts/util/attachmentsUtil.ts
@@ -3,6 +3,7 @@ import imageType from 'image-type';
 
 import { arrayBufferToBlob } from 'blob-util';
 import loadImage from 'blueimp-load-image';
+import fileSize from 'filesize';
 import { StagedAttachmentType } from '../components/conversation/composition/CompositionBox';
 import { SignalService } from '../protobuf';
 import { getDecryptedMediaUrl } from '../session/crypto/DecryptedAttachmentsManager';
@@ -53,7 +54,7 @@ export async function autoScaleForAvatar<T extends { contentType: string; blob:
 ) {
   const maxMeasurements = {
     maxSide: AVATAR_MAX_SIDE,
-    maxSize: 1000 * 1024,
+    maxSize: 5 * 1024 * 1024,
   };
 
   // we can only upload jpeg, gif, or png as avatar/opengroup
@@ -79,7 +80,7 @@ export async function autoScaleForAvatar<T extends { contentType: string; blob:
 export async function autoScaleForIncomingAvatar(incomingAvatar: ArrayBuffer) {
   const maxMeasurements = {
     maxSide: AVATAR_MAX_SIDE,
-    maxSize: 1000 * 1024,
+    maxSize: 5 * 1024 * 1024,
   };
 
   // the avatar url send in a message does not contain anything related to the avatar MIME type, so
@@ -186,7 +187,7 @@ export async function autoScale<T extends { contentType: string; blob: Blob }>(
   }
 
   if (blob.type === IMAGE_GIF && blob.size > maxSize) {
-    throw new Error(`GIF is too large, required size is ${maxSize}`);
+    throw new Error(`GIF is too large. Max size: ${fileSize(maxSize, { base: 10, round: 0 })}`);
   }
 
   perfStart(`loadimage-*${blob.size}`);

From c0bb39d4e30f41262e88c3498aca587106f49671 Mon Sep 17 00:00:00 2001
From: Ryan Miller <ryan.m@getsession.org>
Date: Thu, 2 May 2024 16:49:27 +1000
Subject: [PATCH 4/7] fix: add filesize constant

---
 ts/session/constants.ts    | 9 +++++++++
 ts/util/attachmentsUtil.ts | 6 +++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/ts/session/constants.ts b/ts/session/constants.ts
index 806061e31..968f035f3 100644
--- a/ts/session/constants.ts
+++ b/ts/session/constants.ts
@@ -17,6 +17,15 @@ export const DURATION = {
   WEEKS: days * 7,
 };
 
+export const FILESIZE = {
+  /** 1KB */
+  KB: 1024,
+  /** 1MB */
+  MB: 1024 * 1024,
+  /** 1GB */
+  GB: 1024 * 1024 * 1024,
+};
+
 export const TTL_DEFAULT = {
   /** 20 seconds */
   TYPING_MESSAGE: 20 * DURATION.SECONDS,
diff --git a/ts/util/attachmentsUtil.ts b/ts/util/attachmentsUtil.ts
index 3e5703848..7856ae076 100644
--- a/ts/util/attachmentsUtil.ts
+++ b/ts/util/attachmentsUtil.ts
@@ -13,7 +13,7 @@ import { IMAGE_GIF, IMAGE_JPEG, IMAGE_PNG, IMAGE_TIFF, IMAGE_UNKNOWN } from '../
 import { getAbsoluteAttachmentPath, processNewAttachment } from '../types/MessageAttachment';
 import { THUMBNAIL_SIDE } from '../types/attachments/VisualAttachment';
 
-import { MAX_ATTACHMENT_FILESIZE_BYTES } from '../session/constants';
+import { FILESIZE, MAX_ATTACHMENT_FILESIZE_BYTES } from '../session/constants';
 import { perfEnd, perfStart } from '../session/utils/Performance';
 
 /**
@@ -54,7 +54,7 @@ export async function autoScaleForAvatar<T extends { contentType: string; blob:
 ) {
   const maxMeasurements = {
     maxSide: AVATAR_MAX_SIDE,
-    maxSize: 5 * 1024 * 1024,
+    maxSize: 5 * FILESIZE.MB,
   };
 
   // we can only upload jpeg, gif, or png as avatar/opengroup
@@ -80,7 +80,7 @@ export async function autoScaleForAvatar<T extends { contentType: string; blob:
 export async function autoScaleForIncomingAvatar(incomingAvatar: ArrayBuffer) {
   const maxMeasurements = {
     maxSide: AVATAR_MAX_SIDE,
-    maxSize: 5 * 1024 * 1024,
+    maxSize: 5 * FILESIZE.MB,
   };
 
   // the avatar url send in a message does not contain anything related to the avatar MIME type, so

From 12caf66cde5b455a2d796a3d98f11ab3b23036ce Mon Sep 17 00:00:00 2001
From: William Grant <willmgrant@gmail.com>
Date: Thu, 9 May 2024 10:53:21 +1000
Subject: [PATCH 5/7] fix: message preview status icon was shrinking due to
 text overflow

also added session icon improvements from onboarding branch
---
 ts/components/icon/Icons.tsx                  | 14 ++++-
 ts/components/icon/SessionIcon.tsx            | 54 +++++++++++--------
 .../conversation-list-item/MessageItem.tsx    | 20 ++++++-
 3 files changed, 62 insertions(+), 26 deletions(-)

diff --git a/ts/components/icon/Icons.tsx b/ts/components/icon/Icons.tsx
index 27f336055..b237f3316 100644
--- a/ts/components/icon/Icons.tsx
+++ b/ts/components/icon/Icons.tsx
@@ -88,7 +88,19 @@ export type SessionIconType =
 
 export type SessionIconSize = 'tiny' | 'small' | 'medium' | 'large' | 'huge' | 'huge2' | 'max';
 
-export const icons: Record<string, { path: string; viewBox: string; ratio: number }> = {
+export type ClipRule = 'nonzero' | 'evenodd' | 'inherit';
+export type FillRule = 'nonzero' | 'evenodd';
+
+type IconProps = {
+  path: string;
+  viewBox: string;
+  ratio: number;
+  fill?: string;
+  clipRule?: ClipRule;
+  fillRule?: FillRule;
+};
+
+export const icons: Record<SessionIconType, IconProps> = {
   addUser: {
     path: 'M8.85,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12c1.73,0,3.13-1.4,3.13-3.12S10.58,2.17,8.85,2.17z M8.85,0.08c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21s-5.2-2.33-5.2-5.21C3.65,2.42,5.98,0.08,8.85,0.08z M20.83,5.29 c0.54,0,0.98,0.41,1.04,0.93l0.01,0.11v2.08h2.08c0.54,0,0.98,0.41,1.04,0.93v0.12c0,0.54-0.41,0.98-0.93,1.04l-0.11,0.01h-2.08 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08h-2.08c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11 c0-0.54,0.41-0.98,0.93-1.04l0.11-0.01h2.08V6.34C19.79,5.76,20.26,5.29,20.83,5.29z M12.5,12.58c2.8,0,5.09,2.21,5.2,4.99v0.22 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21 c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8 c0-2.8,2.21-5.09,4.99-5.2h0.22h7.29V12.58z',
     viewBox: '0 0 25 21',
diff --git a/ts/components/icon/SessionIcon.tsx b/ts/components/icon/SessionIcon.tsx
index 604357ca3..366832348 100644
--- a/ts/components/icon/SessionIcon.tsx
+++ b/ts/components/icon/SessionIcon.tsx
@@ -1,7 +1,8 @@
-import React from 'react';
-import styled, { css, keyframes } from 'styled-components';
+import React, { memo } from 'react';
+import styled, { css, CSSProperties, keyframes } from 'styled-components';
 
 import { icons, SessionIconSize, SessionIconType } from '.';
+import { ClipRule, FillRule } from './Icons';
 
 export type SessionIconProps = {
   iconType: SessionIconType;
@@ -15,6 +16,7 @@ export type SessionIconProps = {
   glowStartDelay?: number;
   noScale?: boolean;
   backgroundColor?: string;
+  style?: CSSProperties;
   dataTestId?: string;
   unreadCount?: number;
 };
@@ -55,6 +57,9 @@ type StyledSvgProps = {
   noScale?: boolean;
   iconColor?: string;
   backgroundColor?: string;
+  fill?: string;
+  clipRule?: ClipRule;
+  filleRule?: FillRule;
 };
 
 const rotate = keyframes`
@@ -119,37 +124,28 @@ const animation = (props: {
   return undefined;
 };
 
-const Svg = React.memo(styled.svg<StyledSvgProps>`
+const Svg = memo(styled.svg<StyledSvgProps>`
   width: ${props => props.width};
   transform: ${props => `rotate(${props.iconRotation}deg)`};
   ${props => animation(props)};
   border-radius: ${props => props.borderRadius};
   background-color: ${props =>
-    props.backgroundColor ? props.backgroundColor : '--button-icon-background-color'};
-  border-radius: ${props => (props.borderRadius ? props.borderRadius : '')};
+    props.backgroundColor ? props.backgroundColor : 'var(--button-icon-background-color)'};
   filter: ${props => (props.noScale ? `drop-shadow(0px 0px 4px ${props.iconColor})` : '')};
-  fill: ${props => (props.iconColor ? props.iconColor : '--button-icon-stroke-color')};
+  fill: ${props => (props.iconColor ? props.iconColor : 'var(--button-icon-stroke-color)')};
   padding: ${props => (props.iconPadding ? props.iconPadding : '')};
   transition: inherit;
 `);
 
-const SessionSvg = (props: {
-  viewBox: string;
-  path: string | Array<string>;
-  width: string | number;
-  height: string | number;
-  iconRotation: number;
-  iconColor?: string;
-  rotateDuration?: number;
-  glowDuration?: number;
-  glowStartDelay?: number;
-  noScale?: boolean;
-  borderRadius?: string;
-  backgroundColor?: string;
-  iconPadding?: string;
-  dataTestId?: string;
-}) => {
-  const colorSvg = props.iconColor ? props.iconColor : '--button-icon-stroke-color';
+const SessionSvg = (
+  props: StyledSvgProps & {
+    viewBox: string;
+    path: string | Array<string>;
+    style?: CSSProperties;
+    dataTestId?: string;
+  }
+) => {
+  const colorSvg = props.iconColor ? props.iconColor : 'var(--button-icon-stroke-color)';
   const pathArray = props.path instanceof Array ? props.path : [props.path];
   const propsToPick = {
     width: props.width,
@@ -164,6 +160,10 @@ const SessionSvg = (props: {
     backgroundColor: props.backgroundColor,
     borderRadius: props.borderRadius,
     iconPadding: props.iconPadding,
+    fill: props.fill,
+    clipRule: props.clipRule,
+    fillRule: props.filleRule,
+    style: props.style,
     dataTestId: props.dataTestId,
   };
 
@@ -187,6 +187,7 @@ export const SessionIcon = (props: SessionIconProps) => {
     noScale,
     backgroundColor,
     iconPadding,
+    style,
     dataTestId,
   } = props;
   let { iconSize, iconRotation } = props;
@@ -196,6 +197,9 @@ export const SessionIcon = (props: SessionIconProps) => {
   const iconDimensions = getIconDimensionFromIconSize(iconSize);
   const iconDef = icons[iconType];
   const ratio = iconDef?.ratio || 1;
+  const fill = iconDef?.fill || undefined;
+  const clipRule = iconDef?.clipRule || 'nonzero';
+  const fillRule = iconDef?.fillRule || 'nonzero';
 
   return (
     <SessionSvg
@@ -212,6 +216,10 @@ export const SessionIcon = (props: SessionIconProps) => {
       iconColor={iconColor}
       backgroundColor={backgroundColor}
       iconPadding={iconPadding}
+      fill={fill}
+      clipRule={clipRule}
+      filleRule={fillRule}
+      style={style}
       dataTestId={dataTestId}
     />
   );
diff --git a/ts/components/leftpane/conversation-list-item/MessageItem.tsx b/ts/components/leftpane/conversation-list-item/MessageItem.tsx
index 5b0d8bf1a..792e9c8a8 100644
--- a/ts/components/leftpane/conversation-list-item/MessageItem.tsx
+++ b/ts/components/leftpane/conversation-list-item/MessageItem.tsx
@@ -68,13 +68,21 @@ function IconMessageStatus({ status }: { status: LastMessageStatusType }) {
   const nonErrorIconColor = 'var(--text-secondary-color';
   switch (status) {
     case 'error':
-      return <SessionIcon iconColor={'var(--danger-color'} iconType="error" iconSize="tiny" />;
+      return (
+        <SessionIcon
+          iconColor={'var(--danger-color'}
+          iconType="error"
+          iconSize="tiny"
+          style={{ flexShrink: 0 }}
+        />
+      );
     case 'read':
       return (
         <SessionIcon
           iconColor={nonErrorIconColor}
           iconType="doubleCheckCircleFilled"
           iconSize="tiny"
+          style={{ flexShrink: 0 }}
         />
       );
     case 'sending':
@@ -84,10 +92,18 @@ function IconMessageStatus({ status }: { status: LastMessageStatusType }) {
           iconColor={nonErrorIconColor}
           iconType="sending"
           iconSize="tiny"
+          style={{ flexShrink: 0 }}
         />
       );
     case 'sent':
-      return <SessionIcon iconColor={nonErrorIconColor} iconType="circleCheck" iconSize="tiny" />;
+      return (
+        <SessionIcon
+          iconColor={nonErrorIconColor}
+          iconType="circleCheck"
+          iconSize="tiny"
+          style={{ flexShrink: 0 }}
+        />
+      );
     case undefined:
       return null;
     default:

From 40d81d0c66294fc2c593401778e064db9704bc28 Mon Sep 17 00:00:00 2001
From: William Grant <willmgrant@gmail.com>
Date: Tue, 21 May 2024 14:58:29 +1000
Subject: [PATCH 6/7] fix: admins should also be able to clear reactions in
 communities

not just moderators
---
 ts/components/dialog/ReactListModal.tsx | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/ts/components/dialog/ReactListModal.tsx b/ts/components/dialog/ReactListModal.tsx
index fbf943c32..370e59e35 100644
--- a/ts/components/dialog/ReactListModal.tsx
+++ b/ts/components/dialog/ReactListModal.tsx
@@ -14,6 +14,7 @@ import {
 } from '../../state/ducks/modalDialog';
 import {
   useSelectedIsPublic,
+  useSelectedWeAreAdmin,
   useSelectedWeAreModerator,
 } from '../../state/selectors/selectedConversation';
 import { SortedReactionList } from '../../types/Reaction';
@@ -231,6 +232,7 @@ export const ReactListModal = (props: Props) => {
 
   const msgProps = useMessageReactsPropsById(messageId);
   const isPublic = useSelectedIsPublic();
+  const weAreAdmin = useSelectedWeAreAdmin();
   const weAreModerator = useSelectedWeAreModerator();
   const me = UserUtils.getOurPubKeyStrFromCache();
 
@@ -362,7 +364,7 @@ export const ReactListModal = (props: Props) => {
                   </>
                 )}
               </p>
-              {isPublic && weAreModerator && (
+              {isPublic && (weAreAdmin || weAreModerator) && (
                 <SessionButton
                   text={window.i18n('clearAll')}
                   buttonColor={SessionButtonColor.Danger}

From 70a987453dac6e613034b0e3e55f93ad4094b371 Mon Sep 17 00:00:00 2001
From: William Grant <willmgrant@gmail.com>
Date: Tue, 21 May 2024 15:41:17 +1000
Subject: [PATCH 7/7] fix: sender name in react list modal is now truncated

---
 stylesheets/_modules.scss                     |  5 -----
 ts/components/conversation/ContactName.tsx    |  5 ++---
 .../message/message-content/Quote.tsx         |  3 +--
 .../message-content/quote/QuoteAuthor.tsx     |  1 -
 ts/components/dialog/ReactListModal.tsx       | 19 +++++++++++++------
 5 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss
index 3a7e348fa..c37d708bd 100644
--- a/stylesheets/_modules.scss
+++ b/stylesheets/_modules.scss
@@ -20,11 +20,6 @@
 .module-contact-name__profile-number.italic {
   font-style: italic;
 }
-
-.module-contact-name.compact {
-  display: block;
-}
-
 // Module: Message
 
 .module-message__error-container {
diff --git a/ts/components/conversation/ContactName.tsx b/ts/components/conversation/ContactName.tsx
index 5216371f3..d370980f2 100644
--- a/ts/components/conversation/ContactName.tsx
+++ b/ts/components/conversation/ContactName.tsx
@@ -13,12 +13,11 @@ type Props = {
   profileName?: string | null;
   module?: string;
   boldProfileName?: boolean;
-  compact?: boolean;
   shouldShowPubkey: boolean;
 };
 
 export const ContactName = (props: Props) => {
-  const { pubkey, name, profileName, module, boldProfileName, compact, shouldShowPubkey } = props;
+  const { pubkey, name, profileName, module, boldProfileName, shouldShowPubkey } = props;
   const prefix = module || 'module-contact-name';
 
   const convoName = useNicknameOrProfileNameOrShortenedPubkey(pubkey);
@@ -43,7 +42,7 @@ export const ContactName = (props: Props) => {
 
   return (
     <span
-      className={classNames(prefix, compact && 'compact')}
+      className={classNames(prefix)}
       dir="auto"
       data-testid={`${prefix}__profile-name`}
       style={{
diff --git a/ts/components/conversation/message/message-content/Quote.tsx b/ts/components/conversation/message/message-content/Quote.tsx
index e2a29d634..5df515025 100644
--- a/ts/components/conversation/message/message-content/Quote.tsx
+++ b/ts/components/conversation/message/message-content/Quote.tsx
@@ -1,6 +1,6 @@
 import classNames from 'classnames';
-import React, { useState } from 'react';
 import { noop } from 'lodash';
+import React, { useState } from 'react';
 
 import * as MIME from '../../../../types/MIME';
 import * as GoogleChrome from '../../../../util/GoogleChrome';
@@ -291,7 +291,6 @@ const QuoteAuthor = (props: QuoteAuthorProps) => {
           pubkey={PubKey.shorten(author)}
           name={authorName}
           profileName={authorProfileName}
-          compact={true}
           shouldShowPubkey={Boolean(props.showPubkeyForAuthor)}
         />
       )}
diff --git a/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx b/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
index 01763fa5a..e2b92b348 100644
--- a/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
+++ b/ts/components/conversation/message/message-content/quote/QuoteAuthor.tsx
@@ -41,7 +41,6 @@ export const QuoteAuthor = (props: QuoteAuthorProps) => {
       <ContactName
         pubkey={PubKey.shorten(author)}
         name={authorName}
-        compact={true}
         shouldShowPubkey={Boolean(authorName && !isMe && isPublic)}
       />
     </StyledQuoteAuthor>
diff --git a/ts/components/dialog/ReactListModal.tsx b/ts/components/dialog/ReactListModal.tsx
index 370e59e35..f4a1fafd9 100644
--- a/ts/components/dialog/ReactListModal.tsx
+++ b/ts/components/dialog/ReactListModal.tsx
@@ -51,6 +51,11 @@ const StyledSendersContainer = styled(Flex)`
   padding: 0 16px 16px;
 `;
 
+const StyledContactContainer = styled.span`
+  text-overflow: ellipsis;
+  overflow: hidden;
+`;
+
 const StyledReactionBar = styled(Flex)`
   width: 100%;
   margin: 12px 0 20px 4px;
@@ -133,7 +138,7 @@ const ReactionSenders = (props: ReactionSendersProps) => {
           justifyContent={'space-between'}
           alignItems={'center'}
         >
-          <Flex container={true} alignItems={'center'}>
+          <Flex container={true} alignItems={'center'} style={{ overflow: 'hidden' }}>
             <Avatar
               size={AvatarSize.XS}
               pubkey={sender}
@@ -144,11 +149,13 @@ const ReactionSenders = (props: ReactionSendersProps) => {
             {sender === me ? (
               window.i18n('you')
             ) : (
-              <ContactName
-                pubkey={sender}
-                module="module-conversation__user"
-                shouldShowPubkey={false}
-              />
+              <StyledContactContainer>
+                <ContactName
+                  pubkey={sender}
+                  module="module-conversation__user"
+                  shouldShowPubkey={false}
+                />
+              </StyledContactContainer>
             )}
           </Flex>
           {sender === me && (