From 5004fa12ddc0ea9263c8f1b12fe5a301d9dbf044 Mon Sep 17 00:00:00 2001 From: yanas Date: Mon, 10 Feb 2025 10:55:56 +0100 Subject: [PATCH] fix(suite-native): use react-native-keyboard-controller for keyboard handling --- .../mobile-dependencies.txt | 2 +- suite-native/app/package.json | 2 +- suite-native/app/src/App.tsx | 17 +++++----- .../components/AccountImportSummaryScreen.tsx | 11 +++---- .../src/screens/XpubScanScreen.tsx | 10 ++---- .../PassphraseContentScreenWrapper.tsx | 7 ++--- .../PassphraseEnterOnTrezorScreen.tsx | 1 + .../passphrase/PassphraseFormScreen.tsx | 31 ++++++++++--------- .../PassphraseVerifyEmptyWalletScreen.tsx | 27 +++++++++------- .../module-send/src/components/SendScreen.tsx | 15 --------- .../src/screens/SendAccountsScreen.tsx | 9 ++---- .../src/screens/SendAddressReviewScreen.tsx | 8 ++--- .../SendDestinationTagReviewScreen.tsx | 8 ++--- .../src/screens/SendFeesScreen.tsx | 9 +++--- .../src/screens/SendOutputsReviewScreen.tsx | 8 ++--- .../src/screens/SendOutputsScreen.tsx | 8 ++--- suite-native/navigation/package.json | 2 +- .../navigation/src/components/Screen.tsx | 27 ++++++++++++++-- .../src/components/ScreenContentWrapper.tsx | 13 ++------ suite-native/test-utils/package.json | 1 + suite-native/test-utils/src/expoMock.js | 4 +++ yarn.lock | 31 ++++++++++--------- 22 files changed, 129 insertions(+), 122 deletions(-) delete mode 100644 suite-native/module-send/src/components/SendScreen.tsx diff --git a/scripts/list-outdated-dependencies/mobile-dependencies.txt b/scripts/list-outdated-dependencies/mobile-dependencies.txt index 9790db953fa..db2f584deba 100644 --- a/scripts/list-outdated-dependencies/mobile-dependencies.txt +++ b/scripts/list-outdated-dependencies/mobile-dependencies.txt @@ -53,7 +53,7 @@ expo-updates jotai lottie-react-native react-native-gesture-handler -react-native-keyboard-aware-scroll-view +react-native-keyboard-controller react-native-mmkv react-native-quick-crypto react-native-restart diff --git a/suite-native/app/package.json b/suite-native/app/package.json index 8587b3f44f7..7af50c3a428 100644 --- a/suite-native/app/package.json +++ b/suite-native/app/package.json @@ -112,7 +112,7 @@ "react-native": "0.76.1", "react-native-edge-to-edge": "^1.3.1", "react-native-gesture-handler": "^2.21.0", - "react-native-keyboard-aware-scroll-view": "0.9.5", + "react-native-keyboard-controller": "1.16.2", "react-native-mmkv": "2.12.2", "react-native-quick-crypto": "^0.7.6", "react-native-reanimated": "^3.16.7", diff --git a/suite-native/app/src/App.tsx b/suite-native/app/src/App.tsx index 586800cf360..7cfd9cc7f89 100644 --- a/suite-native/app/src/App.tsx +++ b/suite-native/app/src/App.tsx @@ -1,5 +1,6 @@ import { useEffect } from 'react'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { KeyboardProvider } from 'react-native-keyboard-controller'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { useDispatch, useSelector } from 'react-redux'; @@ -80,13 +81,15 @@ const PureApp = () => ( - - - - - - - + + + + + + + + + diff --git a/suite-native/module-accounts-import/src/components/AccountImportSummaryScreen.tsx b/suite-native/module-accounts-import/src/components/AccountImportSummaryScreen.tsx index f456125d8ff..8bc631c24c5 100644 --- a/suite-native/module-accounts-import/src/components/AccountImportSummaryScreen.tsx +++ b/suite-native/module-accounts-import/src/components/AccountImportSummaryScreen.tsx @@ -1,8 +1,7 @@ import { ReactNode } from 'react'; -import { KeyboardAvoidingView, Platform } from 'react-native'; import { Box, PictogramTitleHeader, VStack } from '@suite-native/atoms'; -import { Screen, ScreenFooterGradient } from '@suite-native/navigation'; +import { KeyboardAvoidingScreen, ScreenFooterGradient } from '@suite-native/navigation'; import { AccountImportScreenHeader } from './AccountImportScreenHeader'; @@ -21,13 +20,13 @@ export const AccountImportSummaryScreen = ({ footer, testID, }: AccountImportSummaryScreenProps) => ( - } footer={ - + <> {footer} - + } > @@ -43,5 +42,5 @@ export const AccountImportSummaryScreen = ({ {children} - + ); diff --git a/suite-native/module-accounts-import/src/screens/XpubScanScreen.tsx b/suite-native/module-accounts-import/src/screens/XpubScanScreen.tsx index aa3115b1f27..c97aad80d94 100644 --- a/suite-native/module-accounts-import/src/screens/XpubScanScreen.tsx +++ b/suite-native/module-accounts-import/src/screens/XpubScanScreen.tsx @@ -22,7 +22,7 @@ import { Translation, useTranslate } from '@suite-native/intl'; import { AccountsImportStackParamList, AccountsImportStackRoutes, - Screen, + KeyboardAvoidingScreen, StackProps, } from '@suite-native/navigation'; import { ScanQRBottomSheet } from '@suite-native/qr-code'; @@ -36,9 +36,6 @@ import { XpubImportSection, networkTypeToTitleMap } from '../components/XpubImpo const FORM_BUTTON_FADE_IN_DURATION = 200; -// Extra padding needed to make multiline xpub input form visible even with the sticky footer. -const EXTRA_KEYBOARD_AVOIDING_VIEW_HEIGHT = 350; - const cameraStyle = prepareNativeStyle(_ => ({ alignItems: 'center', marginTop: 20, @@ -173,10 +170,9 @@ export const XpubScanScreen = ({ }; return ( - } footer={} - extraKeyboardAvoidingViewHeight={EXTRA_KEYBOARD_AVOIDING_VIEW_HEIGHT} > @@ -232,6 +228,6 @@ export const XpubScanScreen = ({ onCodeScanned={handleBarCodeScanned} onClose={handleToggleScanner} /> - + ); }; diff --git a/suite-native/module-authorize-device/src/components/passphrase/PassphraseContentScreenWrapper.tsx b/suite-native/module-authorize-device/src/components/passphrase/PassphraseContentScreenWrapper.tsx index 9bf9b233df2..a167e8d1136 100644 --- a/suite-native/module-authorize-device/src/components/passphrase/PassphraseContentScreenWrapper.tsx +++ b/suite-native/module-authorize-device/src/components/passphrase/PassphraseContentScreenWrapper.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import { Text, VStack } from '@suite-native/atoms'; +import { TitleHeader, VStack } from '@suite-native/atoms'; import { Screen } from '@suite-native/navigation'; import { PassphraseScreenHeader } from './PassphraseScreenHeader'; @@ -18,10 +18,7 @@ export const PassphraseContentScreenWrapper = ({ }: PassphraseContentScreenWrapperProps) => ( }> - - {title} - {subtitle && {subtitle}} - + {children} diff --git a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseEnterOnTrezorScreen.tsx b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseEnterOnTrezorScreen.tsx index eb08135f737..13082b716f4 100644 --- a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseEnterOnTrezorScreen.tsx +++ b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseEnterOnTrezorScreen.tsx @@ -78,6 +78,7 @@ export const PassphraseEnterOnTrezorScreen = () => { }; return ( + // TODO: Use just Screen } subtitle={ diff --git a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseFormScreen.tsx b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseFormScreen.tsx index 0f688ebe13c..a86e4743a78 100644 --- a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseFormScreen.tsx +++ b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseFormScreen.tsx @@ -2,14 +2,15 @@ import { LayoutChangeEvent, View } from 'react-native'; import Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'; import { EventType, analytics } from '@suite-native/analytics'; -import { Box, Button, HStack, Text, VStack } from '@suite-native/atoms'; +import { Box, Button, HStack, Text, TitleHeader, VStack } from '@suite-native/atoms'; import { Icon } from '@suite-native/icons'; import { Translation, useTranslate } from '@suite-native/intl'; import { useOpenLink } from '@suite-native/link'; +import { KeyboardAvoidingScreen } from '@suite-native/navigation'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; -import { PassphraseContentScreenWrapper } from '../../components/passphrase/PassphraseContentScreenWrapper'; import { PassphraseForm } from '../../components/passphrase/PassphraseForm'; +import { PassphraseScreenHeader } from '../../components/passphrase/PassphraseScreenHeader'; const ANIMATION_DURATION = 300; @@ -70,18 +71,20 @@ export const PassphraseFormScreen = () => { }; return ( - } - subtitle={ - {chunks}, - }} + }> + + } + subtitle={ + {chunks}, + }} + /> + } + titleVariant="titleMedium" /> - } - > - @@ -158,6 +161,6 @@ export const PassphraseFormScreen = () => { inputLabel={translate('modulePassphrase.form.createWalletInputLabel')} /> - + ); }; diff --git a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseVerifyEmptyWalletScreen.tsx b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseVerifyEmptyWalletScreen.tsx index b21969338e4..bb4e36c0bd5 100644 --- a/suite-native/module-authorize-device/src/screens/passphrase/PassphraseVerifyEmptyWalletScreen.tsx +++ b/suite-native/module-authorize-device/src/screens/passphrase/PassphraseVerifyEmptyWalletScreen.tsx @@ -4,15 +4,16 @@ import { useDispatch } from 'react-redux'; import { isFulfilled } from '@reduxjs/toolkit'; import { EventType, analytics } from '@suite-native/analytics'; -import { AlertBox, Text, VStack } from '@suite-native/atoms'; +import { AlertBox, Text, TitleHeader, VStack } from '@suite-native/atoms'; import { finishPassphraseFlow, verifyPassphraseOnEmptyWalletThunk, } from '@suite-native/device-authorization'; import { Translation, useTranslate } from '@suite-native/intl'; +import { KeyboardAvoidingScreen } from '@suite-native/navigation'; -import { PassphraseContentScreenWrapper } from '../../components/passphrase/PassphraseContentScreenWrapper'; import { PassphraseForm } from '../../components/passphrase/PassphraseForm'; +import { PassphraseScreenHeader } from '../../components/passphrase/PassphraseScreenHeader'; export const PassphraseVerifyEmptyWalletScreen = () => { const dispatch = useDispatch(); @@ -34,15 +35,17 @@ export const PassphraseVerifyEmptyWalletScreen = () => { }, [dispatch]); return ( - - } - subtitle={ - - } - > - + }> + + + } + subtitle={ + + } + titleVariant="titleMedium" + /> { inputLabel={translate('modulePassphrase.form.verifyPassphraseInputLabel')} /> - + ); }; diff --git a/suite-native/module-send/src/components/SendScreen.tsx b/suite-native/module-send/src/components/SendScreen.tsx deleted file mode 100644 index 42e99c2108f..00000000000 --- a/suite-native/module-send/src/components/SendScreen.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ReactNode } from 'react'; - -import { Screen } from '@suite-native/navigation'; - -type SendScreenProps = { - children: ReactNode; - screenHeader: ReactNode; - footer?: ReactNode; -}; - -export const SendScreen = ({ children, footer, screenHeader }: SendScreenProps) => ( - - {children} - -); diff --git a/suite-native/module-send/src/screens/SendAccountsScreen.tsx b/suite-native/module-send/src/screens/SendAccountsScreen.tsx index bade258a3cc..e9431768821 100644 --- a/suite-native/module-send/src/screens/SendAccountsScreen.tsx +++ b/suite-native/module-send/src/screens/SendAccountsScreen.tsx @@ -1,14 +1,13 @@ import { AccountsList, OnSelectAccount } from '@suite-native/accounts'; import { useTranslate } from '@suite-native/intl'; import { + Screen, ScreenHeader, SendStackParamList, SendStackRoutes, StackProps, } from '@suite-native/navigation'; -import { SendScreen } from '../components/SendScreen'; - // TODO: So far we do not want enable send form for any other networkS than Bitcoin-like coins. // This filter will be removed in a follow up PR. const BITCOIN_LIKE_FILTER = 'bitcoin'; @@ -25,15 +24,13 @@ export const SendAccountsScreen = ({ // TODO: move text content to @suite-native/intl package when is copy ready return ( - } - > + }> {/* TODO: Enable filtering same as receive screen account list has. */} - + ); }; diff --git a/suite-native/module-send/src/screens/SendAddressReviewScreen.tsx b/suite-native/module-send/src/screens/SendAddressReviewScreen.tsx index 20ccd999040..3e8e9af94ac 100644 --- a/suite-native/module-send/src/screens/SendAddressReviewScreen.tsx +++ b/suite-native/module-send/src/screens/SendAddressReviewScreen.tsx @@ -5,6 +5,7 @@ import { AccountsRootState, DeviceRootState, SendRootState } from '@suite-common import { Box, Text, VStack } from '@suite-native/atoms'; import { Translation, useTranslate } from '@suite-native/intl'; import { + Screen, ScreenHeader, SendStackParamList, SendStackRoutes, @@ -13,7 +14,6 @@ import { import { AddressReviewStepList } from '../components/AddressReviewStepList'; import { SendConfirmOnDeviceImage } from '../components/SendConfirmOnDeviceImage'; -import { SendScreen } from '../components/SendScreen'; import { selectIsReceiveAddressOutputConfirmed, selectIsTransactionReviewInProgress, @@ -43,8 +43,8 @@ export const SendAddressReviewScreen = ({ }, [isAddressConfirmed, accountKey, navigation, tokenContract]); return ( - - + ); }; diff --git a/suite-native/module-send/src/screens/SendDestinationTagReviewScreen.tsx b/suite-native/module-send/src/screens/SendDestinationTagReviewScreen.tsx index 834475aadeb..be2e5191fc4 100644 --- a/suite-native/module-send/src/screens/SendDestinationTagReviewScreen.tsx +++ b/suite-native/module-send/src/screens/SendDestinationTagReviewScreen.tsx @@ -7,6 +7,7 @@ import { AccountsRootState, DeviceRootState, SendRootState } from '@suite-common import { Text, VStack } from '@suite-native/atoms'; import { Translation, useTranslate } from '@suite-native/intl'; import { + Screen, ScreenHeader, SendStackParamList, SendStackRoutes, @@ -15,7 +16,6 @@ import { import { ReviewDestinationTagCard } from '../components/ReviewDestinationTagCard'; import { SendConfirmOnDeviceImage } from '../components/SendConfirmOnDeviceImage'; -import { SendScreen } from '../components/SendScreen'; import { useHandleOnDeviceTransactionReview } from '../hooks/useHandleOnDeviceTransactionReview'; import { selectIsDestinationTagOutputConfirmed, @@ -65,8 +65,8 @@ export const SendDestinationTagReviewScreen = ({ }, [isDestinationTagConfirmed, accountKey, navigation, tokenContract, transaction]); return ( - - + ); }; diff --git a/suite-native/module-send/src/screens/SendFeesScreen.tsx b/suite-native/module-send/src/screens/SendFeesScreen.tsx index dedf53a0456..f3f54450f29 100644 --- a/suite-native/module-send/src/screens/SendFeesScreen.tsx +++ b/suite-native/module-send/src/screens/SendFeesScreen.tsx @@ -1,11 +1,10 @@ import { useSelector } from 'react-redux'; import { AccountsRootState, selectAccountByKey } from '@suite-common/wallet-core'; -import { SendStackParamList, SendStackRoutes, StackProps } from '@suite-native/navigation'; +import { Screen, SendStackParamList, SendStackRoutes, StackProps } from '@suite-native/navigation'; import { AccountBalanceScreenHeader } from '../components/AccountBalanceScreenHeader'; import { SendFeesForm } from '../components/SendFeesForm'; -import { SendScreen } from '../components/SendScreen'; export const SendFeesScreen = ({ route: { params }, @@ -18,12 +17,12 @@ export const SendFeesScreen = ({ if (!account) return; return ( - } > - + ); }; diff --git a/suite-native/module-send/src/screens/SendOutputsReviewScreen.tsx b/suite-native/module-send/src/screens/SendOutputsReviewScreen.tsx index c9ec16b1130..9c62a57535e 100644 --- a/suite-native/module-send/src/screens/SendOutputsReviewScreen.tsx +++ b/suite-native/module-send/src/screens/SendOutputsReviewScreen.tsx @@ -8,6 +8,7 @@ import { useTranslate } from '@suite-native/intl'; import { RootStackParamList, RootStackRoutes, + Screen, ScreenHeader, SendStackParamList, SendStackRoutes, @@ -17,7 +18,6 @@ import { import { OutputsReviewFooter } from '../components/OutputsReviewFooter'; import { ReviewOutputItemList } from '../components/ReviewOutputItemList'; -import { SendScreen } from '../components/SendScreen'; import { useShowReviewCancellationAlert } from '../hooks/useShowReviewCancellationAlert'; import { cleanupSendFormThunk } from '../sendFormThunks'; @@ -59,8 +59,8 @@ export const SendOutputsReviewScreen = ({ }); return ( - - + ); }; diff --git a/suite-native/module-send/src/screens/SendOutputsScreen.tsx b/suite-native/module-send/src/screens/SendOutputsScreen.tsx index 918e86bf18b..99d02796daa 100644 --- a/suite-native/module-send/src/screens/SendOutputsScreen.tsx +++ b/suite-native/module-send/src/screens/SendOutputsScreen.tsx @@ -26,6 +26,7 @@ import { Box, Button } from '@suite-native/atoms'; import { Form, useForm } from '@suite-native/forms'; import { Translation } from '@suite-native/intl'; import { + KeyboardAvoidingScreen, ScreenFooterGradient, SendStackParamList, SendStackRoutes, @@ -38,7 +39,6 @@ import { useDebounce } from '@trezor/react-utils'; import { AccountBalanceScreenHeader } from '../components/AccountBalanceScreenHeader'; import { SendOutputFields } from '../components/SendOutputFields'; -import { SendScreen } from '../components/SendScreen'; import { useSubscribeForSolanaBlockUpdates } from '../hooks/useSubscribeForSolanaBlockUpdates'; import { storeFeeLevels } from '../sendFormSlice'; import { calculateFeeLevelsMaxAmountThunk } from '../sendFormThunks'; @@ -263,8 +263,8 @@ export const SendOutputsScreen = ({ }); return ( - } footer={ @@ -291,6 +291,6 @@ export const SendOutputsScreen = ({ - + ); }; diff --git a/suite-native/navigation/package.json b/suite-native/navigation/package.json index f974d87943f..13d62243c91 100644 --- a/suite-native/navigation/package.json +++ b/suite-native/navigation/package.json @@ -33,7 +33,7 @@ "react": "18.2.0", "react-native": "0.76.1", "react-native-edge-to-edge": "^1.3.1", - "react-native-keyboard-aware-scroll-view": "0.9.5", + "react-native-keyboard-controller": "1.16.2", "react-native-reanimated": "^3.16.7", "react-native-safe-area-context": "^4.14.0", "react-redux": "8.0.7" diff --git a/suite-native/navigation/src/components/Screen.tsx b/suite-native/navigation/src/components/Screen.tsx index 8fea49e18c7..85c103e1378 100644 --- a/suite-native/navigation/src/components/Screen.tsx +++ b/suite-native/navigation/src/components/Screen.tsx @@ -1,6 +1,7 @@ import { ReactNode, useContext } from 'react'; import { ScrollViewProps, View } from 'react-native'; import { SystemBars } from 'react-native-edge-to-edge'; +import { KeyboardAvoidingView } from 'react-native-keyboard-controller'; import { EdgeInsets } from 'react-native-safe-area-context'; import { useSelector } from 'react-redux'; @@ -97,7 +98,6 @@ export const Screen = ({ backgroundColor = 'backgroundSurfaceElevation0', noHorizontalPadding = false, noBottomPadding = false, - extraKeyboardAvoidingViewHeight = 0, hasBottomInset = true, }: ScreenProps) => { const { @@ -131,7 +131,6 @@ export const Screen = ({ @@ -150,3 +149,27 @@ export const Screen = ({ ); }; + +const keyboardAvoidingScreenStyle = prepareNativeStyle(_ => ({ + flex: 1, +})); + +export const KeyboardAvoidingScreen = ({ + children, + keyboardDismissMode = 'on-drag', + ...rest +}: ScreenProps) => { + const { applyStyle, utils } = useNativeStyles(); + + return ( + + + {children} + + + ); +}; diff --git a/suite-native/navigation/src/components/ScreenContentWrapper.tsx b/suite-native/navigation/src/components/ScreenContentWrapper.tsx index 3dc16e2e703..018db66d65b 100644 --- a/suite-native/navigation/src/components/ScreenContentWrapper.tsx +++ b/suite-native/navigation/src/components/ScreenContentWrapper.tsx @@ -1,6 +1,5 @@ import React, { ReactNode, useRef } from 'react'; import { ScrollView, ScrollViewProps } from 'react-native'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; @@ -11,7 +10,6 @@ type ScreenContentProps = { children: ReactNode; isScrollable: boolean; hasHeader: boolean; - extraKeyboardAvoidingViewHeight: number; refreshControl?: ScrollViewProps['refreshControl']; keyboardDismissMode?: ScrollViewProps['keyboardDismissMode']; }; @@ -22,7 +20,6 @@ export const ScreenContentWrapper = ({ children, isScrollable, hasHeader, - extraKeyboardAvoidingViewHeight, refreshControl, keyboardDismissMode, }: ScreenContentProps) => { @@ -34,15 +31,11 @@ export const ScreenContentWrapper = ({ return isScrollable ? ( <> {scrollDivider} - { - // Assign the ref of inner ScrollView. - scrollViewRef.current = ref as unknown as ScrollView; - }} + {children} - + ) : ( <>{children} diff --git a/suite-native/test-utils/package.json b/suite-native/test-utils/package.json index c8086b6df3a..ce551b208b7 100644 --- a/suite-native/test-utils/package.json +++ b/suite-native/test-utils/package.json @@ -17,6 +17,7 @@ "@trezor/styles": "workspace:*", "@trezor/theme": "workspace:*", "react": "18.2.0", + "react-native-keyboard-controller": "1.16.2", "react-native-safe-area-context": "^4.14.0", "react-redux": "8.0.7" } diff --git a/suite-native/test-utils/src/expoMock.js b/suite-native/test-utils/src/expoMock.js index 00b5785d979..2ec798cea2c 100644 --- a/suite-native/test-utils/src/expoMock.js +++ b/suite-native/test-utils/src/expoMock.js @@ -407,3 +407,7 @@ jest.mock('expo-constants', () => { jest.mock('redux-devtools-expo-dev-plugin', () => () => next => next); jest.mock('react-native-safe-area-context', () => mockSafeAreaContext); + +jest.mock('react-native-keyboard-controller', () => + require('react-native-keyboard-controller/jest'), +); diff --git a/yarn.lock b/yarn.lock index 69378db16e6..af6621ea4f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10531,7 +10531,7 @@ __metadata: react-native: "npm:0.76.1" react-native-edge-to-edge: "npm:^1.3.1" react-native-gesture-handler: "npm:^2.21.0" - react-native-keyboard-aware-scroll-view: "npm:0.9.5" + react-native-keyboard-controller: "npm:1.16.2" react-native-mmkv: "npm:2.12.2" react-native-quick-crypto: "npm:^0.7.6" react-native-reanimated: "npm:^3.16.7" @@ -11467,7 +11467,7 @@ __metadata: react: "npm:18.2.0" react-native: "npm:0.76.1" react-native-edge-to-edge: "npm:^1.3.1" - react-native-keyboard-aware-scroll-view: "npm:0.9.5" + react-native-keyboard-controller: "npm:1.16.2" react-native-reanimated: "npm:^3.16.7" react-native-safe-area-context: "npm:^4.14.0" react-redux: "npm:8.0.7" @@ -11673,6 +11673,7 @@ __metadata: "@trezor/styles": "workspace:*" "@trezor/theme": "workspace:*" react: "npm:18.2.0" + react-native-keyboard-controller: "npm:1.16.2" react-native-safe-area-context: "npm:^4.14.0" react-redux: "npm:8.0.7" languageName: unknown @@ -36852,24 +36853,26 @@ __metadata: languageName: node linkType: hard -"react-native-iphone-x-helper@npm:^1.0.3": - version: 1.3.1 - resolution: "react-native-iphone-x-helper@npm:1.3.1" +"react-native-is-edge-to-edge@npm:^1.1.6": + version: 1.1.6 + resolution: "react-native-is-edge-to-edge@npm:1.1.6" peerDependencies: - react-native: ">=0.42.0" - checksum: 10/024376646009a966e33e12fc2358751830818b0fb73b1c601a64eb5e490d2dc43eec23668991b985a8c412a84d087f20eb45bb9b593567c08b66e741b7bddda5 + react: ">=18.2.0" + react-native: ">=0.73.0" + checksum: 10/4e07c1e34c01c8d50fd7c1d0460db06f6f0515197405230386a8ffb950cb724b10743af032310d1384df0a90059bfb8992ba2d93344ce86315315f0493feccc2 languageName: node linkType: hard -"react-native-keyboard-aware-scroll-view@npm:0.9.5": - version: 0.9.5 - resolution: "react-native-keyboard-aware-scroll-view@npm:0.9.5" +"react-native-keyboard-controller@npm:1.16.2": + version: 1.16.2 + resolution: "react-native-keyboard-controller@npm:1.16.2" dependencies: - prop-types: "npm:^15.6.2" - react-native-iphone-x-helper: "npm:^1.0.3" + react-native-is-edge-to-edge: "npm:^1.1.6" peerDependencies: - react-native: ">=0.48.4" - checksum: 10/95d8ed8a46426b16e819713495d64766a3eed5d63a03fb4feca0351cce55d74197f75d8b01dd3f2c491cda29c155bb71c8063d2fba23e8a0044208aad03d0d91 + react: "*" + react-native: "*" + react-native-reanimated: ">=3.0.0" + checksum: 10/8e017d079755c098e2960e63f5d077060aaa40b31f979ef043483af143c51897f3fe9ff1a1ca7f04a6ebedc9b29a0cd3b76d635b26c865e0056f626893e0739a languageName: node linkType: hard