From 109e5962e4df28cdd1e5cf4683a355ecee02e6e7 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 02:45:43 +0530
Subject: [PATCH 01/44] Changes
---
.../tests/room/message-markdown-click.yaml | 116 ++++++++++++++++--
app/containers/ThreadDetails.tsx | 6 +-
app/containers/message/Touch.tsx | 6 +-
app/containers/message/Touchable.tsx | 2 +-
4 files changed, 111 insertions(+), 19 deletions(-)
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index f0a746f2648..a2e490482bf 100644
--- a/.maestro/tests/room/message-markdown-click.yaml
+++ b/.maestro/tests/room/message-markdown-click.yaml
@@ -3,23 +3,19 @@ name: Message Markdown
jsEngine: graaljs
onFlowStart:
- runFlow: '../../helpers/setup.yaml'
-onFlowComplete:
- - evalScript: ${output.utils.deleteCreatedUsers()}
tags:
- test-9
---
-- evalScript: ${output.user = output.utils.createUser()}
-
- runFlow:
file: '../../helpers/login-with-deeplink.yaml'
env:
- USERNAME: ${output.user.username}
- PASSWORD: ${output.user.password}
+ USERNAME: ${output.account.adminUser}
+ PASSWORD: ${output.account.adminPassword}
- runFlow:
file: '../../helpers/search-and-navigate-room.yaml'
env:
- ROOM: 'maestro-message-clickable-test'
+ ROOM: 'maestro-message-clickable-test-temp'
- extendedWaitUntil:
visible:
@@ -63,7 +59,7 @@ tags:
# Wait for room view to be visible again
- extendedWaitUntil:
visible:
- id: 'room-view-title-maestro-message-clickable-test'
+ id: 'room-view-title-maestro-message-clickable-test-temp'
timeout: 60000
# Tap on the URL link to open alert
@@ -78,7 +74,7 @@ tags:
platform: iOS
commands:
- tapOn:
- point: 66%,63%
+ point: 66%,59%
# Verify alert is shown with the link
- extendedWaitUntil:
@@ -106,7 +102,7 @@ tags:
platform: iOS
commands:
- longPressOn:
- point: 66%,63%
+ point: 66%,59%
# Verify clipboard has the link alert
- extendedWaitUntil:
@@ -143,7 +139,7 @@ tags:
# Wait for room view to be visible again
- extendedWaitUntil:
visible:
- id: 'room-view-title-maestro-message-clickable-test'
+ id: 'room-view-title-maestro-message-clickable-test-temp'
timeout: 60000
# Tap on message with thread to open thread room
@@ -163,7 +159,7 @@ tags:
# Wait for room view to be visible again
- extendedWaitUntil:
visible:
- id: 'room-view-title-maestro-message-clickable-test'
+ id: 'room-view-title-maestro-message-clickable-test-temp'
timeout: 60000
# Tap on "View thread" button
@@ -183,7 +179,7 @@ tags:
# Wait for room view to be visible again
- extendedWaitUntil:
visible:
- id: 'room-view-title-maestro-message-clickable-test'
+ id: 'room-view-title-maestro-message-clickable-test-temp'
timeout: 60000
# Now tap on a message within the thread
@@ -195,3 +191,97 @@ tags:
visible:
id: 'room-view-title-message with thread'
timeout: 60000
+
+# Go back to main room
+- tapOn:
+ id: header-back
+
+# Wait for room view to be visible again
+- extendedWaitUntil:
+ visible:
+ id: 'room-view-title-maestro-message-clickable-test-temp'
+ timeout: 60000
+
+# Long press on avatar and make sure it show user info
+- longPressOn: "rohit.bansal's avatar"
+- extendedWaitUntil:
+ visible:
+ text: '.*User info*.'
+ timeout: 60000
+
+# Go back to main room
+- tapOn: Back
+- extendedWaitUntil:
+ visible:
+ id: 'room-view-title-maestro-message-clickable-test-temp'
+ timeout: 60000
+
+# This is to make sure that button is in correct state before we test
+- runFlow:
+ when:
+ visible:
+ id: 'thread-unfollow'
+ commands:
+ - tapOn:
+ id: 'thread-unfollow'
+
+# Click follow to notification button and make sure it stays in room and the button changes to unfollow
+- tapOn:
+ id: 'thread-follow'
+- extendedWaitUntil:
+ visible:
+ id: 'thread-unfollow'
+ timeout: 10000
+- extendedWaitUntil:
+ visible:
+ id: 'room-view-title-maestro-message-clickable-test-temp'
+ timeout: 60000
+
+# Click unfollow to notification button and make sure it stays in room and the button changes to follow
+- tapOn:
+ id: 'thread-unfollow'
+- extendedWaitUntil:
+ visible:
+ id: 'thread-follow'
+ timeout: 10000
+- extendedWaitUntil:
+ visible:
+ id: 'room-view-title-maestro-message-clickable-test-temp'
+ timeout: 60000
+
+# Click UI Kit Button
+- runFlow:
+ when:
+ platform: iOS
+ commands:
+ - tapOn:
+ point: '55%,86%'
+- runFlow:
+ when:
+ platform: Android
+ commands:
+ - tapOn: Tap Me
+
+- extendedWaitUntil:
+ visible:
+ text: '.*Button tap received! This reply is private to you*.'
+ timeout: 10000
+
+# Click Emphemeral UI Kit Button
+- tapOn:
+ id: message-composer-input
+- inputText:
+ text: '/send-emphemeral-button'
+- extendedWaitUntil:
+ visible:
+ id: autocomplete-item-send-emphemeral-button
+ timeout: 10000
+- tapOn:
+ id: autocomplete-item-send-emphemeral-button
+- tapOn:
+ id: 'message-composer-send'
+- tapOn: 'Ephemeral Button'
+- extendedWaitUntil:
+ visible:
+ text: '.*A very secret message visible after clicking Ephemeral Button"*.'
+ timeout: 10000
diff --git a/app/containers/ThreadDetails.tsx b/app/containers/ThreadDetails.tsx
index 08c6ce78005..1b4469e11d0 100644
--- a/app/containers/ThreadDetails.tsx
+++ b/app/containers/ThreadDetails.tsx
@@ -79,7 +79,10 @@ const ThreadDetails = ({ item, user, badgeColor, toggleFollowThread, style }: IT
-
+
{replies}
@@ -88,6 +91,7 @@ const ThreadDetails = ({ item, user, badgeColor, toggleFollowThread, style }: IT
{badgeColor ? : null}
toggleFollowThread?.(isFollowing, item.id)}>
diff --git a/app/containers/message/Touch.tsx b/app/containers/message/Touch.tsx
index 882cb7a7c51..99816529bc5 100644
--- a/app/containers/message/Touch.tsx
+++ b/app/containers/message/Touch.tsx
@@ -1,14 +1,12 @@
import { forwardRef, type ReactNode, type RefObject } from 'react';
+import { TouchableOpacity, TouchableHighlight, type TouchableWithoutFeedbackProps } from 'react-native-gesture-handler';
import {
View,
StyleSheet,
type ViewStyle,
type StyleProp,
type AccessibilityActionEvent,
- type AccessibilityActionInfo,
- TouchableOpacity,
- TouchableHighlight,
- type TouchableWithoutFeedbackProps
+ type AccessibilityActionInfo
} from 'react-native';
import { withKeyboardFocus } from 'react-native-external-keyboard';
diff --git a/app/containers/message/Touchable.tsx b/app/containers/message/Touchable.tsx
index ad53493b8be..79d5590919f 100644
--- a/app/containers/message/Touchable.tsx
+++ b/app/containers/message/Touchable.tsx
@@ -1,5 +1,5 @@
import { useContext, memo, type ReactNode, type FC } from 'react';
-import { Pressable, type PressableProps } from 'react-native';
+import { Pressable, type PressableProps } from 'react-native-gesture-handler';
import MessageContext from './Context';
From 946e0864b6b768fdf1f44bf11167807ed989724d Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 03:50:35 +0530
Subject: [PATCH 02/44] temp solution
---
.../markdown/components/inline/Link.tsx | 15 ++++++++++++++-
app/containers/message/index.tsx | 6 ++++--
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/app/containers/markdown/components/inline/Link.tsx b/app/containers/markdown/components/inline/Link.tsx
index 8bc9ea9d527..6cd6443b374 100644
--- a/app/containers/markdown/components/inline/Link.tsx
+++ b/app/containers/markdown/components/inline/Link.tsx
@@ -12,6 +12,7 @@ import EventEmitter from '../../../../lib/methods/helpers/events';
import { themes } from '../../../../lib/constants/colors';
import MarkdownContext from '../../contexts/MarkdownContext';
import styles from '../../styles';
+import MessageContext from '../../../../containers/message/Context';
interface ILinkProps {
value: LinkProps['value'];
@@ -19,6 +20,7 @@ interface ILinkProps {
const Link = ({ value }: ILinkProps) => {
const { theme } = useTheme();
+ const { linkLongPressed } = useContext(MessageContext);
const { onLinkPress, textStyle } = useContext(MarkdownContext);
const { src, label } = value;
const handlePress = () => {
@@ -39,12 +41,23 @@ const Link = ({ value }: ILinkProps) => {
if (!src.value) {
return;
}
+
+ linkLongPressed.current = true;
+
if (process.env.RUNNING_E2E_TESTS === 'true') {
- Alert.alert('Link Long Pressed', src.value);
+ Alert.alert('Link Long Pressed', src.value, [
+ {
+ text: 'OK',
+ onPress: () => {
+ linkLongPressed.current = false;
+ }
+ }
+ ]);
return;
}
Clipboard.setString(src.value);
EventEmitter.emit(LISTENER, { message: I18n.t('Copied_to_clipboard') });
+ linkLongPressed.current = false;
};
return (
diff --git a/app/containers/message/index.tsx b/app/containers/message/index.tsx
index df0e3ee8a57..851db37ff38 100644
--- a/app/containers/message/index.tsx
+++ b/app/containers/message/index.tsx
@@ -81,6 +81,7 @@ class MessageContainer extends Component {
const { archived, onLongPress, item } = this.props;
- if (this.isInfo || this.hasError || this.isEncrypted || archived) {
+ if (this.isInfo || this.hasError || this.isEncrypted || archived || this.linkLongPressed.current) {
return;
}
if (onLongPress) {
@@ -450,7 +451,8 @@ class MessageContainer extends Component
{/* @ts-ignore*/}
Date: Wed, 8 Jul 2026 03:58:44 +0530
Subject: [PATCH 03/44] moving to RN Touchable
---
app/containers/Touch.tsx | 63 +++++-----
.../markdown/components/inline/Link.tsx | 15 +--
app/containers/message/Message.tsx | 2 +-
app/containers/message/Touch.tsx | 112 ------------------
app/containers/message/Touchable.tsx | 2 +-
app/containers/message/index.tsx | 6 +-
6 files changed, 41 insertions(+), 159 deletions(-)
delete mode 100644 app/containers/message/Touch.tsx
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index ce3e0e16a29..1f51bb796cb 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -1,18 +1,21 @@
-import { forwardRef, type ReactNode } from 'react';
-import { RectButton, type RectButtonProps } from 'react-native-gesture-handler';
+import { forwardRef, type ReactNode, type RefObject } from 'react';
import {
View,
StyleSheet,
type ViewStyle,
type StyleProp,
type AccessibilityActionEvent,
- type AccessibilityActionInfo
+ type AccessibilityActionInfo,
+ TouchableOpacity,
+ TouchableHighlight,
+ type TouchableWithoutFeedbackProps
} from 'react-native';
import { withKeyboardFocus } from 'react-native-external-keyboard';
import { useTheme } from '../theme';
+import { isIOS } from '../lib/methods/helpers';
-export interface ITouchProps extends RectButtonProps {
+export interface ITouchProps extends TouchableWithoutFeedbackProps {
children: ReactNode;
accessible?: boolean;
accessibilityLabel?: string;
@@ -21,17 +24,20 @@ export interface ITouchProps extends RectButtonProps {
onAccessibilityAction?: (event: AccessibilityActionEvent) => void;
testID?: string;
rectButtonStyle?: StyleProp;
- disabled?: boolean;
+ enabled?: boolean;
+ android_rippleColor?: string;
+ componentRef?: RefObject;
}
-const KeyboardRectButton = withKeyboardFocus(RectButton);
+const Component = isIOS ? TouchableOpacity : TouchableHighlight;
+const KeyboardComponent = withKeyboardFocus(Component);
-const Touch = forwardRef(
+const Touch = forwardRef(
(
{
children,
onPress,
- underlayColor,
+ android_rippleColor,
accessible,
accessibilityLabel,
accessibilityHint,
@@ -39,7 +45,8 @@ const Touch = forwardRef(
onAccessibilityAction,
style,
rectButtonStyle,
- disabled,
+ enabled = true,
+ componentRef,
...props
},
ref
@@ -75,29 +82,31 @@ const Touch = forwardRef(
marginStart,
marginTop
};
+ const touchableProps = isIOS ? {} : { underlayColor: android_rippleColor ?? colors.surfaceNeutral, activeOpacity: 1 };
+
return (
- , but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
+ componentRef={componentRef as RefObject}
onPress={onPress}
- activeOpacity={1}
- underlayColor={underlayColor || colors.surfaceNeutral}
- rippleColor={colors.surfaceNeutral}
- focusable={!disabled}
- canBeFocused={!disabled}
+ accessible={accessible}
+ accessibilityRole={props.accessibilityRole}
+ accessibilityLabel={accessibilityLabel}
+ accessibilityHint={accessibilityHint}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}
style={[rectButtonStyle, marginStyles, { backgroundColor, borderRadius }]}
+ {...touchableProps}
{...props}
- enabled={!disabled}>
-
- {children}
-
-
+ disabled={!enabled}
+ focusable={enabled}
+ canBeFocused={enabled}>
+ {/* The accessibility props live on the focusable Touchable above. The inner View is a
+ layout-only container; marking it accessible would create a second sibling node with
+ the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
+ {children}
+
);
}
);
diff --git a/app/containers/markdown/components/inline/Link.tsx b/app/containers/markdown/components/inline/Link.tsx
index 6cd6443b374..8bc9ea9d527 100644
--- a/app/containers/markdown/components/inline/Link.tsx
+++ b/app/containers/markdown/components/inline/Link.tsx
@@ -12,7 +12,6 @@ import EventEmitter from '../../../../lib/methods/helpers/events';
import { themes } from '../../../../lib/constants/colors';
import MarkdownContext from '../../contexts/MarkdownContext';
import styles from '../../styles';
-import MessageContext from '../../../../containers/message/Context';
interface ILinkProps {
value: LinkProps['value'];
@@ -20,7 +19,6 @@ interface ILinkProps {
const Link = ({ value }: ILinkProps) => {
const { theme } = useTheme();
- const { linkLongPressed } = useContext(MessageContext);
const { onLinkPress, textStyle } = useContext(MarkdownContext);
const { src, label } = value;
const handlePress = () => {
@@ -41,23 +39,12 @@ const Link = ({ value }: ILinkProps) => {
if (!src.value) {
return;
}
-
- linkLongPressed.current = true;
-
if (process.env.RUNNING_E2E_TESTS === 'true') {
- Alert.alert('Link Long Pressed', src.value, [
- {
- text: 'OK',
- onPress: () => {
- linkLongPressed.current = false;
- }
- }
- ]);
+ Alert.alert('Link Long Pressed', src.value);
return;
}
Clipboard.setString(src.value);
EventEmitter.emit(LISTENER, { message: I18n.t('Copied_to_clipboard') });
- linkLongPressed.current = false;
};
return (
diff --git a/app/containers/message/Message.tsx b/app/containers/message/Message.tsx
index ec465eec8da..eb52c53c7ac 100644
--- a/app/containers/message/Message.tsx
+++ b/app/containers/message/Message.tsx
@@ -23,7 +23,7 @@ import { WidthAwareView } from './Components/WidthAwareView';
import MessageTime from './Time';
import { useResponsiveLayout } from '../../lib/hooks/useResponsiveLayout/useResponsiveLayout';
import Quote from './Components/Attachments/Quote';
-import Touch from './Touch';
+import Touch from '../Touch';
import { useLastFocusedMessageRef } from '../../lib/a11y/useLastFocusedMessageRef';
import { useMessageAccessibilityLabel } from './hooks/useMessageAccessibilityLabel';
import { useMessageAccessibilityActions } from './hooks/useMessageAccessibilityActions';
diff --git a/app/containers/message/Touch.tsx b/app/containers/message/Touch.tsx
deleted file mode 100644
index 99816529bc5..00000000000
--- a/app/containers/message/Touch.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-import { forwardRef, type ReactNode, type RefObject } from 'react';
-import { TouchableOpacity, TouchableHighlight, type TouchableWithoutFeedbackProps } from 'react-native-gesture-handler';
-import {
- View,
- StyleSheet,
- type ViewStyle,
- type StyleProp,
- type AccessibilityActionEvent,
- type AccessibilityActionInfo
-} from 'react-native';
-import { withKeyboardFocus } from 'react-native-external-keyboard';
-
-import { useTheme } from '../../theme';
-import { isIOS } from '../../lib/methods/helpers';
-
-export interface ITouchProps extends TouchableWithoutFeedbackProps {
- children: ReactNode;
- accessible?: boolean;
- accessibilityLabel?: string;
- accessibilityHint?: string;
- accessibilityActions?: AccessibilityActionInfo[];
- onAccessibilityAction?: (event: AccessibilityActionEvent) => void;
- testID?: string;
- rectButtonStyle?: StyleProp;
- enabled?: boolean;
- android_rippleColor?: string;
- componentRef?: RefObject;
-}
-
-const Component = isIOS ? TouchableOpacity : TouchableHighlight;
-const KeyboardComponent = withKeyboardFocus(Component);
-
-const Touch = forwardRef(
- (
- {
- children,
- onPress,
- android_rippleColor,
- accessible,
- accessibilityLabel,
- accessibilityHint,
- accessibilityActions,
- onAccessibilityAction,
- style,
- rectButtonStyle,
- enabled = true,
- componentRef,
- ...props
- },
- ref
- ) => {
- const { colors } = useTheme();
- // The background color must be applied to the RectButton, not the View.
- // If set on the View, the touch opacity animation won't work properly.
- const flattenedStyle = StyleSheet.flatten(style) || {};
- const {
- borderRadius,
- backgroundColor,
- marginBottom,
- margin,
- marginLeft,
- marginVertical,
- marginHorizontal,
- marginEnd,
- marginRight,
- marginStart,
- marginTop,
- ...viewStyle
- } = flattenedStyle;
- // The margin should be applied to the parent component.
- // If set on the View, it will create an internal margin inside the RectButton.
- const marginStyles = {
- margin,
- marginBottom,
- marginLeft,
- marginVertical,
- marginHorizontal,
- marginEnd,
- marginRight,
- marginStart,
- marginTop
- };
- const touchableProps = isIOS ? {} : { underlayColor: android_rippleColor ?? colors.surfaceNeutral, activeOpacity: 1 };
-
- return (
- , but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
- componentRef={componentRef as RefObject}
- onPress={onPress}
- accessible={accessible}
- accessibilityRole={props.accessibilityRole}
- accessibilityLabel={accessibilityLabel}
- accessibilityHint={accessibilityHint}
- accessibilityActions={accessibilityActions}
- onAccessibilityAction={onAccessibilityAction}
- style={[rectButtonStyle, marginStyles, { backgroundColor, borderRadius }]}
- {...touchableProps}
- {...props}
- disabled={!enabled}
- focusable={enabled}
- canBeFocused={enabled}>
- {/* The accessibility props live on the focusable Touchable above. The inner View is a
- layout-only container; marking it accessible would create a second sibling node with
- the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
- {children}
-
- );
- }
-);
-
-export default Touch;
diff --git a/app/containers/message/Touchable.tsx b/app/containers/message/Touchable.tsx
index 79d5590919f..ad53493b8be 100644
--- a/app/containers/message/Touchable.tsx
+++ b/app/containers/message/Touchable.tsx
@@ -1,5 +1,5 @@
import { useContext, memo, type ReactNode, type FC } from 'react';
-import { Pressable, type PressableProps } from 'react-native-gesture-handler';
+import { Pressable, type PressableProps } from 'react-native';
import MessageContext from './Context';
diff --git a/app/containers/message/index.tsx b/app/containers/message/index.tsx
index 851db37ff38..df0e3ee8a57 100644
--- a/app/containers/message/index.tsx
+++ b/app/containers/message/index.tsx
@@ -81,7 +81,6 @@ class MessageContainer extends Component {
const { archived, onLongPress, item } = this.props;
- if (this.isInfo || this.hasError || this.isEncrypted || archived || this.linkLongPressed.current) {
+ if (this.isInfo || this.hasError || this.isEncrypted || archived) {
return;
}
if (onLongPress) {
@@ -451,8 +450,7 @@ class MessageContainer extends Component
{/* @ts-ignore*/}
Date: Wed, 8 Jul 2026 03:58:48 +0530
Subject: [PATCH 04/44] test fix
---
.maestro/tests/room/message-markdown-click.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index a2e490482bf..8e3f39a30cb 100644
--- a/.maestro/tests/room/message-markdown-click.yaml
+++ b/.maestro/tests/room/message-markdown-click.yaml
@@ -283,5 +283,5 @@ tags:
- tapOn: 'Ephemeral Button'
- extendedWaitUntil:
visible:
- text: '.*A very secret message visible after clicking Ephemeral Button"*.'
+ text: '.*A very secret message visible after clicking Ephemeral Button*.'
timeout: 10000
From 2334cbdb0d59df68b5fa463c65909a384e36158b Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 04:08:02 +0530
Subject: [PATCH 05/44] add hidekeyboard
---
.maestro/tests/room/message-markdown-click.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index 8e3f39a30cb..5702bc7a576 100644
--- a/.maestro/tests/room/message-markdown-click.yaml
+++ b/.maestro/tests/room/message-markdown-click.yaml
@@ -280,6 +280,7 @@ tags:
id: autocomplete-item-send-emphemeral-button
- tapOn:
id: 'message-composer-send'
+- hideKeyboard
- tapOn: 'Ephemeral Button'
- extendedWaitUntil:
visible:
From 73e8bccc6a4a4ac8f293ebbc817ab1ce09d9a64f Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 04:15:27 +0530
Subject: [PATCH 06/44] lint fix
---
app/containers/Passcode/Base/Button.tsx | 2 +-
app/containers/Touch.tsx | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/app/containers/Passcode/Base/Button.tsx b/app/containers/Passcode/Base/Button.tsx
index 2e04c57def9..180da7457bf 100644
--- a/app/containers/Passcode/Base/Button.tsx
+++ b/app/containers/Passcode/Base/Button.tsx
@@ -25,7 +25,7 @@ const Button = memo(({ style, text, disabled, onPress, icon, testID }: IPasscode
testID={testID}
style={[styles.buttonView, { backgroundColor: 'transparent' }, style]}
underlayColor={colors.buttonBackgroundSecondaryDefault}
- rippleColor={colors.buttonBackgroundSecondaryPress}
+ android_rippleColor={colors.buttonBackgroundSecondaryPress}
enabled={!disabled}
onPress={press}>
{icon ? (
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index 1f51bb796cb..a4e69a82d1d 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -8,14 +8,15 @@ import {
type AccessibilityActionInfo,
TouchableOpacity,
TouchableHighlight,
- type TouchableWithoutFeedbackProps
+ type TouchableHighlightProps,
+ type TouchableOpacityProps
} from 'react-native';
import { withKeyboardFocus } from 'react-native-external-keyboard';
import { useTheme } from '../theme';
import { isIOS } from '../lib/methods/helpers';
-export interface ITouchProps extends TouchableWithoutFeedbackProps {
+export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightProps {
children: ReactNode;
accessible?: boolean;
accessibilityLabel?: string;
From 6bc22e03326162a5bcce5312fa50033ef352c748 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 04:17:47 +0530
Subject: [PATCH 07/44] temporary let me build android apk to test
---
.github/workflows/build-pr.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml
index 4bb3a94572f..65327eb0534 100644
--- a/.github/workflows/build-pr.yml
+++ b/.github/workflows/build-pr.yml
@@ -46,7 +46,7 @@ jobs:
name: Build Android
if: ${{ github.repository == 'RocketChat/Rocket.Chat.ReactNative' }}
uses: ./.github/workflows/build-android.yml
- needs: [run-eslint-and-test, generate-pr-changelog]
+ needs: [e2e-build-android, generate-pr-changelog]
secrets: inherit
with:
trigger: "pr"
From a04b802ba28777fe987771cc7201da55c9785407 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 04:21:40 +0530
Subject: [PATCH 08/44] using correct gate this time
---
.github/workflows/build-pr.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml
index 65327eb0534..f1e11f82bb7 100644
--- a/.github/workflows/build-pr.yml
+++ b/.github/workflows/build-pr.yml
@@ -46,7 +46,7 @@ jobs:
name: Build Android
if: ${{ github.repository == 'RocketChat/Rocket.Chat.ReactNative' }}
uses: ./.github/workflows/build-android.yml
- needs: [e2e-build-android, generate-pr-changelog]
+ needs: [e2e-hold]
secrets: inherit
with:
trigger: "pr"
From 5ecd71cd360839a5afba50f8b53e19ec9e1e05ee Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Wed, 8 Jul 2026 21:35:06 +0530
Subject: [PATCH 09/44] small test for 2FA Modal
---
.../onboarding/login/two-factor-login.yaml | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 .maestro/tests/onboarding/login/two-factor-login.yaml
diff --git a/.maestro/tests/onboarding/login/two-factor-login.yaml b/.maestro/tests/onboarding/login/two-factor-login.yaml
new file mode 100644
index 00000000000..47f3f527669
--- /dev/null
+++ b/.maestro/tests/onboarding/login/two-factor-login.yaml
@@ -0,0 +1,46 @@
+appId: ${APP_ID}
+name: Two Factor Modal Test
+onFlowStart:
+ - runFlow: ../../../helpers/setup.yaml
+tags:
+ - test-2
+
+---
+- runFlow: ../../../helpers/launch-app.yaml
+- runFlow: ../../../helpers/navigate-to-login.yaml
+- tapOn:
+ id: 'login-view-email'
+- inputText: 'mobile+e2e_2fa_modal_test@rocket.chat'
+- pressKey: enter
+- tapOn:
+ id: 'login-view-password'
+- inputText: 'e2e_2fa_modal_test'
+- runFlow: '../../../helpers/hide-keyboard.yaml'
+- tapOn:
+ id: login-view-submit
+
+# Verify that 2FA modal is visible
+- extendedWaitUntil:
+ visible: '.*Open your authentication app and enter the code.*'
+ timeout: 5000
+- assertVisible: "Cancel"
+- assertVisible: "Verify"
+
+# Click verify button with wrong TOTP to make sure it's clickable and working
+- tapOn:
+ id: 'two-factor-input'
+- inputText: '000000'
+- tapOn: "Verify"
+- extendedWaitUntil:
+ visible: '.*Invalid code.*'
+ timeout: 5000
+
+# Click cancel button and it should hide 2FA modal
+- tapOn: 'Cancel'
+- extendedWaitUntil:
+ visible: '.*Your credentials were rejected! Please try again.*'
+ timeout: 5000
+- tapOn: 'OK'
+- extendedWaitUntil:
+ notVisible: '.*Your credentials were rejected! Please try again.*'
+ timeout: 5000
\ No newline at end of file
From c66940f9cf9e8d49a6155a05383c0f7a15425313 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Thu, 30 Jul 2026 22:35:18 +0530
Subject: [PATCH 10/44] restore touch file
---
.../message/components/Touchable/Touch.tsx | 116 ++++++++++++++++++
1 file changed, 116 insertions(+)
create mode 100644 app/containers/message/components/Touchable/Touch.tsx
diff --git a/app/containers/message/components/Touchable/Touch.tsx b/app/containers/message/components/Touchable/Touch.tsx
new file mode 100644
index 00000000000..e405384a8f0
--- /dev/null
+++ b/app/containers/message/components/Touchable/Touch.tsx
@@ -0,0 +1,116 @@
+import { forwardRef, type ReactNode, type RefObject } from 'react';
+import {
+ View,
+ StyleSheet,
+ type ViewStyle,
+ type StyleProp,
+ type AccessibilityActionEvent,
+ type AccessibilityActionInfo,
+ TouchableOpacity,
+ TouchableHighlight,
+ type TouchableWithoutFeedbackProps
+} from 'react-native';
+import { withKeyboardFocus } from 'react-native-external-keyboard';
+
+import { useTheme } from '../../../../theme';
+import { isIOS } from '../../../../lib/methods/helpers';
+
+export interface ITouchProps extends TouchableWithoutFeedbackProps {
+ children: ReactNode;
+ accessible?: boolean;
+ accessibilityLabel?: string;
+ accessibilityHint?: string;
+ accessibilityActions?: AccessibilityActionInfo[];
+ onAccessibilityAction?: (event: AccessibilityActionEvent) => void;
+ testID?: string;
+ rectButtonStyle?: StyleProp;
+ enabled?: boolean;
+ android_rippleColor?: string;
+ componentRef?: RefObject;
+}
+
+const Component = isIOS ? TouchableOpacity : TouchableHighlight;
+const KeyboardComponent = withKeyboardFocus(Component);
+
+const Touch = forwardRef(
+ (
+ {
+ children,
+ onPress,
+ android_rippleColor,
+ accessible,
+ accessibilityLabel,
+ accessibilityHint,
+ accessibilityActions,
+ onAccessibilityAction,
+ style,
+ rectButtonStyle,
+ enabled = true,
+ componentRef,
+ ...props
+ },
+ ref
+ ) => {
+ 'use memo';
+
+ const { colors } = useTheme();
+ // The background color must be applied to the RectButton, not the View.
+ // If set on the View, the touch opacity animation won't work properly.
+ const flattenedStyle = StyleSheet.flatten(style) || {};
+ const {
+ borderRadius,
+ backgroundColor,
+ marginBottom,
+ margin,
+ marginLeft,
+ marginVertical,
+ marginHorizontal,
+ marginEnd,
+ marginRight,
+ marginStart,
+ marginTop,
+ ...viewStyle
+ } = flattenedStyle;
+ // The margin should be applied to the parent component.
+ // If set on the View, it will create an internal margin inside the RectButton.
+ const marginStyles = {
+ margin,
+ marginBottom,
+ marginLeft,
+ marginVertical,
+ marginHorizontal,
+ marginEnd,
+ marginRight,
+ marginStart,
+ marginTop
+ };
+ const touchableProps = isIOS ? {} : { underlayColor: android_rippleColor ?? colors.surfaceNeutral, activeOpacity: 1 };
+
+ return (
+ , but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
+ componentRef={componentRef as RefObject}
+ onPress={onPress}
+ accessible={accessible}
+ accessibilityRole={props.accessibilityRole}
+ accessibilityLabel={accessibilityLabel}
+ accessibilityHint={accessibilityHint}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}
+ style={[rectButtonStyle, marginStyles, { backgroundColor, borderRadius }]}
+ {...touchableProps}
+ {...props}
+ disabled={!enabled}
+ focusable={enabled}
+ canBeFocused={enabled}>
+ {/* The accessibility props live on the focusable Touchable above. The inner View is a
+ layout-only container; marking it accessible would create a second sibling node with
+ the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
+ {children}
+
+ );
+ }
+);
+
+export default Touch;
From 8c09e6d2e7e7bca5ca84ba41eb9ec6ff7961ad3c Mon Sep 17 00:00:00 2001
From: Rohit3523
Date: Thu, 30 Jul 2026 17:08:42 +0000
Subject: [PATCH 11/44] chore: format code and fix lint issues
---
.maestro/tests/onboarding/login/two-factor-login.yaml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/.maestro/tests/onboarding/login/two-factor-login.yaml b/.maestro/tests/onboarding/login/two-factor-login.yaml
index 47f3f527669..9105f09ac73 100644
--- a/.maestro/tests/onboarding/login/two-factor-login.yaml
+++ b/.maestro/tests/onboarding/login/two-factor-login.yaml
@@ -23,14 +23,14 @@ tags:
- extendedWaitUntil:
visible: '.*Open your authentication app and enter the code.*'
timeout: 5000
-- assertVisible: "Cancel"
-- assertVisible: "Verify"
+- assertVisible: 'Cancel'
+- assertVisible: 'Verify'
# Click verify button with wrong TOTP to make sure it's clickable and working
- tapOn:
id: 'two-factor-input'
- inputText: '000000'
-- tapOn: "Verify"
+- tapOn: 'Verify'
- extendedWaitUntil:
visible: '.*Invalid code.*'
timeout: 5000
@@ -43,4 +43,4 @@ tags:
- tapOn: 'OK'
- extendedWaitUntil:
notVisible: '.*Your credentials were rejected! Please try again.*'
- timeout: 5000
\ No newline at end of file
+ timeout: 5000
From 24bc31fb04c82a2938111969c44ecc6c2cc12dc0 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Thu, 30 Jul 2026 23:50:29 +0530
Subject: [PATCH 12/44] Import fix and remove one touch
---
.../components/Touchable/MessageTouchable.tsx | 2 +-
.../message/components/Touchable/Touch.tsx | 116 ------------------
2 files changed, 1 insertion(+), 117 deletions(-)
delete mode 100644 app/containers/message/components/Touchable/Touch.tsx
diff --git a/app/containers/message/components/Touchable/MessageTouchable.tsx b/app/containers/message/components/Touchable/MessageTouchable.tsx
index e4e39c43855..16782e60423 100644
--- a/app/containers/message/components/Touchable/MessageTouchable.tsx
+++ b/app/containers/message/components/Touchable/MessageTouchable.tsx
@@ -1,7 +1,7 @@
import { A11y } from 'react-native-a11y-order';
import { useTheme } from '../../../../theme';
-import Touch from './Touch';
+import Touch from '../../../Touch';
import Message, { type TMessageProps } from '../Message/Message';
import { useLastFocusedMessageRef } from '../../../../lib/a11y/useLastFocusedMessageRef';
import { useMessageAccessibilityLabel } from '../../hooks/useMessageAccessibilityLabel';
diff --git a/app/containers/message/components/Touchable/Touch.tsx b/app/containers/message/components/Touchable/Touch.tsx
deleted file mode 100644
index e405384a8f0..00000000000
--- a/app/containers/message/components/Touchable/Touch.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { forwardRef, type ReactNode, type RefObject } from 'react';
-import {
- View,
- StyleSheet,
- type ViewStyle,
- type StyleProp,
- type AccessibilityActionEvent,
- type AccessibilityActionInfo,
- TouchableOpacity,
- TouchableHighlight,
- type TouchableWithoutFeedbackProps
-} from 'react-native';
-import { withKeyboardFocus } from 'react-native-external-keyboard';
-
-import { useTheme } from '../../../../theme';
-import { isIOS } from '../../../../lib/methods/helpers';
-
-export interface ITouchProps extends TouchableWithoutFeedbackProps {
- children: ReactNode;
- accessible?: boolean;
- accessibilityLabel?: string;
- accessibilityHint?: string;
- accessibilityActions?: AccessibilityActionInfo[];
- onAccessibilityAction?: (event: AccessibilityActionEvent) => void;
- testID?: string;
- rectButtonStyle?: StyleProp;
- enabled?: boolean;
- android_rippleColor?: string;
- componentRef?: RefObject;
-}
-
-const Component = isIOS ? TouchableOpacity : TouchableHighlight;
-const KeyboardComponent = withKeyboardFocus(Component);
-
-const Touch = forwardRef(
- (
- {
- children,
- onPress,
- android_rippleColor,
- accessible,
- accessibilityLabel,
- accessibilityHint,
- accessibilityActions,
- onAccessibilityAction,
- style,
- rectButtonStyle,
- enabled = true,
- componentRef,
- ...props
- },
- ref
- ) => {
- 'use memo';
-
- const { colors } = useTheme();
- // The background color must be applied to the RectButton, not the View.
- // If set on the View, the touch opacity animation won't work properly.
- const flattenedStyle = StyleSheet.flatten(style) || {};
- const {
- borderRadius,
- backgroundColor,
- marginBottom,
- margin,
- marginLeft,
- marginVertical,
- marginHorizontal,
- marginEnd,
- marginRight,
- marginStart,
- marginTop,
- ...viewStyle
- } = flattenedStyle;
- // The margin should be applied to the parent component.
- // If set on the View, it will create an internal margin inside the RectButton.
- const marginStyles = {
- margin,
- marginBottom,
- marginLeft,
- marginVertical,
- marginHorizontal,
- marginEnd,
- marginRight,
- marginStart,
- marginTop
- };
- const touchableProps = isIOS ? {} : { underlayColor: android_rippleColor ?? colors.surfaceNeutral, activeOpacity: 1 };
-
- return (
- , but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
- componentRef={componentRef as RefObject}
- onPress={onPress}
- accessible={accessible}
- accessibilityRole={props.accessibilityRole}
- accessibilityLabel={accessibilityLabel}
- accessibilityHint={accessibilityHint}
- accessibilityActions={accessibilityActions}
- onAccessibilityAction={onAccessibilityAction}
- style={[rectButtonStyle, marginStyles, { backgroundColor, borderRadius }]}
- {...touchableProps}
- {...props}
- disabled={!enabled}
- focusable={enabled}
- canBeFocused={enabled}>
- {/* The accessibility props live on the focusable Touchable above. The inner View is a
- layout-only container; marking it accessible would create a second sibling node with
- the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
- {children}
-
- );
- }
-);
-
-export default Touch;
From 3998556326b29da7ff426e09837930883ec3bdc0 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 3 Aug 2026 22:53:33 +0530
Subject: [PATCH 13/44] trying pressable from RNGH on android
---
.../Avatar/__snapshots__/Avatar.test.tsx.snap | 164 +-
.../Chip/__snapshots__/Chip.test.tsx.snap | 12 +-
.../__snapshots__/DirectoryItem.test.tsx.snap | 744 +-
.../NotifierComponent.test.tsx.snap | 760 +-
.../List/__snapshots__/List.test.tsx.snap | 2250 +-
.../__snapshots__/LoginServices.test.tsx.snap | 1048 +-
.../Base/__snapshots__/Base.test.tsx.snap | 6338 ++--
.../__snapshots__/RoomItem.test.tsx.snap | 5264 ++-
.../__snapshots__/ServerItem.test.tsx.snap | 818 +-
.../__snapshots__/TextInput.test.tsx.snap | 192 +-
app/containers/Touch.tsx | 15 +-
.../__snapshots__/UiKitMessage.test.tsx.snap | 93 +-
.../__snapshots__/UiKitModal.test.tsx.snap | 744 +-
.../message/__tests__/index.test.tsx | 2 +-
app/containers/message/components/User.tsx | 6 +-
.../__snapshots__/Message.test.tsx.snap | 30820 +++++++---------
.../__snapshots__/leaves.test.tsx.snap | 193 +-
.../CannedResponseItem.test.tsx.snap | 186 +-
.../__snapshots__/Item.test.tsx.snap | 744 +-
.../ServersHistoryItem.test.tsx.snap | 896 +-
.../__snapshots__/CallSection.test.tsx.snap | 281 +-
.../RoomInfoViewAvatar.test.tsx.snap | 8 +-
.../__snapshots__/LoadMore.test.tsx.snap | 2075 +-
.../__snapshots__/Item.test.tsx.snap | 2280 +-
.../ChangePasscodeView.test.tsx.snap | 2139 +-
.../ScreenLockedView.test.tsx.snap | 4472 +--
26 files changed, 28155 insertions(+), 34389 deletions(-)
diff --git a/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap b/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
index 81ef3deecc6..a6a7abb0596 100644
--- a/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
+++ b/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
@@ -37,7 +37,9 @@ exports[`Story Snapshots: AvatarBase64 should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "data:image/png;base64,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",
},
]
@@ -92,7 +94,9 @@ exports[`Story Snapshots: AvatarExternalProviderUrl should match snapshot 1`] =
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://hips.hearstapps.com/hmg-prod/images/dog-puppy-on-garden-royalty-free-image-1586966191.jpg?crop=0.752xw:1.00xh;0.175xw,0&resize=1200:*&format=png&size=112",
},
]
@@ -147,7 +151,9 @@ exports[`Story Snapshots: AvatarPath should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/diego.mello?format=png&size=112",
},
]
@@ -202,7 +208,9 @@ exports[`Story Snapshots: AvatarRoomId should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/room/devWBbYr7inwupPqK?format=png&size=112",
},
]
@@ -257,7 +265,9 @@ exports[`Story Snapshots: AvatarText should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/Avatar?format=png&size=112",
},
]
@@ -312,7 +322,9 @@ exports[`Story Snapshots: AvatarUrl should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://user-images.githubusercontent.com/29778115/89444446-14738480-d728-11ea-9412-75fd978d95fb.jpg",
},
]
@@ -367,7 +379,9 @@ exports[`Story Snapshots: Channel should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/@general?format=png&size=112",
},
]
@@ -422,7 +436,9 @@ exports[`Story Snapshots: Children should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/Avatar?format=png&size=112",
},
]
@@ -516,7 +532,9 @@ exports[`Story Snapshots: CustomBorderRadius should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/Avatar?format=png&size=112",
},
]
@@ -573,7 +591,9 @@ exports[`Story Snapshots: CustomStyle should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/Avatar?format=png&size=112",
},
]
@@ -628,7 +648,9 @@ exports[`Story Snapshots: Direct should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/diego.mello?format=png&size=112",
},
]
@@ -748,7 +770,9 @@ exports[`Story Snapshots: RoomAvatarExternalProviderUrl should match snapshot 1`
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://cdn.pensador.com/img/authors/ho/me/homer-simpson-l.jpg?format=png&size=112",
},
]
@@ -803,7 +827,9 @@ exports[`Story Snapshots: Static should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://user-images.githubusercontent.com/29778115/89444446-14738480-d728-11ea-9412-75fd978d95fb.jpg",
},
]
@@ -858,63 +884,53 @@ exports[`Story Snapshots: Touchable should match snapshot 1`] = `
]
}
>
-
-
-
+
`;
@@ -996,7 +1014,9 @@ exports[`Story Snapshots: WithETag should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/djorkaeff.alexandre?format=png&size=112&etag=5ag8KffJcZj9m5rCv",
},
]
@@ -1051,7 +1071,9 @@ exports[`Story Snapshots: WithoutETag should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/djorkaeff.alexandre?format=png&size=112",
},
]
@@ -1106,7 +1128,9 @@ exports[`Story Snapshots: WrongServer should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://google.com/avatar/Avatar?format=png&size=112",
},
]
diff --git a/app/containers/Chip/__snapshots__/Chip.test.tsx.snap b/app/containers/Chip/__snapshots__/Chip.test.tsx.snap
index 113a0ba0758..9073ab74019 100644
--- a/app/containers/Chip/__snapshots__/Chip.test.tsx.snap
+++ b/app/containers/Chip/__snapshots__/Chip.test.tsx.snap
@@ -208,7 +208,9 @@ exports[`Story Snapshots: ChipText should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/rocket.cat?format=png&size=56",
},
]
@@ -391,7 +393,9 @@ exports[`Story Snapshots: ChipWithShortText should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/rocket.cat?format=png&size=56",
},
]
@@ -804,7 +808,9 @@ exports[`Story Snapshots: ChipWithoutIcon should match snapshot 1`] = `
source={
[
{
- "headers": undefined,
+ "headers": {
+ "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)",
+ },
"uri": "https://open.rocket.chat/avatar/rocket.cat?format=png&size=56",
},
]
diff --git a/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap b/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
index 376f230643c..38ff2fa8386 100644
--- a/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
+++ b/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
@@ -37,61 +37,52 @@ exports[`Story Snapshots: CustomStyle should match snapshot 1`] = `
]
}
>
-
-
@@ -275,7 +266,7 @@ exports[`Story Snapshots: CustomStyle should match snapshot 1`] = `
-
+
@@ -319,61 +310,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
@@ -555,7 +537,7 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
-
+
@@ -599,61 +581,52 @@ exports[`Story Snapshots: DirectMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -804,7 +777,7 @@ exports[`Story Snapshots: DirectMessage should match snapshot 1`] = `
-
+
@@ -848,61 +821,52 @@ exports[`Story Snapshots: LongRoomName should match snapshot 1`] = `
]
}
>
-
-
@@ -1103,7 +1067,7 @@ exports[`Story Snapshots: LongRoomName should match snapshot 1`] = `
-
+
@@ -1147,61 +1111,52 @@ exports[`Story Snapshots: OnlyTitle should match snapshot 1`] = `
]
}
>
-
-
@@ -1294,7 +1249,7 @@ exports[`Story Snapshots: OnlyTitle should match snapshot 1`] = `
-
+
@@ -1338,61 +1293,52 @@ exports[`Story Snapshots: TeamMain should match snapshot 1`] = `
]
}
>
-
-
@@ -1574,7 +1520,7 @@ exports[`Story Snapshots: TeamMain should match snapshot 1`] = `
-
+
@@ -1618,61 +1564,52 @@ exports[`Story Snapshots: WithRightLabel should match snapshot 1`] = `
]
}
>
-
-
@@ -1873,7 +1810,7 @@ exports[`Story Snapshots: WithRightLabel should match snapshot 1`] = `
-
+
@@ -1917,61 +1854,52 @@ exports[`Story Snapshots: WithoutDescription should match snapshot 1`] = `
]
}
>
-
-
@@ -2120,7 +2048,7 @@ exports[`Story Snapshots: WithoutDescription should match snapshot 1`] = `
-
+
diff --git a/app/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snap b/app/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snap
index 299c643eae3..21c44b75391 100644
--- a/app/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snap
+++ b/app/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snap
@@ -46,13 +46,27 @@ exports[`Story Snapshots: ChannelMessage should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
@@ -341,7 +323,7 @@ exports[`Story Snapshots: ChannelMessage should match snapshot 1`] = `
-
+
`;
@@ -392,13 +374,27 @@ exports[`Story Snapshots: DirectMessage should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
@@ -687,7 +651,7 @@ exports[`Story Snapshots: DirectMessage should match snapshot 1`] = `
-
+
`;
@@ -738,13 +702,27 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
@@ -1033,7 +979,7 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
-
+
`;
@@ -1084,13 +1030,27 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
@@ -1379,7 +1307,7 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
-
+
`;
diff --git a/app/containers/List/__snapshots__/List.test.tsx.snap b/app/containers/List/__snapshots__/List.test.tsx.snap
index 02ca3132ced..5b76fca1582 100644
--- a/app/containers/List/__snapshots__/List.test.tsx.snap
+++ b/app/containers/List/__snapshots__/List.test.tsx.snap
@@ -735,60 +735,51 @@ exports[`Story Snapshots: ListItemWithRightContainerStyle should match snapshot
]
}
>
-
-
@@ -969,7 +960,7 @@ exports[`Story Snapshots: ListItemWithRightContainerStyle should match snapshot
-
+
`;
@@ -1029,60 +1020,51 @@ exports[`Story Snapshots: Pressable should match snapshot 1`] = `
]
}
>
-
-
@@ -1146,7 +1128,7 @@ exports[`Story Snapshots: Pressable should match snapshot 1`] = `
-
+
-
-
@@ -1302,7 +1275,7 @@ exports[`Story Snapshots: Pressable should match snapshot 1`] = `
-
+
-
-
@@ -1543,7 +1507,7 @@ exports[`Story Snapshots: Radio should match snapshot 1`] = `
-
+
-
-
@@ -1746,7 +1701,7 @@ exports[`Story Snapshots: Radio should match snapshot 1`] = `
-
+
-
-
@@ -1949,7 +1895,7 @@ exports[`Story Snapshots: Radio should match snapshot 1`] = `
-
+
-
-
@@ -2171,7 +2108,7 @@ exports[`Story Snapshots: Radio should match snapshot 1`] = `
-
+
-
-
@@ -3871,7 +3799,7 @@ exports[`Story Snapshots: WithBiggerFont should match snapshot 1`] = `
-
+
-
-
@@ -4141,7 +4060,7 @@ exports[`Story Snapshots: WithBiggerFont should match snapshot 1`] = `
-
+
-
-
@@ -4486,7 +4396,7 @@ exports[`Story Snapshots: WithBiggerFont should match snapshot 1`] = `
-
+
-
-
@@ -4756,7 +4657,7 @@ exports[`Story Snapshots: WithBiggerFont should match snapshot 1`] = `
-
+
-
-
@@ -5148,7 +5040,7 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
-
+
-
-
@@ -5418,7 +5301,7 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
-
+
-
-
@@ -5763,7 +5637,7 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
-
+
-
-
@@ -6033,7 +5898,7 @@ exports[`Story Snapshots: WithBlackTheme should match snapshot 1`] = `
-
+
-
-
@@ -6335,7 +6191,7 @@ exports[`Story Snapshots: WithCustomColors should match snapshot 1`] = `
-
+
-
-
@@ -6697,7 +6544,7 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
-
+
-
-
@@ -6967,7 +6805,7 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
-
+
-
-
@@ -7312,7 +7141,7 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
-
+
-
-
@@ -7582,7 +7402,7 @@ exports[`Story Snapshots: WithDarkTheme should match snapshot 1`] = `
-
+
-
-
@@ -9597,7 +9408,7 @@ exports[`Story Snapshots: WithSmallFont should match snapshot 1`] = `
-
+
-
-
@@ -9867,7 +9669,7 @@ exports[`Story Snapshots: WithSmallFont should match snapshot 1`] = `
-
+
-
-
@@ -10212,7 +10005,7 @@ exports[`Story Snapshots: WithSmallFont should match snapshot 1`] = `
-
+
-
-
@@ -10482,7 +10266,7 @@ exports[`Story Snapshots: WithSmallFont should match snapshot 1`] = `
-
+
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
@@ -906,63 +876,53 @@ exports[`Story Snapshots: ServiceListUncollapsed should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
@@ -1551,62 +1481,52 @@ exports[`Story Snapshots: ServicesList should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
diff --git a/app/containers/Passcode/Base/__snapshots__/Base.test.tsx.snap b/app/containers/Passcode/Base/__snapshots__/Base.test.tsx.snap
index 7eed6d3465f..c463790d038 100644
--- a/app/containers/Passcode/Base/__snapshots__/Base.test.tsx.snap
+++ b/app/containers/Passcode/Base/__snapshots__/Base.test.tsx.snap
@@ -314,61 +314,52 @@ exports[`Story Snapshots: ChooseType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -692,61 +665,52 @@ exports[`Story Snapshots: ChooseType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1070,61 +1016,52 @@ exports[`Story Snapshots: ChooseType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1461,61 +1380,52 @@ exports[`Story Snapshots: ChooseType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -1998,61 +1899,52 @@ exports[`Story Snapshots: ConfirmType should match snapshot 1`] = `
]
}
>
-
-
+ }
+ testID="passcode-button-1"
+ >
-
+
-
-
-
+
-
-
-
+
@@ -2376,61 +2250,52 @@ exports[`Story Snapshots: ConfirmType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -2754,61 +2601,52 @@ exports[`Story Snapshots: ConfirmType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -3145,61 +2965,52 @@ exports[`Story Snapshots: ConfirmType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -3682,61 +3484,52 @@ exports[`Story Snapshots: EnterType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4060,61 +3835,52 @@ exports[`Story Snapshots: EnterType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4438,61 +4186,52 @@ exports[`Story Snapshots: EnterType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4829,61 +4550,52 @@ exports[`Story Snapshots: EnterType should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -5404,61 +5107,52 @@ exports[`Story Snapshots: EnterWithSubtitleAndBiometry should match snapshot 1`]
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -5782,61 +5458,52 @@ exports[`Story Snapshots: EnterWithSubtitleAndBiometry should match snapshot 1`]
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -6160,61 +5809,52 @@ exports[`Story Snapshots: EnterWithSubtitleAndBiometry should match snapshot 1`]
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -6538,61 +6160,52 @@ exports[`Story Snapshots: EnterWithSubtitleAndBiometry should match snapshot 1`]
]
}
>
-
-
-
+
-
-
-
+
-
-
+ >
-
+
@@ -7205,61 +6800,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -7583,61 +7151,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -7961,61 +7502,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -8339,61 +7853,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -9044,61 +8531,52 @@ exports[`Story Snapshots: WithSubtitle should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -9422,61 +8882,52 @@ exports[`Story Snapshots: WithSubtitle should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -9800,61 +9233,52 @@ exports[`Story Snapshots: WithSubtitle should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -10191,61 +9597,52 @@ exports[`Story Snapshots: WithSubtitle should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
diff --git a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap
index fecaa188218..bb7ac65c5ce 100644
--- a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap
+++ b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap
@@ -374,61 +374,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -640,7 +630,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -1016,61 +1006,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -1323,7 +1303,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -1699,61 +1679,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -2006,7 +1976,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -2382,61 +2352,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -2689,7 +2649,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -3065,61 +3025,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -3372,7 +3322,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -3748,61 +3698,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -4055,7 +3995,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -4431,61 +4371,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -4738,7 +4668,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -5114,61 +5044,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -5421,7 +5341,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -5797,61 +5717,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -6104,7 +6014,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -6480,61 +6390,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -6787,7 +6687,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -7163,61 +7063,51 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
]
}
>
-
-
@@ -7470,7 +7360,7 @@ exports[`Story Snapshots: Alerts should match snapshot 1`] = `
-
+
,
@@ -7850,61 +7740,51 @@ exports[`Story Snapshots: Basic should match snapshot 1`] = `
]
}
>
-
-
@@ -8101,7 +7981,7 @@ exports[`Story Snapshots: Basic should match snapshot 1`] = `
-
+
@@ -8481,61 +8361,51 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
]
}
>
-
-
@@ -8788,7 +8658,7 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
-
+
,
@@ -9164,61 +9034,51 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
]
}
>
-
-
@@ -9471,7 +9331,7 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
-
+
,
@@ -9847,61 +9707,51 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
]
}
>
-
-
@@ -10134,7 +9984,7 @@ exports[`Story Snapshots: CondensedRoomItem should match snapshot 1`] = `
-
+
,
@@ -10515,61 +10365,51 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
]
}
>
-
-
@@ -10766,7 +10606,7 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
-
+
,
@@ -11142,61 +10982,51 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
]
}
>
-
-
@@ -11337,7 +11167,7 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
-
+
,
@@ -11713,61 +11543,51 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
]
}
>
-
-
@@ -11944,7 +11764,7 @@ exports[`Story Snapshots: CondensedRoomItemWithoutAvatar should match snapshot 1
-
+
,
@@ -12325,61 +12145,51 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
]
}
>
-
-
@@ -12622,7 +12432,7 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
-
+
,
@@ -12998,61 +12808,51 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
]
}
>
-
-
@@ -13295,7 +13095,7 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
-
+
,
@@ -13671,61 +13471,51 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
]
}
>
-
-
@@ -13927,7 +13717,7 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1`
-
+
,
@@ -14308,61 +14098,51 @@ exports[`Story Snapshots: InvitedRoom should match snapshot 1`] = `
]
}
>
-
-
@@ -14587,7 +14367,7 @@ exports[`Story Snapshots: InvitedRoom should match snapshot 1`] = `
-
+
,
@@ -14963,61 +14743,51 @@ exports[`Story Snapshots: InvitedRoom should match snapshot 1`] = `
]
}
>
-
-
@@ -15242,7 +15012,7 @@ exports[`Story Snapshots: InvitedRoom should match snapshot 1`] = `
-
+
,
@@ -15623,61 +15393,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -15905,7 +15665,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -16281,61 +16041,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -16563,7 +16313,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -16939,61 +16689,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -17221,7 +16961,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -17597,61 +17337,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -17879,7 +17609,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -18255,61 +17985,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -18593,7 +18313,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -18969,61 +18689,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -19307,7 +19017,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -19683,61 +19393,51 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
]
}
>
-
-
@@ -20021,7 +19721,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = `
-
+
,
@@ -20402,61 +20102,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -20653,7 +20343,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -21029,61 +20719,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -21280,7 +20960,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -21656,61 +21336,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -21907,7 +21577,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -22283,61 +21953,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -22534,7 +22194,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -22910,61 +22570,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -23161,7 +22811,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -23537,61 +23187,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -23788,7 +23428,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -24164,61 +23804,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -24415,7 +24045,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -24791,61 +24421,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -25042,7 +24662,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -25418,61 +25038,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -25669,7 +25279,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -26045,61 +25655,51 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
]
}
>
-
-
@@ -26296,7 +25896,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = `
-
+
,
@@ -26677,61 +26277,51 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
]
}
>
-
-
@@ -26964,7 +26554,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
-
+
,
@@ -27340,61 +26930,51 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
]
}
>
-
-
@@ -27659,7 +27239,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
-
+
,
@@ -28035,61 +27615,51 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
]
}
>
-
-
@@ -28322,7 +27892,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
-
+
,
@@ -28698,61 +28268,51 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
]
}
>
-
-
@@ -29017,7 +28577,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = `
-
+
,
@@ -29397,61 +28957,51 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = `
]
}
>
-
-
@@ -29648,7 +29198,7 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = `
-
+
@@ -30028,61 +29578,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -30287,7 +29827,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -30663,61 +30203,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -30914,7 +30444,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -31290,61 +30820,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -31541,7 +31061,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -31917,61 +31437,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -32168,7 +31678,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -32544,61 +32054,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -32795,7 +32295,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -33171,61 +32671,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -33422,7 +32912,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -33798,61 +33288,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -34049,7 +33529,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -34425,61 +33905,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -34676,7 +34146,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -35052,61 +34522,51 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
]
}
>
-
-
@@ -35303,7 +34763,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = `
-
+
,
@@ -35684,61 +35144,51 @@ exports[`Story Snapshots: User should match snapshot 1`] = `
]
}
>
-
-
@@ -35943,7 +35393,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = `
-
+
,
@@ -36319,61 +35769,51 @@ exports[`Story Snapshots: User should match snapshot 1`] = `
]
}
>
-
-
@@ -36578,7 +36018,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = `
-
+
,
diff --git a/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap b/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
index 514704cbb42..5fe6d1628e5 100644
--- a/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
+++ b/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
@@ -24,67 +24,56 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
@@ -844,74 +811,64 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -1206,74 +1163,64 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -1451,67 +1398,56 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
diff --git a/app/containers/TextInput/__snapshots__/TextInput.test.tsx.snap b/app/containers/TextInput/__snapshots__/TextInput.test.tsx.snap
index 28d74179c3d..3742b253546 100644
--- a/app/containers/TextInput/__snapshots__/TextInput.test.tsx.snap
+++ b/app/containers/TextInput/__snapshots__/TextInput.test.tsx.snap
@@ -570,64 +570,54 @@ exports[`Story Snapshots: Icons should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -1244,63 +1234,53 @@ exports[`Story Snapshots: SecureTextEntry should match snapshot 1`] = `
]
}
>
-
-
-
+
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index a4e69a82d1d..5450c92c93a 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -11,10 +11,11 @@ import {
type TouchableHighlightProps,
type TouchableOpacityProps
} from 'react-native';
+import { Pressable as RNNGHPressable } from 'react-native-gesture-handler';
import { withKeyboardFocus } from 'react-native-external-keyboard';
import { useTheme } from '../theme';
-import { isIOS } from '../lib/methods/helpers';
+import { isIOS, isAndroid } from '../lib/methods/helpers';
export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightProps {
children: ReactNode;
@@ -32,6 +33,7 @@ export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightPr
const Component = isIOS ? TouchableOpacity : TouchableHighlight;
const KeyboardComponent = withKeyboardFocus(Component);
+const RNGHKeyboardComponent = withKeyboardFocus(RNNGHPressable) as unknown as typeof KeyboardComponent;
const Touch = forwardRef(
(
@@ -83,10 +85,15 @@ const Touch = forwardRef(
marginStart,
marginTop
};
- const touchableProps = isIOS ? {} : { underlayColor: android_rippleColor ?? colors.surfaceNeutral, activeOpacity: 1 };
+ const rippleColor = android_rippleColor ?? colors.surfaceNeutral;
+ const feedbackProps = isAndroid
+ ? { android_ripple: { color: rippleColor } }
+ : { underlayColor: rippleColor, activeOpacity: 1 };
+ const touchableProps = isIOS ? {} : feedbackProps;
+ const Wrapper = isAndroid ? RNGHKeyboardComponent : KeyboardComponent;
return (
- , but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
componentRef={componentRef as RefObject}
@@ -107,7 +114,7 @@ const Touch = forwardRef(
layout-only container; marking it accessible would create a second sibling node with
the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
{children}
-
+
);
}
);
diff --git a/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap b/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
index 0f6da409f65..4dbe3bd461a 100644
--- a/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
+++ b/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
@@ -5708,13 +5708,27 @@ exports[`Story Snapshots: SectionOverflow should match snapshot 1`] = `
]
}
>
-
-
-
+
`;
diff --git a/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap b/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap
index a098c73ec9f..220f294e775 100644
--- a/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap
+++ b/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap
@@ -2015,13 +2015,27 @@ exports[`Story Snapshots: ModalContextsDividers should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
@@ -2566,60 +2539,51 @@ exports[`Story Snapshots: ModalDatePickerWithError should match snapshot 1`] = `
]
}
>
-
-
@@ -2689,7 +2653,7 @@ exports[`Story Snapshots: ModalDatePickerWithError should match snapshot 1`] = `
-
+
-
-
@@ -3093,7 +3048,7 @@ exports[`Story Snapshots: ModalFormInput should match snapshot 1`] = `
-
+
,
]
@@ -4357,60 +4312,51 @@ exports[`Story Snapshots: ModalMultiSelect should match snapshot 1`] = `
]
}
>
-
-
@@ -4485,7 +4431,7 @@ exports[`Story Snapshots: ModalMultiSelect should match snapshot 1`] = `
-
+
-
-
@@ -4664,61 +4601,52 @@ exports[`Story Snapshots: ModalMultiSelect should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
{
+jest.mock('../../Touch', () => {
const { forwardRef } = require('react');
const { TouchableOpacity } = require('react-native');
return forwardRef(({ children, onPress, onLongPress, ...props }: any, ref: any) => (
diff --git a/app/containers/message/components/User.tsx b/app/containers/message/components/User.tsx
index ad6b214b02a..ad1b967b68e 100644
--- a/app/containers/message/components/User.tsx
+++ b/app/containers/message/components/User.tsx
@@ -1,5 +1,7 @@
-import { Pressable, StyleSheet, Text, View } from 'react-native';
+import { Pressable as RNPressable, StyleSheet, Text, View } from 'react-native';
+import { Pressable as RNGHPressable } from 'react-native-gesture-handler';
+import { isIOS } from '../../../lib/methods/helpers';
import { type MessageTypesValues, SubscriptionType } from '../../../definitions';
import { useTheme } from '../../../theme';
import sharedStyles from '../../../views/Styles';
@@ -40,6 +42,8 @@ const styles = StyleSheet.create({
}
});
+const Pressable = (isIOS ? RNPressable : RNGHPressable) as typeof RNPressable;
+
const User = () => {
'use memo';
diff --git a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
index 4b0bda15861..d2bbe7ef6ac 100644
--- a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
+++ b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
@@ -164,63 +164,53 @@ exports[`Story Snapshots: Archived should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -627,63 +617,53 @@ exports[`Story Snapshots: ArchivedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -1098,63 +1078,53 @@ exports[`Story Snapshots: AttachmentWithTextAndLink should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -1869,63 +1839,53 @@ exports[`Story Snapshots: AttachmentWithTextAndLinkLargeFont should match snapsh
]
}
>
-
-
-
+
@@ -2640,63 +2600,53 @@ exports[`Story Snapshots: Avatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -3098,63 +3048,53 @@ exports[`Story Snapshots: Avatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -3556,63 +3496,53 @@ exports[`Story Snapshots: Avatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -4006,63 +3936,53 @@ exports[`Story Snapshots: Avatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -4472,63 +4392,53 @@ exports[`Story Snapshots: Avatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -4951,63 +4861,53 @@ exports[`Story Snapshots: Basic should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -5409,63 +5309,53 @@ exports[`Story Snapshots: Basic should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -5880,63 +5770,53 @@ exports[`Story Snapshots: BasicLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -6338,63 +6218,53 @@ exports[`Story Snapshots: BasicLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -6809,63 +6679,53 @@ exports[`Story Snapshots: BlockQuote should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -7300,63 +7160,53 @@ Testing block quote"
]
}
>
-
-
-
+
@@ -7850,63 +7700,53 @@ exports[`Story Snapshots: BlockQuoteLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -8341,63 +8181,53 @@ Testing block quote"
]
}
>
-
-
-
+
@@ -8891,63 +8721,53 @@ exports[`Story Snapshots: Broadcast should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -9482,63 +9302,53 @@ exports[`Story Snapshots: BroadcastLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -10073,63 +9883,53 @@ exports[`Story Snapshots: CollapsedAttachments should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -10683,63 +10483,53 @@ exports[`Story Snapshots: CollapsedAttachments should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -11508,63 +11298,53 @@ exports[`Story Snapshots: CollapsedAttachmentsLargeFont should match snapshot 1`
]
}
>
-
-
-
+
@@ -12118,63 +11898,53 @@ exports[`Story Snapshots: CollapsedAttachmentsLargeFont should match snapshot 1`
]
}
>
-
-
-
+
@@ -12943,63 +12713,53 @@ exports[`Story Snapshots: CollapsibleAttachmentWithText should match snapshot 1`
]
}
>
-
-
-
+
@@ -13555,63 +13315,53 @@ exports[`Story Snapshots: CollapsibleAttachmentWithText should match snapshot 1`
]
}
>
-
-
-
+
@@ -14521,63 +14271,53 @@ exports[`Story Snapshots: CollapsibleAttachmentWithTextLargeFont should match sn
]
}
>
-
-
-
+
@@ -15133,63 +14873,53 @@ exports[`Story Snapshots: CollapsibleAttachmentWithTextLargeFont should match sn
]
}
>
-
-
-
+
@@ -16099,63 +15829,53 @@ exports[`Story Snapshots: ColoredAttachments should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -17331,63 +17051,53 @@ exports[`Story Snapshots: ColoredAttachmentsLargeFont should match snapshot 1`]
]
}
>
-
-
-
+
@@ -18563,63 +18273,53 @@ exports[`Story Snapshots: CustomFields should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -19376,63 +19076,53 @@ exports[`Story Snapshots: CustomFields should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -20460,63 +20150,53 @@ exports[`Story Snapshots: CustomFieldsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -21273,63 +20953,53 @@ exports[`Story Snapshots: CustomFieldsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -22357,63 +22027,53 @@ exports[`Story Snapshots: DateAndUnreadSeparators should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -22877,63 +22537,53 @@ exports[`Story Snapshots: DateAndUnreadSeparators should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -23605,63 +23255,53 @@ exports[`Story Snapshots: DateAndUnreadSeparators should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -24120,63 +23760,53 @@ exports[`Story Snapshots: DateAndUnreadSeparators should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -24591,63 +24221,53 @@ exports[`Story Snapshots: DateAndUnreadSeparatorsLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -25111,63 +24731,53 @@ exports[`Story Snapshots: DateAndUnreadSeparatorsLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -25839,63 +25449,53 @@ exports[`Story Snapshots: DateAndUnreadSeparatorsLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -26354,63 +25954,53 @@ exports[`Story Snapshots: DateAndUnreadSeparatorsLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -26825,63 +26415,53 @@ exports[`Story Snapshots: Discussion should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -27403,63 +26983,53 @@ exports[`Story Snapshots: Discussion should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -27983,63 +27553,53 @@ exports[`Story Snapshots: Discussion should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -28563,63 +28123,53 @@ exports[`Story Snapshots: Discussion should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -29156,63 +28706,53 @@ exports[`Story Snapshots: DiscussionLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -29734,63 +29274,53 @@ exports[`Story Snapshots: DiscussionLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -30314,63 +29844,53 @@ exports[`Story Snapshots: DiscussionLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -30894,63 +30414,53 @@ exports[`Story Snapshots: DiscussionLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -31487,63 +30997,53 @@ exports[`Story Snapshots: Edited should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -32256,63 +31756,53 @@ exports[`Story Snapshots: EditedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -33026,63 +32516,53 @@ exports[`Story Snapshots: Editing should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -33498,63 +32978,53 @@ exports[`Story Snapshots: EditingLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -33969,63 +33439,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -34426,63 +33886,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -34864,63 +34314,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -35415,63 +34855,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -35878,63 +35308,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -36360,63 +35780,53 @@ exports[`Story Snapshots: Emojis should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -36888,63 +36298,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -37345,63 +36745,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -37783,63 +37173,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -38334,63 +37714,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -38797,63 +38167,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -39279,63 +38639,53 @@ exports[`Story Snapshots: EmojisLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -39807,63 +39157,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -40565,63 +39905,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -41615,63 +40945,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -41927,63 +41247,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -42426,63 +41736,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -42834,63 +42134,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -43400,63 +42690,53 @@ exports[`Story Snapshots: Encrypted should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -44231,63 +43511,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -44989,63 +44259,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -46039,63 +45299,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -46351,63 +45601,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -46850,63 +46090,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -47258,63 +46488,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -47824,63 +47044,53 @@ exports[`Story Snapshots: EncryptedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -48568,63 +47778,53 @@ exports[`Story Snapshots: Error should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -49011,63 +48211,53 @@ exports[`Story Snapshots: Error should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -49467,63 +48657,53 @@ exports[`Story Snapshots: ErrorLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -49910,63 +49090,53 @@ exports[`Story Snapshots: ErrorLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -50453,63 +49623,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenames should match snapshot 1`]
]
}
>
-
-
-
+
@@ -51050,63 +50210,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenames should match snapshot 1`]
]
}
>
-
-
-
+
@@ -51647,63 +50797,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenames should match snapshot 1`]
]
}
>
-
-
-
+
@@ -52244,63 +51384,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenames should match snapshot 1`]
]
}
>
-
-
-
+
@@ -53367,63 +52497,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -53964,63 +53084,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -54561,63 +53671,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -55158,63 +54258,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -56268,63 +55358,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -57033,63 +56113,53 @@ exports[`Story Snapshots: FullName should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -57504,63 +56574,53 @@ exports[`Story Snapshots: FullNameLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -57975,63 +57035,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -58433,63 +57483,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -59343,63 +58383,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -59814,63 +58844,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -60272,63 +59292,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61182,63 +60192,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61650,63 +60650,53 @@ exports[`Story Snapshots: Ignored should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61979,63 +60969,53 @@ exports[`Story Snapshots: IgnoredLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -62311,63 +61291,53 @@ exports[`Story Snapshots: InlineKatex should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -62768,63 +61738,53 @@ exports[`Story Snapshots: InlineKatexLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -63217,63 +62177,53 @@ exports[`Story Snapshots: JitsiCall should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -63750,63 +62700,53 @@ exports[`Story Snapshots: JitsiCallLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -64291,63 +63231,53 @@ exports[`Story Snapshots: Katex should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -64716,63 +63646,53 @@ exports[`Story Snapshots: KatexArray should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -65141,63 +64061,53 @@ exports[`Story Snapshots: KatexArrayLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -65566,63 +64476,53 @@ exports[`Story Snapshots: KatexLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -65995,63 +64895,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -66633,63 +65523,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -67221,63 +66101,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -68006,63 +66876,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -68644,63 +67504,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -69232,63 +68082,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70013,63 +68853,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70471,63 +69301,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70966,63 +69786,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -71459,63 +70269,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -71867,63 +70667,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -72397,63 +71187,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -72886,63 +71666,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -73325,63 +72095,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -73904,63 +72664,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -74483,63 +73233,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -75161,63 +73901,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -75619,63 +74349,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -76114,63 +74834,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -76607,63 +75317,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -77015,63 +75715,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -77545,63 +76235,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -78034,63 +76714,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -78473,63 +77143,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -79052,63 +77712,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -79631,63 +78281,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -80309,63 +78949,53 @@ exports[`Story Snapshots: Mentions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -80946,63 +79576,53 @@ exports[`Story Snapshots: Mentions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -81578,63 +80198,53 @@ exports[`Story Snapshots: MentionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -82215,63 +80825,53 @@ exports[`Story Snapshots: MentionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -82847,63 +81447,53 @@ exports[`Story Snapshots: Message should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -83257,63 +81847,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -84010,63 +82590,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -84817,63 +83387,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -85636,63 +84196,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -86346,63 +84896,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -87248,63 +85788,53 @@ exports[`Story Snapshots: MessageWithReadReceipt should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -87994,63 +86524,53 @@ exports[`Story Snapshots: MessageWithReadReceipt should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -88753,63 +87273,53 @@ exports[`Story Snapshots: MessageWithReadReceiptLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -89499,63 +88009,53 @@ exports[`Story Snapshots: MessageWithReadReceiptLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -90258,63 +88758,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -90888,63 +89378,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -91825,63 +90305,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -92632,63 +91102,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -93513,63 +91973,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -94130,63 +92580,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -94824,63 +93264,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -95605,63 +94035,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -96222,63 +94642,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -96916,63 +95326,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -97684,63 +96084,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -98503,63 +96893,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -99213,63 +97593,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -100115,63 +98485,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -100745,63 +99105,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -101419,63 +99769,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -102226,63 +100566,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -103108,63 +101438,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -103601,6 +101921,7 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
},
]
}
+ testID="thread-user-0"
>
0
@@ -103651,62 +101972,54 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104029,63 +102342,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104466,63 +102769,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104903,63 +103196,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -105340,63 +103623,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -105777,63 +104050,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -106214,63 +104477,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -106651,63 +104904,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107088,63 +105331,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107525,63 +105758,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107862,63 +106085,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -108355,6 +106568,7 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
},
]
}
+ testID="thread-user-0"
>
0
@@ -108405,62 +106619,54 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -108783,63 +106989,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -109220,63 +107416,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -109657,63 +107843,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110094,63 +108270,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110531,63 +108697,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110968,63 +109124,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -111405,63 +109551,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -111842,63 +109978,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -112279,63 +110405,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -112615,63 +110731,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -112987,63 +111093,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -113681,63 +111777,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -114053,63 +112139,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -114747,63 +112823,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -115119,63 +113185,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -115826,63 +113882,53 @@ exports[`Story Snapshots: Pinned should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -116583,63 +114629,53 @@ exports[`Story Snapshots: PinnedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -117340,63 +115376,53 @@ exports[`Story Snapshots: Reactions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -118342,63 +116368,53 @@ exports[`Story Snapshots: Reactions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -119813,63 +117829,53 @@ exports[`Story Snapshots: ReactionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -120815,63 +118821,53 @@ exports[`Story Snapshots: ReactionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -122287,63 +120283,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -122780,6 +120766,7 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
},
]
}
+ testID="thread-user-0"
>
0
@@ -122830,62 +120817,54 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123091,63 +121070,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123411,63 +121380,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123731,63 +121690,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -124068,63 +122017,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -124561,6 +122500,7 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
},
]
}
+ testID="thread-user-0"
>
0
@@ -124611,62 +122551,54 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -124872,63 +122804,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125192,63 +123114,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125512,63 +123424,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125962,63 +123864,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126282,63 +124174,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126602,63 +124484,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126922,63 +124794,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -127372,63 +125234,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -127692,63 +125544,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128012,63 +125854,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128332,63 +126164,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128668,63 +126490,53 @@ exports[`Story Snapshots: ShowButtonAsAttachment should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -129199,63 +127011,53 @@ exports[`Story Snapshots: ShowButtonAsAttachment should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -129908,63 +127710,53 @@ exports[`Story Snapshots: ShowButtonAsAttachmentLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -130439,63 +128231,53 @@ exports[`Story Snapshots: ShowButtonAsAttachmentLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -131148,63 +128930,53 @@ exports[`Story Snapshots: StaticAvatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -131619,63 +129391,53 @@ exports[`Story Snapshots: StaticAvatarLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132002,63 +129764,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132246,63 +129998,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132490,63 +130232,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132737,63 +130469,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132981,63 +130703,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133225,63 +130937,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133469,63 +131171,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133713,63 +131405,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133957,63 +131639,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134201,63 +131873,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134445,63 +132107,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134689,63 +132341,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134933,63 +132575,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135177,63 +132809,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135421,63 +133043,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135665,63 +133277,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135909,63 +133511,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136153,63 +133745,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136397,63 +133979,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136641,63 +134213,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136885,63 +134447,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137129,63 +134681,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137373,63 +134915,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137617,63 +135149,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137861,63 +135383,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138105,63 +135617,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138340,63 +135842,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138584,63 +136076,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138828,63 +136310,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139075,63 +136547,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139319,63 +136781,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139563,63 +137015,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139807,63 +137249,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140051,63 +137483,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140295,63 +137717,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140539,63 +137951,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140783,63 +138185,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141027,63 +138419,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141271,63 +138653,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141515,63 +138887,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141759,63 +139121,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142003,63 +139355,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142247,63 +139589,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142491,63 +139823,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142735,63 +140057,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142979,63 +140291,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143223,63 +140525,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143467,63 +140759,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143711,63 +140993,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143955,63 +141227,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144199,63 +141461,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144443,63 +141695,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144758,63 +142000,53 @@ exports[`Story Snapshots: Temp should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -145225,63 +142457,53 @@ exports[`Story Snapshots: TempLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -145700,63 +142922,53 @@ exports[`Story Snapshots: ThumbnailFromServer should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -146382,63 +143594,53 @@ exports[`Story Snapshots: ThumbnailFromServerLargeFont should match snapshot 1`]
]
}
>
-
-
-
+
@@ -147064,63 +144266,53 @@ exports[`Story Snapshots: TimeFormat should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -147535,63 +144727,53 @@ exports[`Story Snapshots: TimeFormatLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -148007,63 +145189,53 @@ exports[`Story Snapshots: Translated should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -148514,63 +145686,53 @@ exports[`Story Snapshots: TranslatedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -149020,63 +146182,53 @@ exports[`Story Snapshots: TwoShortCustomFieldsWithMarkdown should match snapshot
]
}
>
-
-
-
+
@@ -150207,63 +147359,53 @@ exports[`Story Snapshots: TwoShortCustomFieldsWithMarkdownLargeFont should match
]
}
>
-
-
-
+
@@ -151394,63 +148536,53 @@ exports[`Story Snapshots: URL should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -151988,63 +149120,53 @@ exports[`Story Snapshots: URL should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -152865,63 +149987,53 @@ exports[`Story Snapshots: URLImagePreview should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -153361,63 +150473,53 @@ exports[`Story Snapshots: URLImagePreview should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -153813,63 +150915,53 @@ exports[`Story Snapshots: URLImagePreviewLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -154309,63 +151401,53 @@ exports[`Story Snapshots: URLImagePreviewLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -154761,63 +151843,53 @@ exports[`Story Snapshots: URLLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -155355,63 +152427,53 @@ exports[`Story Snapshots: URLLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -156232,63 +153294,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -156604,63 +153656,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -157298,63 +154340,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -157670,63 +154702,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -158364,63 +155386,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -158736,63 +155748,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -159443,63 +156445,53 @@ exports[`Story Snapshots: WithAlias should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -159920,63 +156912,53 @@ exports[`Story Snapshots: WithAlias should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -160410,63 +157392,53 @@ exports[`Story Snapshots: WithAliasLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -160887,63 +157859,53 @@ exports[`Story Snapshots: WithAliasLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -161377,63 +158339,53 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -164283,63 +161235,53 @@ exports[`Story Snapshots: WithAudioLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -167179,63 +164121,53 @@ exports[`Story Snapshots: WithFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -168498,63 +165430,53 @@ exports[`Story Snapshots: WithFileLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -169575,63 +166497,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -170249,63 +167161,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -171412,63 +168314,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -172200,63 +169092,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -172874,63 +169756,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -173902,63 +170774,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -174690,63 +171552,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -175364,63 +172216,53 @@ exports[`Story Snapshots: WithVideo should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -176352,63 +173194,53 @@ exports[`Story Snapshots: WithVideo should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -177085,63 +173917,53 @@ exports[`Story Snapshots: WithVideoLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -177717,63 +174539,53 @@ exports[`Story Snapshots: WithVideoLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -178250,63 +175062,53 @@ exports[`Story Snapshots: WithVideoLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
diff --git a/app/containers/message/components/stories/__tests__/__snapshots__/leaves.test.tsx.snap b/app/containers/message/components/stories/__tests__/__snapshots__/leaves.test.tsx.snap
index d56ec17f9da..309565f3323 100644
--- a/app/containers/message/components/stories/__tests__/__snapshots__/leaves.test.tsx.snap
+++ b/app/containers/message/components/stories/__tests__/__snapshots__/leaves.test.tsx.snap
@@ -1230,63 +1230,53 @@ exports[`Story Snapshots: MessageAvatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -4976,6 +4966,7 @@ exports[`Story Snapshots: Thread should match snapshot 1`] = `
},
]
}
+ testID="thread-user-3"
>
3
@@ -5011,62 +5002,54 @@ exports[`Story Snapshots: Thread should match snapshot 1`] = `
]
}
>
-
-
-
+
diff --git a/app/views/CannedResponsesListView/__snapshots__/CannedResponseItem.test.tsx.snap b/app/views/CannedResponsesListView/__snapshots__/CannedResponseItem.test.tsx.snap
index 2ee2f702c24..c1e70adc54a 100644
--- a/app/views/CannedResponsesListView/__snapshots__/CannedResponseItem.test.tsx.snap
+++ b/app/views/CannedResponsesListView/__snapshots__/CannedResponseItem.test.tsx.snap
@@ -24,60 +24,51 @@ exports[`Story Snapshots: Itens should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
]
`;
diff --git a/app/views/DiscussionsView/__snapshots__/Item.test.tsx.snap b/app/views/DiscussionsView/__snapshots__/Item.test.tsx.snap
index 792d2047ad4..17de1d3cc00 100644
--- a/app/views/DiscussionsView/__snapshots__/Item.test.tsx.snap
+++ b/app/views/DiscussionsView/__snapshots__/Item.test.tsx.snap
@@ -38,61 +38,52 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
@@ -384,7 +375,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
+
-
-
@@ -767,7 +749,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
+
-
-
@@ -1152,7 +1125,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
+
-
-
@@ -1535,7 +1499,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
+
-
-
@@ -1918,7 +1873,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
+
-
-
@@ -2321,7 +2267,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
-
+
-
-
@@ -2691,7 +2628,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
-
+
-
-
@@ -3061,7 +2989,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
-
+
-
-
-
+
,
@@ -464,74 +454,64 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -782,74 +762,64 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -1105,74 +1075,64 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -1423,74 +1383,64 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -1746,74 +1696,64 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -2064,74 +2004,64 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
,
@@ -2382,74 +2312,64 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
,
diff --git a/app/views/RoomActionsView/components/__snapshots__/CallSection.test.tsx.snap b/app/views/RoomActionsView/components/__snapshots__/CallSection.test.tsx.snap
index d3cb79e3ba8..ee327f800fa 100644
--- a/app/views/RoomActionsView/components/__snapshots__/CallSection.test.tsx.snap
+++ b/app/views/RoomActionsView/components/__snapshots__/CallSection.test.tsx.snap
@@ -51,60 +51,51 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
@@ -264,7 +255,7 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
-
+
-
-
@@ -549,7 +531,7 @@ exports[`Story Snapshots: Disabled should match snapshot 1`] = `
-
+
-
-
@@ -832,7 +805,7 @@ exports[`Story Snapshots: NoVoiceCall should match snapshot 1`] = `
-
+
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
@@ -445,60 +409,51 @@ exports[`Story Snapshots: BlackTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -1461,60 +1406,51 @@ exports[`Story Snapshots: BlackTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -2724,63 +2641,53 @@ exports[`Story Snapshots: BlackTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -3054,60 +2961,51 @@ exports[`Story Snapshots: DarkTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -4070,60 +3958,51 @@ exports[`Story Snapshots: DarkTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -5333,63 +5193,53 @@ exports[`Story Snapshots: DarkTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -5663,60 +5513,51 @@ exports[`Story Snapshots: LightTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -6679,60 +6510,51 @@ exports[`Story Snapshots: LightTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -7942,63 +7745,53 @@ exports[`Story Snapshots: LightTheme should match snapshot 1`] = `
]
}
>
-
-
-
+
diff --git a/app/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snap b/app/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snap
index 389f9a62f8d..f1c3f158e8f 100644
--- a/app/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snap
+++ b/app/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snap
@@ -38,61 +38,52 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
]
}
>
-
-
@@ -398,6 +389,7 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -433,62 +425,54 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -922,6 +897,7 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -957,62 +933,54 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -1446,6 +1405,7 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -1481,62 +1441,54 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -1957,6 +1900,7 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -1992,62 +1936,54 @@ exports[`Story Snapshots: Badge should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -2485,6 +2412,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -2520,62 +2448,54 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -2993,6 +2904,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -3028,62 +2940,54 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -3501,6 +3396,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
},
]
}
+ testID="thread-user-+999"
>
+999
@@ -3536,62 +3432,54 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -4009,6 +3888,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -4044,62 +3924,54 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -4517,6 +4380,7 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -4552,62 +4416,54 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -5061,6 +4908,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -5096,62 +4944,54 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -5572,6 +5403,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -5607,62 +5439,54 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
@@ -6083,6 +5898,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
},
]
}
+ testID="thread-user-1"
>
1
@@ -6118,62 +5934,54 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
]
}
>
-
-
-
+
-
+
-
-
-
+
-
-
-
+
-
-
-
+
@@ -795,61 +768,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1173,61 +1119,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1564,61 +1483,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -1806,60 +1707,51 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -2359,61 +2251,52 @@ exports[`Story Snapshots: Forced should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -2737,61 +2602,52 @@ exports[`Story Snapshots: Forced should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -3115,61 +2953,52 @@ exports[`Story Snapshots: Forced should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -3506,61 +3317,52 @@ exports[`Story Snapshots: Forced should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
diff --git a/app/views/__snapshots__/ScreenLockedView.test.tsx.snap b/app/views/__snapshots__/ScreenLockedView.test.tsx.snap
index b571835966e..da973cafbd9 100644
--- a/app/views/__snapshots__/ScreenLockedView.test.tsx.snap
+++ b/app/views/__snapshots__/ScreenLockedView.test.tsx.snap
@@ -418,61 +418,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -796,61 +769,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1174,61 +1120,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -1565,61 +1484,52 @@ exports[`Story Snapshots: Default should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -2209,61 +2110,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
+ }
+ testID="passcode-button-1"
+ >
-
+
-
-
-
+
-
-
-
+
@@ -2587,61 +2461,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -2965,61 +2812,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -3343,61 +3163,52 @@ exports[`Story Snapshots: WithBiometry should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4117,61 +3910,52 @@ exports[`Story Snapshots: WithBiometryAndClose should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4495,61 +4261,52 @@ exports[`Story Snapshots: WithBiometryAndClose should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -4873,61 +4612,52 @@ exports[`Story Snapshots: WithBiometryAndClose should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -5251,61 +4963,52 @@ exports[`Story Snapshots: WithBiometryAndClose should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -5623,60 +5308,51 @@ exports[`Story Snapshots: WithBiometryAndClose should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -6139,61 +5815,52 @@ exports[`Story Snapshots: WithCloseButton should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -6517,61 +6166,52 @@ exports[`Story Snapshots: WithCloseButton should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -6895,61 +6517,52 @@ exports[`Story Snapshots: WithCloseButton should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
-
-
-
+
@@ -7286,61 +6881,52 @@ exports[`Story Snapshots: WithCloseButton should match snapshot 1`] = `
]
}
>
-
-
-
+
-
-
-
+
@@ -7528,60 +7105,51 @@ exports[`Story Snapshots: WithCloseButton should match snapshot 1`] = `
]
}
>
-
-
-
+
From 1044076f707c2179a5ae917d63900f8150bed417 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 3 Aug 2026 22:53:47 +0530
Subject: [PATCH 14/44] temporary disabled longPress test and link
---
.../tests/room/message-markdown-click.yaml | 28 -------------------
1 file changed, 28 deletions(-)
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index 5702bc7a576..b7d2784bfa6 100644
--- a/.maestro/tests/room/message-markdown-click.yaml
+++ b/.maestro/tests/room/message-markdown-click.yaml
@@ -90,34 +90,6 @@ tags:
text: 'OK'
optional: true
-# Long press on the link to copy to clipboard
-- runFlow:
- when:
- platform: Android
- commands:
- - longPressOn:
- text: '.*https://www.rocket.chat.*'
-- runFlow:
- when:
- platform: iOS
- commands:
- - longPressOn:
- point: 66%,59%
-
-# Verify clipboard has the link alert
-- extendedWaitUntil:
- visible:
- text: '.*Link Long Pressed*.'
- timeout: 10000
-
-- assertVisible:
- text: '.*https://www.rocket.chat*.'
-
-# Dismiss the alert
-- tapOn:
- text: 'OK'
- optional: true
-
# Tap on e2e_admin mention to open user info
- tapOn:
text: '.*e2e_admin*.'
From e134ee4fa7ee1072bbc9259f80e5c6cb28ca5865 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 3 Aug 2026 22:56:07 +0530
Subject: [PATCH 15/44] test import fix
---
app/containers/message/components/__tests__/Preview.test.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/containers/message/components/__tests__/Preview.test.tsx b/app/containers/message/components/__tests__/Preview.test.tsx
index e6a55125c9b..f365314761c 100644
--- a/app/containers/message/components/__tests__/Preview.test.tsx
+++ b/app/containers/message/components/__tests__/Preview.test.tsx
@@ -5,7 +5,7 @@ import MessagePreview from '../Preview';
import { mockedStore } from '../../../../reducers/mockedStore';
import { type TAnyMessageModel } from '../../../../definitions';
-jest.mock('../Touchable/Touch', () => {
+jest.mock('../../../Touch', () => {
const { forwardRef } = require('react');
const { TouchableOpacity } = require('react-native');
return forwardRef(({ children, onPress, onLongPress, ...props }: any, ref: any) => (
From c1bc640d89538925578db3e3afd1787281e38b24 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 3 Aug 2026 23:09:24 +0530
Subject: [PATCH 16/44] recover build-pr
---
.github/workflows/build-pr.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml
index f1e11f82bb7..4bb3a94572f 100644
--- a/.github/workflows/build-pr.yml
+++ b/.github/workflows/build-pr.yml
@@ -46,7 +46,7 @@ jobs:
name: Build Android
if: ${{ github.repository == 'RocketChat/Rocket.Chat.ReactNative' }}
uses: ./.github/workflows/build-android.yml
- needs: [e2e-hold]
+ needs: [run-eslint-and-test, generate-pr-changelog]
secrets: inherit
with:
trigger: "pr"
From 6a7bed4d2c69648e1f17d814918c794252c05797 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Tue, 4 Aug 2026 17:54:31 +0530
Subject: [PATCH 17/44] some improvements
---
app/containers/Touch.tsx | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index 5450c92c93a..ebec1c7c357 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -86,16 +86,12 @@ const Touch = forwardRef(
marginTop
};
const rippleColor = android_rippleColor ?? colors.surfaceNeutral;
- const feedbackProps = isAndroid
- ? { android_ripple: { color: rippleColor } }
- : { underlayColor: rippleColor, activeOpacity: 1 };
- const touchableProps = isIOS ? {} : feedbackProps;
+ const touchableProps = isIOS ? {} : { android_ripple: { color: rippleColor } };
const Wrapper = isAndroid ? RNGHKeyboardComponent : KeyboardComponent;
return (
, but useRef(null) yields RefObject. The lib only reads .current with a null check, so the cast is safe.
componentRef={componentRef as RefObject}
onPress={onPress}
accessible={accessible}
@@ -110,9 +106,6 @@ const Touch = forwardRef(
disabled={!enabled}
focusable={enabled}
canBeFocused={enabled}>
- {/* The accessibility props live on the focusable Touchable above. The inner View is a
- layout-only container; marking it accessible would create a second sibling node with
- the same label, causing double VoiceOver announcements and confusing TalkBack swipe nav. */}
{children}
);
From dbff978bb06e9c4300834b3270c8c510d16f9e49 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Sun, 9 Aug 2026 20:26:44 +0530
Subject: [PATCH 18/44] readded link long press test
---
.../tests/room/message-markdown-click.yaml | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index b7d2784bfa6..d6ce4bbba15 100644
--- a/.maestro/tests/room/message-markdown-click.yaml
+++ b/.maestro/tests/room/message-markdown-click.yaml
@@ -90,6 +90,34 @@ tags:
text: 'OK'
optional: true
+# Long press on the link to copy to clipboard
+- runFlow:
+ when:
+ platform: Android
+ commands:
+ - longPressOn:
+ text: '.*https://www.rocket.chat.*'
+- runFlow:
+ when:
+ platform: iOS
+ commands:
+ - longPressOn:
+ point: 66%,63%
+
+# Verify clipboard has the link alert
+- extendedWaitUntil:
+ visible:
+ text: '.*Link Long Pressed*.'
+ timeout: 10000
+
+- assertVisible:
+ text: '.*https://www.rocket.chat*.'
+
+# Dismiss the alert
+- tapOn:
+ text: 'OK'
+ optional: true
+
# Tap on e2e_admin mention to open user info
- tapOn:
text: '.*e2e_admin*.'
From 2e14ff65365762b07e8117b653ff9e5ccedc203c Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 10 Aug 2026 19:06:05 +0530
Subject: [PATCH 19/44] updated test-map to include 2fa test
---
.sniffler/test-map.json | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.sniffler/test-map.json b/.sniffler/test-map.json
index 1d47316cc76..50deabe3a40 100644
--- a/.sniffler/test-map.json
+++ b/.sniffler/test-map.json
@@ -157,6 +157,10 @@
"test": ".maestro/tests/onboarding/login/login.yaml",
"dependsOn": ["app/views/LoginView/**", "app/sagas/login.js"]
},
+ {
+ "test": ".maestro/tests/onboarding/login/two-factor-login.yaml",
+ "dependsOn": ["app/views/LoginView/**", "app/sagas/login.js", "app/containers/TwoFactor/**"]
+ },
{
"test": ".maestro/tests/onboarding/register/create-account.yaml",
"dependsOn": ["app/views/RegisterView/**", "app/sagas/login.js"]
From b54a03ebc19e0af2586abe73a472b6dbc9aabb0f Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 10 Aug 2026 19:08:06 +0530
Subject: [PATCH 20/44] added no memo annotation in actions component
---
app/containers/UIKit/Actions.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/app/containers/UIKit/Actions.tsx b/app/containers/UIKit/Actions.tsx
index 40f328ce812..aef47b96106 100644
--- a/app/containers/UIKit/Actions.tsx
+++ b/app/containers/UIKit/Actions.tsx
@@ -14,6 +14,8 @@ const styles = StyleSheet.create({
});
export const Actions = ({ blockId, appId, elements, parser }: IActions) => {
+ 'use no memo';
+
const [showMoreVisible, setShowMoreVisible] = useState(() => elements && elements.length > 5);
const shouldShowMore = elements && elements.length > 5;
From efa656dee0be4822d334bef3f34d701226007050 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Mon, 10 Aug 2026 20:16:49 +0530
Subject: [PATCH 21/44] ios server history background color fix
---
app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
index bd386ab9b60..0ff707351e9 100644
--- a/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
+++ b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
@@ -194,7 +194,7 @@ const SwipeableDeleteTouchable = ({
onDeletePress={handleDeletePress}
testID={`${testID}-delete`}
/>
-
+
Date: Mon, 10 Aug 2026 23:52:26 +0530
Subject: [PATCH 22/44] added hasInlineTextPressClaim
---
.../__snapshots__/ServerItem.test.tsx.snap | 18 ++++-
.../__snapshots__/Markdown.test.tsx.snap | 24 +++++++
.../markdown/components/inline/Link.tsx | 5 +-
.../components/Touchable/MessageTouchable.tsx | 7 ++
.../__snapshots__/Message.test.tsx.snap | 8 +++
.../helpers/inlineTextPressClaim.test.ts | 51 +++++++++++++
.../methods/helpers/inlineTextPressClaim.ts | 32 +++++++++
.../ServersHistoryItem.test.tsx.snap | 72 ++++++++++++++++---
8 files changed, 206 insertions(+), 11 deletions(-)
create mode 100644 app/lib/methods/helpers/inlineTextPressClaim.test.ts
create mode 100644 app/lib/methods/helpers/inlineTextPressClaim.ts
diff --git a/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap b/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
index 5fe6d1628e5..014f4b8642c 100644
--- a/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
+++ b/app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap
@@ -787,7 +787,14 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
{
+ onLongPress={onLongPress}
+ onPressIn={claimInlineTextPress}
+ onPressOut={releaseInlineTextPress}>
{(block => {
const blockArray = Array.isArray(block) ? block : [block];
return blockArray.map(blockInArray => {
diff --git a/app/containers/message/components/Touchable/MessageTouchable.tsx b/app/containers/message/components/Touchable/MessageTouchable.tsx
index 46abcd0877f..913e666f5f2 100644
--- a/app/containers/message/components/Touchable/MessageTouchable.tsx
+++ b/app/containers/message/components/Touchable/MessageTouchable.tsx
@@ -1,6 +1,7 @@
import { A11y } from 'react-native-a11y-order';
import { useTheme } from '../../../../theme';
+import { hasInlineTextPressClaim } from '../../../../lib/methods/helpers/inlineTextPressClaim';
import Touch from '../../../Touch';
import Message, { type TMessageProps } from '../Message/Message';
import { useLastFocusedMessageRef } from '../../../../lib/a11y/useLastFocusedMessageRef';
@@ -48,6 +49,12 @@ const MessageTouchable = (props: TMessageProps) => {
}
const handleLongPress = () => {
+ // An inline markdown link already handled this long press. On Android the row is a gesture-handler
+ // Pressable and the link is a plain , and the two gesture systems cannot arbitrate,
+ // so without this both fire and the action sheet lands on top of the "copied to clipboard" toast.
+ if (hasInlineTextPressClaim()) {
+ return;
+ }
markAsLastFocused();
onLongPress();
};
diff --git a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
index 4c0ed875c21..c7864dc342d 100644
--- a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
+++ b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
@@ -1441,6 +1441,8 @@ exports[`Story Snapshots: AttachmentWithTextAndLink should match snapshot 1`] =
{
+ beforeEach(() => {
+ jest.useFakeTimers();
+ releaseInlineTextPress();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ });
+
+ it('reports no claim before any press', () => {
+ expect(hasInlineTextPressClaim()).toBe(false);
+ });
+
+ it('reports a claim while inline text owns the touch', () => {
+ claimInlineTextPress();
+
+ expect(hasInlineTextPressClaim()).toBe(true);
+ });
+
+ it('holds the claim past the long press delay so the row can still be suppressed', () => {
+ claimInlineTextPress();
+ jest.advanceTimersByTime(500);
+
+ expect(hasInlineTextPressClaim()).toBe(true);
+ });
+
+ it('drops the claim once the press is released', () => {
+ claimInlineTextPress();
+ releaseInlineTextPress();
+
+ expect(hasInlineTextPressClaim()).toBe(false);
+ });
+
+ it('expires a claim that was never released, so a missed release cannot wedge long press', () => {
+ claimInlineTextPress();
+ jest.advanceTimersByTime(1000);
+
+ expect(hasInlineTextPressClaim()).toBe(false);
+ });
+
+ it('re-claims cleanly on a subsequent press', () => {
+ claimInlineTextPress();
+ jest.advanceTimersByTime(1000);
+ claimInlineTextPress();
+
+ expect(hasInlineTextPressClaim()).toBe(true);
+ });
+});
diff --git a/app/lib/methods/helpers/inlineTextPressClaim.ts b/app/lib/methods/helpers/inlineTextPressClaim.ts
new file mode 100644
index 00000000000..a6b15d037e4
--- /dev/null
+++ b/app/lib/methods/helpers/inlineTextPressClaim.ts
@@ -0,0 +1,32 @@
+/**
+ * Bridges React Native's JS responder system and react-native-gesture-handler for inline text presses.
+ *
+ * On Android the message row is a gesture-handler Pressable, which arms its long press on touch down and
+ * can only be cancelled through RNGH's own arbitration. Inline markdown links are plain
+ * ``, living in RN's responder system. The single bridge between the two is
+ * `setJSResponder(tag, blockNativeResponder)` — RNGH cancels its handlers only when `blockNativeResponder`
+ * is true (`RNGestureHandlerRootHelper.handleSetJSResponder`) — and `Text` cannot send that signal: it
+ * omits the flag from its Pressability config and its `onResponderGrant` proxy discards Pressability's
+ * return value. So a long press on a link fired the link's handler *and* the row's, dropping the message
+ * action sheet on top of the "copied to clipboard" toast.
+ *
+ * Inline text therefore records here that it owns the current touch, and the row checks before acting.
+ * The claim is taken on press in — at responder grant, well before either long-press timer elapses — so
+ * this is an ordering guarantee rather than a race.
+ */
+
+// Bounds the damage if a release is ever missed (e.g. the text unmounts mid-press). A stale claim can then
+// only suppress a long press for slightly longer than the press that would have consumed it.
+const CLAIM_TTL = 1000;
+
+let claimedAt: number | null = null;
+
+export const claimInlineTextPress = () => {
+ claimedAt = Date.now();
+};
+
+export const releaseInlineTextPress = () => {
+ claimedAt = null;
+};
+
+export const hasInlineTextPressClaim = () => claimedAt !== null && Date.now() - claimedAt < CLAIM_TTL;
diff --git a/app/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snap b/app/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snap
index e1f5841a6b4..7db5521986a 100644
--- a/app/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snap
+++ b/app/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snap
@@ -122,7 +122,14 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
Date: Tue, 11 Aug 2026 00:13:20 +0530
Subject: [PATCH 23/44] rename inlineTextPress to nestedPress
---
.../markdown/components/inline/Link.tsx | 6 +--
.../components/Touchable/MessageTouchable.tsx | 11 ++--
.../helpers/inlineTextPressClaim.test.ts | 51 -------------------
.../methods/helpers/inlineTextPressClaim.ts | 32 ------------
app/lib/methods/helpers/nestedPress.test.ts | 51 +++++++++++++++++++
app/lib/methods/helpers/nestedPress.ts | 18 +++++++
6 files changed, 78 insertions(+), 91 deletions(-)
delete mode 100644 app/lib/methods/helpers/inlineTextPressClaim.test.ts
delete mode 100644 app/lib/methods/helpers/inlineTextPressClaim.ts
create mode 100644 app/lib/methods/helpers/nestedPress.test.ts
create mode 100644 app/lib/methods/helpers/nestedPress.ts
diff --git a/app/containers/markdown/components/inline/Link.tsx b/app/containers/markdown/components/inline/Link.tsx
index e0febf1af60..2ade4cfb0e5 100644
--- a/app/containers/markdown/components/inline/Link.tsx
+++ b/app/containers/markdown/components/inline/Link.tsx
@@ -9,7 +9,7 @@ import { LISTENER } from '../../../Toast';
import { useTheme } from '../../../../theme';
import openLink from '../../../../lib/methods/helpers/openLink';
import EventEmitter from '../../../../lib/methods/helpers/events';
-import { claimInlineTextPress, releaseInlineTextPress } from '../../../../lib/methods/helpers/inlineTextPressClaim';
+import { beginNestedPress, endNestedPress } from '../../../../lib/methods/helpers/nestedPress';
import { themes } from '../../../../lib/constants/colors';
import MarkdownContext from '../../contexts/MarkdownContext';
import styles from '../../styles';
@@ -53,8 +53,8 @@ const Link = ({ value }: ILinkProps) => {
style={[styles.link, ...(textStyle ? [textStyle] : []), { color: themes[theme].fontInfo }]}
onPress={handlePress}
onLongPress={onLongPress}
- onPressIn={claimInlineTextPress}
- onPressOut={releaseInlineTextPress}>
+ onPressIn={beginNestedPress}
+ onPressOut={endNestedPress}>
{(block => {
const blockArray = Array.isArray(block) ? block : [block];
return blockArray.map(blockInArray => {
diff --git a/app/containers/message/components/Touchable/MessageTouchable.tsx b/app/containers/message/components/Touchable/MessageTouchable.tsx
index 913e666f5f2..c926e5fd352 100644
--- a/app/containers/message/components/Touchable/MessageTouchable.tsx
+++ b/app/containers/message/components/Touchable/MessageTouchable.tsx
@@ -1,7 +1,7 @@
import { A11y } from 'react-native-a11y-order';
import { useTheme } from '../../../../theme';
-import { hasInlineTextPressClaim } from '../../../../lib/methods/helpers/inlineTextPressClaim';
+import { isNestedPressActive } from '../../../../lib/methods/helpers/nestedPress';
import Touch from '../../../Touch';
import Message, { type TMessageProps } from '../Message/Message';
import { useLastFocusedMessageRef } from '../../../../lib/a11y/useLastFocusedMessageRef';
@@ -49,10 +49,11 @@ const MessageTouchable = (props: TMessageProps) => {
}
const handleLongPress = () => {
- // An inline markdown link already handled this long press. On Android the row is a gesture-handler
- // Pressable and the link is a plain , and the two gesture systems cannot arbitrate,
- // so without this both fire and the action sheet lands on top of the "copied to clipboard" toast.
- if (hasInlineTextPressClaim()) {
+ // A nested press target — an inline markdown link — already handled this long press. On Android the
+ // row is a gesture-handler Pressable and the link is a plain , and the two gesture
+ // systems cannot arbitrate, so without this both fire and the action sheet lands on top of the
+ // "copied to clipboard" toast.
+ if (isNestedPressActive()) {
return;
}
markAsLastFocused();
diff --git a/app/lib/methods/helpers/inlineTextPressClaim.test.ts b/app/lib/methods/helpers/inlineTextPressClaim.test.ts
deleted file mode 100644
index d9a278df00d..00000000000
--- a/app/lib/methods/helpers/inlineTextPressClaim.test.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { claimInlineTextPress, hasInlineTextPressClaim, releaseInlineTextPress } from './inlineTextPressClaim';
-
-describe('inlineTextPressClaim', () => {
- beforeEach(() => {
- jest.useFakeTimers();
- releaseInlineTextPress();
- });
-
- afterEach(() => {
- jest.useRealTimers();
- });
-
- it('reports no claim before any press', () => {
- expect(hasInlineTextPressClaim()).toBe(false);
- });
-
- it('reports a claim while inline text owns the touch', () => {
- claimInlineTextPress();
-
- expect(hasInlineTextPressClaim()).toBe(true);
- });
-
- it('holds the claim past the long press delay so the row can still be suppressed', () => {
- claimInlineTextPress();
- jest.advanceTimersByTime(500);
-
- expect(hasInlineTextPressClaim()).toBe(true);
- });
-
- it('drops the claim once the press is released', () => {
- claimInlineTextPress();
- releaseInlineTextPress();
-
- expect(hasInlineTextPressClaim()).toBe(false);
- });
-
- it('expires a claim that was never released, so a missed release cannot wedge long press', () => {
- claimInlineTextPress();
- jest.advanceTimersByTime(1000);
-
- expect(hasInlineTextPressClaim()).toBe(false);
- });
-
- it('re-claims cleanly on a subsequent press', () => {
- claimInlineTextPress();
- jest.advanceTimersByTime(1000);
- claimInlineTextPress();
-
- expect(hasInlineTextPressClaim()).toBe(true);
- });
-});
diff --git a/app/lib/methods/helpers/inlineTextPressClaim.ts b/app/lib/methods/helpers/inlineTextPressClaim.ts
deleted file mode 100644
index a6b15d037e4..00000000000
--- a/app/lib/methods/helpers/inlineTextPressClaim.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Bridges React Native's JS responder system and react-native-gesture-handler for inline text presses.
- *
- * On Android the message row is a gesture-handler Pressable, which arms its long press on touch down and
- * can only be cancelled through RNGH's own arbitration. Inline markdown links are plain
- * ``, living in RN's responder system. The single bridge between the two is
- * `setJSResponder(tag, blockNativeResponder)` — RNGH cancels its handlers only when `blockNativeResponder`
- * is true (`RNGestureHandlerRootHelper.handleSetJSResponder`) — and `Text` cannot send that signal: it
- * omits the flag from its Pressability config and its `onResponderGrant` proxy discards Pressability's
- * return value. So a long press on a link fired the link's handler *and* the row's, dropping the message
- * action sheet on top of the "copied to clipboard" toast.
- *
- * Inline text therefore records here that it owns the current touch, and the row checks before acting.
- * The claim is taken on press in — at responder grant, well before either long-press timer elapses — so
- * this is an ordering guarantee rather than a race.
- */
-
-// Bounds the damage if a release is ever missed (e.g. the text unmounts mid-press). A stale claim can then
-// only suppress a long press for slightly longer than the press that would have consumed it.
-const CLAIM_TTL = 1000;
-
-let claimedAt: number | null = null;
-
-export const claimInlineTextPress = () => {
- claimedAt = Date.now();
-};
-
-export const releaseInlineTextPress = () => {
- claimedAt = null;
-};
-
-export const hasInlineTextPressClaim = () => claimedAt !== null && Date.now() - claimedAt < CLAIM_TTL;
diff --git a/app/lib/methods/helpers/nestedPress.test.ts b/app/lib/methods/helpers/nestedPress.test.ts
new file mode 100644
index 00000000000..d6f6c5d8867
--- /dev/null
+++ b/app/lib/methods/helpers/nestedPress.test.ts
@@ -0,0 +1,51 @@
+import { beginNestedPress, endNestedPress, isNestedPressActive } from './nestedPress';
+
+describe('nestedPress', () => {
+ beforeEach(() => {
+ jest.useFakeTimers();
+ endNestedPress();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ });
+
+ it('reports no active press before any press', () => {
+ expect(isNestedPressActive()).toBe(false);
+ });
+
+ it('reports an active press while a nested target owns the touch', () => {
+ beginNestedPress();
+
+ expect(isNestedPressActive()).toBe(true);
+ });
+
+ it('stays active past the long press delay so the row can still be suppressed', () => {
+ beginNestedPress();
+ jest.advanceTimersByTime(500);
+
+ expect(isNestedPressActive()).toBe(true);
+ });
+
+ it('goes inactive once the press ends', () => {
+ beginNestedPress();
+ endNestedPress();
+
+ expect(isNestedPressActive()).toBe(false);
+ });
+
+ it('expires a press that never ended, so a missed release cannot wedge long press', () => {
+ beginNestedPress();
+ jest.advanceTimersByTime(1000);
+
+ expect(isNestedPressActive()).toBe(false);
+ });
+
+ it('restarts cleanly on a subsequent press', () => {
+ beginNestedPress();
+ jest.advanceTimersByTime(1000);
+ beginNestedPress();
+
+ expect(isNestedPressActive()).toBe(true);
+ });
+});
diff --git a/app/lib/methods/helpers/nestedPress.ts b/app/lib/methods/helpers/nestedPress.ts
new file mode 100644
index 00000000000..6b792758ea0
--- /dev/null
+++ b/app/lib/methods/helpers/nestedPress.ts
@@ -0,0 +1,18 @@
+// Lets a nested press target tell an ancestor it owns the current touch: on Android the message row is a
+// gesture-handler Pressable while inline markdown links are plain , and the two gesture
+// systems cannot arbitrate, so without this a long press on a link fires both handlers.
+
+// Bounds the damage if an end is ever missed, e.g. the text unmounts mid-press.
+const MAX_PRESS_DURATION = 1000;
+
+let startedAt: number | null = null;
+
+export const beginNestedPress = () => {
+ startedAt = Date.now();
+};
+
+export const endNestedPress = () => {
+ startedAt = null;
+};
+
+export const isNestedPressActive = () => startedAt !== null && Date.now() - startedAt < MAX_PRESS_DURATION;
From 8944f2333f01bb4f39e77282fff2a61272dc294e Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Tue, 11 Aug 2026 02:39:21 +0530
Subject: [PATCH 24/44] using it as hook
---
app/containers/Touch.tsx | 19 +++-
.../__snapshots__/Markdown.test.tsx.snap | 24 ----
.../markdown/components/inline/Link.tsx | 5 +-
.../components/Touchable/MessageTouchable.tsx | 12 +-
.../__snapshots__/Message.test.tsx.snap | 8 --
app/lib/hooks/useResponderLongPress.test.ts | 107 ++++++++++++++++++
app/lib/hooks/useResponderLongPress.ts | 37 ++++++
app/lib/methods/helpers/nestedPress.test.ts | 51 ---------
app/lib/methods/helpers/nestedPress.ts | 18 ---
9 files changed, 167 insertions(+), 114 deletions(-)
create mode 100644 app/lib/hooks/useResponderLongPress.test.ts
create mode 100644 app/lib/hooks/useResponderLongPress.ts
delete mode 100644 app/lib/methods/helpers/nestedPress.test.ts
delete mode 100644 app/lib/methods/helpers/nestedPress.ts
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index ebec1c7c357..999ebf10f7b 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -16,6 +16,7 @@ import { withKeyboardFocus } from 'react-native-external-keyboard';
import { useTheme } from '../theme';
import { isIOS, isAndroid } from '../lib/methods/helpers';
+import { useResponderLongPress } from '../lib/hooks/useResponderLongPress';
export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightProps {
children: ReactNode;
@@ -29,6 +30,13 @@ export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightPr
enabled?: boolean;
android_rippleColor?: string;
componentRef?: RefObject;
+ /**
+ * Android only. Detects onLongPress through the JS responder system rather than gesture-handler, so
+ * nested press targets that live in that system win by depth. Set it when the subtree contains RN press
+ * targets that must beat this one — markdown links inside a message, say — and leave it off when the
+ * subtree instead competes with gesture-handler gestures, such as a row inside a Swipeable.
+ */
+ longPressViaResponder?: boolean;
}
const Component = isIOS ? TouchableOpacity : TouchableHighlight;
@@ -50,11 +58,17 @@ const Touch = forwardRef(
rectButtonStyle,
enabled = true,
componentRef,
+ longPressViaResponder,
+ onLongPress,
...props
},
ref
) => {
const { colors } = useTheme();
+ // When routed through the responder system, onLongPress is handled by the inner View instead of the
+ // gesture-handler Pressable below, so the two are mutually exclusive.
+ const useResponder = isAndroid && !!longPressViaResponder;
+ const responderProps = useResponderLongPress(useResponder ? onLongPress : undefined, enabled);
// The background color must be applied to the RectButton, not the View.
// If set on the View, the touch opacity animation won't work properly.
const flattenedStyle = StyleSheet.flatten(style) || {};
@@ -94,6 +108,7 @@ const Touch = forwardRef(
ref={ref}
componentRef={componentRef as RefObject}
onPress={onPress}
+ onLongPress={useResponder ? undefined : onLongPress}
accessible={accessible}
accessibilityRole={props.accessibilityRole}
accessibilityLabel={accessibilityLabel}
@@ -106,7 +121,9 @@ const Touch = forwardRef(
disabled={!enabled}
focusable={enabled}
canBeFocused={enabled}>
- {children}
+
+ {children}
+
);
}
diff --git a/app/containers/markdown/__snapshots__/Markdown.test.tsx.snap b/app/containers/markdown/__snapshots__/Markdown.test.tsx.snap
index 512d9e37576..5756d2d0cd9 100644
--- a/app/containers/markdown/__snapshots__/Markdown.test.tsx.snap
+++ b/app/containers/markdown/__snapshots__/Markdown.test.tsx.snap
@@ -1754,8 +1754,6 @@ exports[`Story Snapshots: HeadersWithFormatting should match snapshot 1`] = `
{
+ onLongPress={onLongPress}>
{(block => {
const blockArray = Array.isArray(block) ? block : [block];
return blockArray.map(blockInArray => {
diff --git a/app/containers/message/components/Touchable/MessageTouchable.tsx b/app/containers/message/components/Touchable/MessageTouchable.tsx
index c926e5fd352..e9f3144abfb 100644
--- a/app/containers/message/components/Touchable/MessageTouchable.tsx
+++ b/app/containers/message/components/Touchable/MessageTouchable.tsx
@@ -1,7 +1,6 @@
import { A11y } from 'react-native-a11y-order';
import { useTheme } from '../../../../theme';
-import { isNestedPressActive } from '../../../../lib/methods/helpers/nestedPress';
import Touch from '../../../Touch';
import Message, { type TMessageProps } from '../Message/Message';
import { useLastFocusedMessageRef } from '../../../../lib/a11y/useLastFocusedMessageRef';
@@ -49,13 +48,6 @@ const MessageTouchable = (props: TMessageProps) => {
}
const handleLongPress = () => {
- // A nested press target — an inline markdown link — already handled this long press. On Android the
- // row is a gesture-handler Pressable and the link is a plain , and the two gesture
- // systems cannot arbitrate, so without this both fire and the action sheet lands on top of the
- // "copied to clipboard" toast.
- if (isNestedPressActive()) {
- return;
- }
markAsLastFocused();
onLongPress();
};
@@ -66,6 +58,10 @@ const MessageTouchable = (props: TMessageProps) => {
and cannot cancel a gesture-handler
+ // ancestor, so a long press on a link used to fire the link's handler and open the action
+ // sheet. Detecting it in the responder system instead lets the link win by depth.
+ longPressViaResponder
onPress={onPressAction}
disabled={!tappable}
style={{ backgroundColor }}
diff --git a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
index c7864dc342d..4c0ed875c21 100644
--- a/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
+++ b/app/containers/message/components/__tests__/__snapshots__/Message.test.tsx.snap
@@ -1441,8 +1441,6 @@ exports[`Story Snapshots: AttachmentWithTextAndLink should match snapshot 1`] =
{
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ });
+
+ it('returns null when there is no handler, so the view stays out of the responder system', () => {
+ const { result } = renderHook(() => useResponderLongPress(undefined));
+
+ expect(result.current).toBeNull();
+ });
+
+ it('returns null when disabled', () => {
+ const { result } = renderHook(() => useResponderLongPress(jest.fn(), false));
+
+ expect(result.current).toBeNull();
+ });
+
+ it('claims the responder so nested press targets can win by depth', () => {
+ const { result } = renderHook(() => useResponderLongPress(jest.fn()));
+
+ expect(result.current?.onStartShouldSetResponder()).toBe(true);
+ });
+
+ it('allows termination so an ancestor scroll view can take the touch over', () => {
+ const { result } = renderHook(() => useResponderLongPress(jest.fn()));
+
+ expect(result.current?.onResponderTerminationRequest()).toBe(true);
+ });
+
+ it('calls the handler once the press is held long enough', () => {
+ const onLongPress = jest.fn();
+ const { result } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ expect(onLongPress).not.toHaveBeenCalled();
+
+ act(() => jest.advanceTimersByTime(500));
+ expect(onLongPress).toHaveBeenCalledTimes(1);
+ });
+
+ it('forwards the grant event to the handler, as Pressability does', () => {
+ const onLongPress = jest.fn();
+ const { result } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ act(() => jest.advanceTimersByTime(500));
+
+ expect(onLongPress).toHaveBeenCalledWith(pressEvent);
+ });
+
+ it('does not call the handler for a press released early', () => {
+ const onLongPress = jest.fn();
+ const { result } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ act(() => jest.advanceTimersByTime(400));
+ act(() => result.current?.onResponderRelease());
+ act(() => jest.advanceTimersByTime(500));
+
+ expect(onLongPress).not.toHaveBeenCalled();
+ });
+
+ it('does not call the handler when the responder is terminated, e.g. by scrolling', () => {
+ const onLongPress = jest.fn();
+ const { result } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ act(() => result.current?.onResponderTerminate());
+ act(() => jest.advanceTimersByTime(500));
+
+ expect(onLongPress).not.toHaveBeenCalled();
+ });
+
+ it('does not fire twice when a new press starts before the previous timer elapsed', () => {
+ const onLongPress = jest.fn();
+ const { result } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ act(() => jest.advanceTimersByTime(400));
+ act(() => result.current?.onResponderGrant(pressEvent));
+ act(() => jest.advanceTimersByTime(500));
+
+ expect(onLongPress).toHaveBeenCalledTimes(1);
+ });
+
+ it('cancels a pending long press on unmount', () => {
+ const onLongPress = jest.fn();
+ const { result, unmount } = renderHook(() => useResponderLongPress(onLongPress));
+
+ act(() => result.current?.onResponderGrant(pressEvent));
+ unmount();
+ act(() => jest.advanceTimersByTime(500));
+
+ expect(onLongPress).not.toHaveBeenCalled();
+ });
+});
diff --git a/app/lib/hooks/useResponderLongPress.ts b/app/lib/hooks/useResponderLongPress.ts
new file mode 100644
index 00000000000..e164cb2cc97
--- /dev/null
+++ b/app/lib/hooks/useResponderLongPress.ts
@@ -0,0 +1,37 @@
+import { useEffect, useRef } from 'react';
+import { type GestureResponderEvent } from 'react-native';
+
+// Detects a long press through React Native's JS responder system instead of a gesture handler, so that
+// nested press targets win by depth. A gesture-handler parent cannot be cancelled by a plain
+// child, which is how a long press on a markdown link also opened the message actions.
+// Matches Pressability's default so the feel is unchanged.
+const LONG_PRESS_DELAY = 500;
+
+export const useResponderLongPress = (onLongPress?: (event: GestureResponderEvent) => void, enabled = true) => {
+ const timeout = useRef | null>(null);
+
+ const clear = () => {
+ if (timeout.current) {
+ clearTimeout(timeout.current);
+ timeout.current = null;
+ }
+ };
+
+ useEffect(() => clear, []);
+
+ if (!onLongPress || !enabled) {
+ return null;
+ }
+
+ return {
+ onStartShouldSetResponder: () => true,
+ // Let an ancestor scroll view take the touch over, which cancels the pending long press.
+ onResponderTerminationRequest: () => true,
+ onResponderGrant: (event: GestureResponderEvent) => {
+ clear();
+ timeout.current = setTimeout(() => onLongPress(event), LONG_PRESS_DELAY);
+ },
+ onResponderRelease: clear,
+ onResponderTerminate: clear
+ };
+};
diff --git a/app/lib/methods/helpers/nestedPress.test.ts b/app/lib/methods/helpers/nestedPress.test.ts
deleted file mode 100644
index d6f6c5d8867..00000000000
--- a/app/lib/methods/helpers/nestedPress.test.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { beginNestedPress, endNestedPress, isNestedPressActive } from './nestedPress';
-
-describe('nestedPress', () => {
- beforeEach(() => {
- jest.useFakeTimers();
- endNestedPress();
- });
-
- afterEach(() => {
- jest.useRealTimers();
- });
-
- it('reports no active press before any press', () => {
- expect(isNestedPressActive()).toBe(false);
- });
-
- it('reports an active press while a nested target owns the touch', () => {
- beginNestedPress();
-
- expect(isNestedPressActive()).toBe(true);
- });
-
- it('stays active past the long press delay so the row can still be suppressed', () => {
- beginNestedPress();
- jest.advanceTimersByTime(500);
-
- expect(isNestedPressActive()).toBe(true);
- });
-
- it('goes inactive once the press ends', () => {
- beginNestedPress();
- endNestedPress();
-
- expect(isNestedPressActive()).toBe(false);
- });
-
- it('expires a press that never ended, so a missed release cannot wedge long press', () => {
- beginNestedPress();
- jest.advanceTimersByTime(1000);
-
- expect(isNestedPressActive()).toBe(false);
- });
-
- it('restarts cleanly on a subsequent press', () => {
- beginNestedPress();
- jest.advanceTimersByTime(1000);
- beginNestedPress();
-
- expect(isNestedPressActive()).toBe(true);
- });
-});
diff --git a/app/lib/methods/helpers/nestedPress.ts b/app/lib/methods/helpers/nestedPress.ts
deleted file mode 100644
index 6b792758ea0..00000000000
--- a/app/lib/methods/helpers/nestedPress.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// Lets a nested press target tell an ancestor it owns the current touch: on Android the message row is a
-// gesture-handler Pressable while inline markdown links are plain , and the two gesture
-// systems cannot arbitrate, so without this a long press on a link fires both handlers.
-
-// Bounds the damage if an end is ever missed, e.g. the text unmounts mid-press.
-const MAX_PRESS_DURATION = 1000;
-
-let startedAt: number | null = null;
-
-export const beginNestedPress = () => {
- startedAt = Date.now();
-};
-
-export const endNestedPress = () => {
- startedAt = null;
-};
-
-export const isNestedPressActive = () => startedAt !== null && Date.now() - startedAt < MAX_PRESS_DURATION;
From 98141fd25d614de167d7f4405697e5c00eeebc34 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Tue, 11 Aug 2026 18:32:47 +0530
Subject: [PATCH 25/44] move testId to child view
---
app/containers/Touch.tsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/containers/Touch.tsx b/app/containers/Touch.tsx
index 999ebf10f7b..7e2ddbf9288 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -60,6 +60,7 @@ const Touch = forwardRef(
componentRef,
longPressViaResponder,
onLongPress,
+ testID,
...props
},
ref
@@ -121,7 +122,7 @@ const Touch = forwardRef(
disabled={!enabled}
focusable={enabled}
canBeFocused={enabled}>
-
+
{children}
From f644fb477cf94fadddf2248ee9a6af224d95c70c Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Tue, 11 Aug 2026 19:50:20 +0530
Subject: [PATCH 26/44] added timeout for room scroll
---
.maestro/helpers/navigate-to-room.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.maestro/helpers/navigate-to-room.yaml b/.maestro/helpers/navigate-to-room.yaml
index e8eba0728b0..57a74365cf0 100644
--- a/.maestro/helpers/navigate-to-room.yaml
+++ b/.maestro/helpers/navigate-to-room.yaml
@@ -8,6 +8,7 @@ tags:
- scrollUntilVisible:
element:
id: 'rooms-list-view-item-${ROOM}'
+ timeout: 60000
- waitForAnimationToEnd
- tapOn:
id: 'rooms-list-view-item-${ROOM}'
From 8131b2317098b77bef4e9686582d5f0d5dfbc044 Mon Sep 17 00:00:00 2001
From: Rohit <40559587+Rohit3523@users.noreply.github.com>
Date: Tue, 11 Aug 2026 20:31:16 +0530
Subject: [PATCH 27/44] snapshot update
---
.../__snapshots__/DirectoryItem.test.tsx.snap | 16 +--
.../NotifierComponent.test.tsx.snap | 8 +-
.../Base/__snapshots__/Base.test.tsx.snap | 136 +++++++++---------
.../__snapshots__/ServerItem.test.tsx.snap | 16 +--
.../__snapshots__/TextInput.test.tsx.snap | 2 +-
.../__snapshots__/UiKitModal.test.tsx.snap | 2 +-
.../__snapshots__/Message.test.tsx.snap | 12 +-
.../__snapshots__/leaves.test.tsx.snap | 2 +-
.../__snapshots__/Item.test.tsx.snap | 16 +--
.../ServersHistoryItem.test.tsx.snap | 16 +--
.../__snapshots__/Item.test.tsx.snap | 48 +++----
.../ChangePasscodeView.test.tsx.snap | 44 +++---
.../ScreenLockedView.test.tsx.snap | 92 ++++++------
13 files changed, 205 insertions(+), 205 deletions(-)
diff --git a/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap b/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
index 38ff2fa8386..4d63e46c154 100644
--- a/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
+++ b/app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap
@@ -81,10 +81,10 @@ exports[`Story Snapshots: CustomStyle should match snapshot 1`] = `
"opacity": 1,
}
}
- testID="directory-item-style"
>