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`] = ` ] } > - - - +