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}'
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..9105f09ac73
--- /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
diff --git a/.maestro/tests/room/message-markdown-click.yaml b/.maestro/tests/room/message-markdown-click.yaml
index f0a746f2648..d6ce4bbba15 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:
@@ -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,98 @@ 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'
+- hideKeyboard
+- tapOn: 'Ephemeral Button'
+- extendedWaitUntil:
+ visible:
+ text: '.*A very secret message visible after clicking Ephemeral Button*.'
+ timeout: 10000
diff --git a/.maestro/tests/room/unread-badge.yaml b/.maestro/tests/room/unread-badge.yaml
index c52cfff178b..d0cfa29c56d 100644
--- a/.maestro/tests/room/unread-badge.yaml
+++ b/.maestro/tests/room/unread-badge.yaml
@@ -34,6 +34,10 @@ tags:
timeout: 60000
- tapOn:
id: 'rooms-list-view-item-${output.otherUser.username}'
+- extendedWaitUntil:
+ notVisible:
+ id: 'in-app-notification-.*'
+ timeout: 15000
- tapOn:
id: header-back
retryTapIfNoChange: true
@@ -62,6 +66,10 @@ tags:
timeout: 60000
- tapOn:
id: 'rooms-list-view-item-${output.otherUser.username}'
+- extendedWaitUntil:
+ notVisible:
+ id: 'in-app-notification-.*'
+ timeout: 15000
- tapOn:
id: header-back
retryTapIfNoChange: true
@@ -91,6 +99,10 @@ tags:
timeout: 60000
- tapOn:
id: 'rooms-list-view-item-${output.otherUser.username}'
+- extendedWaitUntil:
+ notVisible:
+ id: 'in-app-notification-.*'
+ timeout: 15000
- tapOn:
id: header-back
retryTapIfNoChange: true
@@ -120,6 +132,10 @@ tags:
timeout: 60000
- tapOn:
id: 'rooms-list-view-item-${output.otherUser.username}'
+- extendedWaitUntil:
+ notVisible:
+ id: 'in-app-notification-.*'
+ timeout: 15000
- tapOn:
id: header-back
retryTapIfNoChange: true
diff --git a/.maestro/tests/teams/convert-team.yaml b/.maestro/tests/teams/convert-team.yaml
index 9820ad29154..b17a9db9446 100644
--- a/.maestro/tests/teams/convert-team.yaml
+++ b/.maestro/tests/teams/convert-team.yaml
@@ -148,8 +148,9 @@ tags:
ROOM: ${output.toBeConverted}
- scrollUntilVisible:
element:
- text: 'Convert to channel'
-- tapOn: 'Convert to channel'
+ id: 'room-actions-convert-to-channel'
+- tapOn:
+ id: 'room-actions-convert-to-channel'
- extendedWaitUntil:
visible:
text: '.*Converting team to channel.*'
diff --git a/.sniffler/test-map.json b/.sniffler/test-map.json
index f7575879a9c..efb24dffc1a 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"]
diff --git a/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap b/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
index 81ef3deecc6..5afac024372 100644
--- a/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
+++ b/app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap
@@ -858,63 +858,53 @@ exports[`Story Snapshots: Touchable should match snapshot 1`] = `
]
}
>
-
-
-
+
`;
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/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/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/SwipeableDeleteItem/Touchable.tsx b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
index 454190c90f1..510cb6b914a 100644
--- a/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
+++ b/app/containers/ServerItem/SwipeableDeleteItem/Touchable.tsx
@@ -47,8 +47,14 @@ const SwipeableDeleteTouchable = ({
const rowOffSet = useSharedValue(0);
const rowState = useSharedValue(0);
const valueRef = useRef(0);
+ const panActivated = useSharedValue(false);
const handlePress = () => {
+ if (panActivated.value) {
+ panActivated.value = false;
+ return;
+ }
+
if (rowState.value !== 0) {
close();
return;
@@ -150,6 +156,12 @@ const SwipeableDeleteTouchable = ({
const panGesture = Gesture.Pan()
.activeOffsetX([-10, 10]) // More sensitive horizontal detection
.failOffsetY([-20, 20]) // Fail on vertical movement to distinguish scrolling
+ .onBegin(() => {
+ panActivated.value = false;
+ })
+ .onStart(() => {
+ panActivated.value = true;
+ })
.onUpdate(event => {
const newValue = event.translationX + rowOffSet.value;
@@ -191,7 +203,7 @@ const SwipeableDeleteTouchable = ({
onDeletePress={handleDeletePress}
testID={`${testID}-delete`}
/>
-
+
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
`;
@@ -817,7 +784,14 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
-
-
-
+
,
@@ -1176,7 +1140,14 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
-
-
-
+
,
@@ -1445,67 +1406,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/ThreadDetails.tsx b/app/containers/ThreadDetails.tsx
index 8eaa1e3a322..4c4a245764a 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/Touch.tsx b/app/containers/Touch.tsx
index ce3e0e16a29..6f3dd93db52 100644
--- a/app/containers/Touch.tsx
+++ b/app/containers/Touch.tsx
@@ -1,18 +1,25 @@
-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 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, isAndroid } from '../lib/methods/helpers/deviceInfo';
+import { useResponderLongPress } from '../lib/hooks/useResponderLongPress';
+import { isExternalKeyboardConnected } from '../lib/methods/helpers/externalInput';
-export interface ITouchProps extends RectButtonProps {
+export interface ITouchProps extends TouchableOpacityProps, TouchableHighlightProps {
children: ReactNode;
accessible?: boolean;
accessibilityLabel?: string;
@@ -21,17 +28,29 @@ export interface ITouchProps extends RectButtonProps {
onAccessibilityAction?: (event: AccessibilityActionEvent) => void;
testID?: string;
rectButtonStyle?: StyleProp;
- disabled?: boolean;
+ 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 KeyboardRectButton = withKeyboardFocus(RectButton);
+const Component = isIOS ? TouchableOpacity : TouchableHighlight;
+const KeyboardComponent = withKeyboardFocus(Component);
+const usingRNGHPressable = isAndroid && !isExternalKeyboardConnected();
+const RNGHComponent = RNNGHPressable as unknown as typeof KeyboardComponent;
-const Touch = forwardRef(
+const Touch = forwardRef(
(
{
children,
onPress,
- underlayColor,
+ android_rippleColor,
accessible,
accessibilityLabel,
accessibilityHint,
@@ -39,12 +58,19 @@ const Touch = forwardRef(
onAccessibilityAction,
style,
rectButtonStyle,
- disabled,
+ 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) || {};
@@ -75,29 +101,36 @@ const Touch = forwardRef(
marginStart,
marginTop
};
+ const rippleColor = android_rippleColor ?? colors.surfaceNeutral;
+ const touchableProps = isIOS
+ ? {}
+ : usingRNGHPressable
+ ? { android_ripple: { color: rippleColor } }
+ : { underlayColor: rippleColor };
+ const Wrapper = usingRNGHPressable ? RNGHComponent : KeyboardComponent;
+
return (
- }
onPress={onPress}
- activeOpacity={1}
- underlayColor={underlayColor || colors.surfaceNeutral}
- rippleColor={colors.surfaceNeutral}
- focusable={!disabled}
- canBeFocused={!disabled}
+ onLongPress={useResponder ? undefined : onLongPress}
+ accessible={process.env.RUNNING_E2E_TESTS === 'true' ? false : accessible}
+ accessibilityRole={props.accessibilityRole}
+ accessibilityLabel={accessibilityLabel}
+ accessibilityHint={accessibilityHint}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}
style={[rectButtonStyle, marginStyles, { backgroundColor, borderRadius }]}
+ {...touchableProps}
{...props}
- enabled={!disabled}>
-
+ disabled={!enabled}
+ focusable={enabled}
+ canBeFocused={enabled}>
+
{children}
-
+
);
}
);
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;
diff --git a/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap b/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
index b10f957869c..f44b446addd 100644
--- a/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
+++ b/app/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snap
@@ -6250,13 +6250,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 d883f3bfeaa..88cf22e93e1 100644
--- a/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap
+++ b/app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap
@@ -2003,13 +2003,27 @@ exports[`Story Snapshots: ModalContextsDividers should match snapshot 1`] = `
]
}
>
-
-
-
+
,
-
-
-
+
,
-
-
-
+
,
]
@@ -2548,60 +2521,51 @@ exports[`Story Snapshots: ModalDatePickerWithError should match snapshot 1`] = `
]
}
>
-
-
@@ -2671,7 +2635,7 @@ exports[`Story Snapshots: ModalDatePickerWithError should match snapshot 1`] = `
-
+
-
-
@@ -3075,7 +3030,7 @@ exports[`Story Snapshots: ModalFormInput should match snapshot 1`] = `
-
+
,
]
@@ -4333,60 +4288,51 @@ exports[`Story Snapshots: ModalMultiSelect should match snapshot 1`] = `
]
}
>
-
-
@@ -4461,7 +4407,7 @@ exports[`Story Snapshots: ModalMultiSelect should match snapshot 1`] = `
-
+
-
-
@@ -4640,61 +4577,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/Touchable/MessageTouchable.tsx b/app/containers/message/components/Touchable/MessageTouchable.tsx
index 6af0cd90ee1..e9f3144abfb 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';
@@ -58,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/Touchable/Touch.tsx b/app/containers/message/components/Touchable/Touch.tsx
deleted file mode 100644
index acdcb21917c..00000000000
--- a/app/containers/message/components/Touchable/Touch.tsx
+++ /dev/null
@@ -1,114 +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
- ) => {
- 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/components/User.tsx b/app/containers/message/components/User.tsx
index 693e7eab143..795bd0e298f 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 = () => {
const useRealName = useSetting('UI_Use_Real_Name') as boolean;
const navToRoomInfo = useNavToRoomInfo();
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) => (
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 674d94dd4b5..4c0ed875c21 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`]
]
}
>
-
-
-
+
@@ -53373,63 +52503,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -53970,63 +53090,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -54567,63 +53677,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -55164,63 +54264,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -56280,63 +55370,53 @@ exports[`Story Snapshots: FileAttachmentsWithFilenamesLargeFont should match sna
]
}
>
-
-
-
+
@@ -57045,63 +56125,53 @@ exports[`Story Snapshots: FullName should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -57516,63 +56586,53 @@ exports[`Story Snapshots: FullNameLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -57987,63 +57047,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -58445,63 +57495,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -59355,63 +58395,53 @@ exports[`Story Snapshots: GroupedMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -59826,63 +58856,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -60284,63 +59304,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61194,63 +60204,53 @@ exports[`Story Snapshots: GroupedMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61662,63 +60662,53 @@ exports[`Story Snapshots: Ignored should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -61991,63 +60981,53 @@ exports[`Story Snapshots: IgnoredLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -62323,63 +61303,53 @@ exports[`Story Snapshots: InlineKatex should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -62780,63 +61750,53 @@ exports[`Story Snapshots: InlineKatexLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -63229,63 +62189,53 @@ exports[`Story Snapshots: JitsiCall should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -63762,63 +62712,53 @@ exports[`Story Snapshots: JitsiCallLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -64303,63 +63243,53 @@ exports[`Story Snapshots: Katex should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -64728,63 +63658,53 @@ exports[`Story Snapshots: KatexArray should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -65153,63 +64073,53 @@ exports[`Story Snapshots: KatexArrayLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -65578,63 +64488,53 @@ exports[`Story Snapshots: KatexLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -66007,63 +64907,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -66645,63 +65535,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -67233,63 +66113,53 @@ exports[`Story Snapshots: Lists should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -68018,63 +66888,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -68656,63 +67516,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -69244,63 +68094,53 @@ exports[`Story Snapshots: ListsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70025,63 +68865,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70483,63 +69313,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -70978,63 +69798,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -71471,63 +70281,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -71879,63 +70679,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -72409,63 +71199,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -72898,63 +71678,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -73337,63 +72107,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -73916,63 +72676,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -74495,63 +73245,53 @@ exports[`Story Snapshots: LongNameUser should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -75173,63 +73913,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -75631,63 +74361,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -76126,63 +74846,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -76619,63 +75329,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -77027,63 +75727,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -77557,63 +76247,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -78046,63 +76726,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -78485,63 +77155,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -79064,63 +77724,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -79643,63 +78293,53 @@ exports[`Story Snapshots: LongNameUserLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -80321,63 +78961,53 @@ exports[`Story Snapshots: Mentions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -80958,63 +79588,53 @@ exports[`Story Snapshots: Mentions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -81590,63 +80210,53 @@ exports[`Story Snapshots: MentionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -82227,63 +80837,53 @@ exports[`Story Snapshots: MentionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -82859,63 +81459,53 @@ exports[`Story Snapshots: Message should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -83269,63 +81859,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -84022,63 +82602,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -84829,63 +83399,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -85648,63 +84208,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -86358,63 +84908,53 @@ exports[`Story Snapshots: MessageWithNestedReplyAndFile should match snapshot 1`
]
}
>
-
-
-
+
@@ -87260,63 +85800,53 @@ exports[`Story Snapshots: MessageWithReadReceipt should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -88006,63 +86536,53 @@ exports[`Story Snapshots: MessageWithReadReceipt should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -88765,63 +87285,53 @@ exports[`Story Snapshots: MessageWithReadReceiptLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -89511,63 +88021,53 @@ exports[`Story Snapshots: MessageWithReadReceiptLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -90270,63 +88770,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -90900,63 +89390,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -91837,63 +90317,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -92644,63 +91114,53 @@ exports[`Story Snapshots: MessageWithReply should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -93525,63 +91985,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -94142,63 +92592,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -94842,63 +93282,53 @@ exports[`Story Snapshots: MessageWithReplyAndFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -95623,63 +94053,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -96240,63 +94660,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -96940,63 +95350,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -97708,63 +96108,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -98527,63 +96917,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -99237,63 +97617,53 @@ exports[`Story Snapshots: MessageWithReplyAndFileLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -100139,63 +98509,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -100769,63 +99129,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -101443,63 +99793,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -102250,63 +100590,53 @@ exports[`Story Snapshots: MessageWithReplyLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -103132,63 +101462,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -103625,6 +101945,7 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
},
]
}
+ testID="thread-user-0"
>
0
@@ -103675,62 +101996,54 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104053,63 +102366,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104490,63 +102793,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -104927,63 +103220,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -105364,63 +103647,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -105801,63 +104074,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -106238,63 +104501,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -106675,63 +104928,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107112,63 +105355,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107549,63 +105782,53 @@ exports[`Story Snapshots: MessageWithThread should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -107886,63 +106109,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -108379,6 +106592,7 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
},
]
}
+ testID="thread-user-0"
>
0
@@ -108429,62 +106643,54 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -108807,63 +107013,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -109244,63 +107440,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -109681,63 +107867,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110118,63 +108294,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110555,63 +108721,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -110992,63 +109148,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -111429,63 +109575,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -111866,63 +110002,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -112303,63 +110429,53 @@ exports[`Story Snapshots: MessageWithThreadLargeFont should match snapshot 1`] =
]
}
>
-
-
-
+
@@ -112639,63 +110755,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -113011,63 +111117,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -113705,63 +111801,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -114077,63 +112163,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -114771,63 +112847,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -115143,63 +113209,53 @@ exports[`Story Snapshots: Names should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -115850,63 +113906,53 @@ exports[`Story Snapshots: Pinned should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -116607,63 +114653,53 @@ exports[`Story Snapshots: PinnedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -117364,63 +115400,53 @@ exports[`Story Snapshots: Reactions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -118366,63 +116392,53 @@ exports[`Story Snapshots: Reactions should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -119837,63 +117853,53 @@ exports[`Story Snapshots: ReactionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -120839,63 +118845,53 @@ exports[`Story Snapshots: ReactionsLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -122311,63 +120307,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -122804,6 +120790,7 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
},
]
}
+ testID="thread-user-0"
>
0
@@ -122854,62 +120841,54 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123115,63 +121094,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123435,63 +121404,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -123755,63 +121714,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButton should m
]
}
>
-
-
-
+
@@ -124092,63 +122041,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -124585,6 +122524,7 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
},
]
}
+ testID="thread-user-0"
>
0
@@ -124635,62 +122575,54 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -124896,63 +122828,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125216,63 +123138,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125536,63 +123448,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadButtonLargeFont
]
}
>
-
-
-
+
@@ -125986,63 +123888,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126306,63 +124198,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126626,63 +124508,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -126946,63 +124818,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReply should ma
]
}
>
-
-
-
+
@@ -127396,63 +125258,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -127716,63 +125568,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128036,63 +125878,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128356,63 +126188,53 @@ exports[`Story Snapshots: SequentialThreadMessagesFollowingThreadReplyLargeFont
]
}
>
-
-
-
+
@@ -128692,63 +126514,53 @@ exports[`Story Snapshots: ShowButtonAsAttachment should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -129223,63 +127035,53 @@ exports[`Story Snapshots: ShowButtonAsAttachment should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -129938,63 +127740,53 @@ exports[`Story Snapshots: ShowButtonAsAttachmentLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -130469,63 +128261,53 @@ exports[`Story Snapshots: ShowButtonAsAttachmentLargeFont should match snapshot
]
}
>
-
-
-
+
@@ -131184,63 +128966,53 @@ exports[`Story Snapshots: StaticAvatar should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -131655,63 +129427,53 @@ exports[`Story Snapshots: StaticAvatarLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132038,63 +129800,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132282,63 +130034,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132526,63 +130268,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -132773,63 +130505,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133017,63 +130739,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133261,63 +130973,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133505,63 +131207,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133749,63 +131441,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -133993,63 +131675,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134237,63 +131909,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134481,63 +132143,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134725,63 +132377,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -134969,63 +132611,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135213,63 +132845,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135457,63 +133079,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135701,63 +133313,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -135945,63 +133547,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136189,63 +133781,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136433,63 +134015,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136677,63 +134249,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -136921,63 +134483,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137165,63 +134717,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137409,63 +134951,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137653,63 +135185,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -137897,63 +135419,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138141,63 +135653,53 @@ exports[`Story Snapshots: SystemMessages should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138376,63 +135878,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138620,63 +136112,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -138864,63 +136346,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139111,63 +136583,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139355,63 +136817,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139599,63 +137051,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -139843,63 +137285,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140087,63 +137519,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140331,63 +137753,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140575,63 +137987,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -140819,63 +138221,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141063,63 +138455,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141307,63 +138689,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141551,63 +138923,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -141795,63 +139157,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142039,63 +139391,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142283,63 +139625,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142527,63 +139859,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -142771,63 +140093,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143015,63 +140327,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143259,63 +140561,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143503,63 +140795,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143747,63 +141029,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -143991,63 +141263,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144235,63 +141497,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144479,63 +141731,53 @@ exports[`Story Snapshots: SystemMessagesLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -144794,63 +142036,53 @@ exports[`Story Snapshots: Temp should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -145261,63 +142493,53 @@ exports[`Story Snapshots: TempLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -145736,63 +142958,53 @@ exports[`Story Snapshots: ThumbnailFromServer should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -146418,63 +143630,53 @@ exports[`Story Snapshots: ThumbnailFromServerLargeFont should match snapshot 1`]
]
}
>
-
-
-
+
@@ -147100,63 +144302,53 @@ exports[`Story Snapshots: TimeFormat should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -147571,63 +144763,53 @@ exports[`Story Snapshots: TimeFormatLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -148043,63 +145225,53 @@ exports[`Story Snapshots: Translated should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -148550,63 +145722,53 @@ exports[`Story Snapshots: TranslatedLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -149056,63 +146218,53 @@ exports[`Story Snapshots: TwoShortCustomFieldsWithMarkdown should match snapshot
]
}
>
-
-
-
+
@@ -150249,63 +147401,53 @@ exports[`Story Snapshots: TwoShortCustomFieldsWithMarkdownLargeFont should match
]
}
>
-
-
-
+
@@ -151442,63 +148584,53 @@ exports[`Story Snapshots: URL should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -152036,63 +149168,53 @@ exports[`Story Snapshots: URL should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -152913,63 +150035,53 @@ exports[`Story Snapshots: URLImagePreview should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -153409,63 +150521,53 @@ exports[`Story Snapshots: URLImagePreview should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -153861,63 +150963,53 @@ exports[`Story Snapshots: URLImagePreviewLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -154357,63 +151449,53 @@ exports[`Story Snapshots: URLImagePreviewLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -154809,63 +151891,53 @@ exports[`Story Snapshots: URLLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -155403,63 +152475,53 @@ exports[`Story Snapshots: URLLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -156280,63 +153342,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -156652,63 +153704,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -157346,63 +154388,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -157718,63 +154750,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -158412,63 +155434,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -158784,63 +155796,53 @@ exports[`Story Snapshots: Usernames should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -159491,63 +156493,53 @@ exports[`Story Snapshots: WithAlias should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -159968,63 +156960,53 @@ exports[`Story Snapshots: WithAlias should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -160458,63 +157440,53 @@ exports[`Story Snapshots: WithAliasLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -160935,63 +157907,53 @@ exports[`Story Snapshots: WithAliasLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -161425,63 +158387,53 @@ exports[`Story Snapshots: WithAudio should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -164331,63 +161283,53 @@ exports[`Story Snapshots: WithAudioLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -167227,63 +164169,53 @@ exports[`Story Snapshots: WithFile should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -168546,63 +165478,53 @@ exports[`Story Snapshots: WithFileLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -169623,63 +166545,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -170297,63 +167209,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -171460,63 +168362,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -172248,63 +169140,53 @@ exports[`Story Snapshots: WithImage should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -172922,63 +169804,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -173950,63 +170822,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -174738,63 +171600,53 @@ exports[`Story Snapshots: WithImageLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -175412,63 +172264,53 @@ exports[`Story Snapshots: WithVideo should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -176400,63 +173242,53 @@ exports[`Story Snapshots: WithVideo should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -177133,63 +173965,53 @@ exports[`Story Snapshots: WithVideoLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -177765,63 +174587,53 @@ exports[`Story Snapshots: WithVideoLargeFont should match snapshot 1`] = `
]
}
>
-
-
-
+
@@ -178298,63 +175110,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/lib/hooks/useResponderLongPress.test.ts b/app/lib/hooks/useResponderLongPress.test.ts
new file mode 100644
index 00000000000..85784aa521f
--- /dev/null
+++ b/app/lib/hooks/useResponderLongPress.test.ts
@@ -0,0 +1,107 @@
+import { renderHook } from '@testing-library/react-native';
+import { act } from 'react';
+
+import { useResponderLongPress } from './useResponderLongPress';
+
+const pressEvent = {} as never;
+
+describe('useResponderLongPress', () => {
+ 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/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`] = `
-
+
-
-
-
+
,
@@ -434,7 +431,14 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
-
-
+
,
@@ -749,7 +743,14 @@ exports[`Story Snapshots: Content should match snapshot 1`] = `
-
-
-
+
,
@@ -1069,7 +1060,14 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
-
-
-
+
,
@@ -1384,7 +1372,14 @@ exports[`Story Snapshots: SwipeActions should match snapshot 1`] = `
-
-
-
+
,
@@ -1704,7 +1689,14 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
-
-
-
+
,
@@ -2019,7 +2001,14 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = `
-
-
-
+
,
@@ -2334,7 +2313,14 @@ 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`] = `
-
+
}
showActionIndicator
/>
diff --git a/app/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snap b/app/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snap
index 0bc989b37bd..27cf299a8b8 100644
--- a/app/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snap
+++ b/app/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snap
@@ -24,60 +24,51 @@ exports[`Story Snapshots: Basic 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`] = `
]
}
>
-
-
-
+