diff --git a/suite-common/icons/assets/icons/wifiSlash.svg b/suite-common/icons/assets/icons/wifiSlash.svg new file mode 100644 index 00000000000..a63b66729f6 --- /dev/null +++ b/suite-common/icons/assets/icons/wifiSlash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/suite-common/icons/src/icons.ts b/suite-common/icons/src/icons.ts index d240103631e..2e46325ac5d 100644 --- a/suite-common/icons/src/icons.ts +++ b/suite-common/icons/src/icons.ts @@ -117,6 +117,7 @@ export const icons = { warningOctagon: require('../assets/icons/warningOctagon.svg'), warningTriangle: require('../assets/icons/warningTriangle.svg'), warningTriangleLight: require('../assets/icons/warningTriangleLight.svg'), + wifiSlash: require('../assets/icons/wifiSlash.svg'), } as const; export type IconName = keyof typeof icons; diff --git a/suite-native/app/e2e/utils.ts b/suite-native/app/e2e/utils.ts index b13578c8da6..952572c31ee 100644 --- a/suite-native/app/e2e/utils.ts +++ b/suite-native/app/e2e/utils.ts @@ -4,7 +4,7 @@ import { expect as detoxExpect } from 'detox'; const APP_LAUNCH_ARGS = { // Do not synchronize communication with the trezor bridge and metro server running on localhost. Since the trezor // bridge is exchanging messages with the app all the time, the test runner would wait forever otherwise. - detoxURLBlacklistRegex: '\\("^.*127.0.0.1.*",".*localhost.*"\\)', + detoxURLBlacklistRegex: '\\("^.*127.0.0.1.*",".*localhost.*","^*clients3\\.google\\.com*"\\)', }; const platform = device.getPlatform(); diff --git a/suite-native/app/package.json b/suite-native/app/package.json index 7aec7eb31a9..64586766b86 100644 --- a/suite-native/app/package.json +++ b/suite-native/app/package.json @@ -20,6 +20,7 @@ "reverse-ports": "adb reverse tcp:8081 tcp:8081 && adb reverse tcp:21325 tcp:21325 && adb reverse tcp:19121 tcp:19121" }, "dependencies": { + "@react-native-community/netinfo": "11.3.2", "@react-native/metro-config": "0.74.83", "@react-navigation/bottom-tabs": "6.5.20", "@react-navigation/native": "6.1.17", @@ -44,6 +45,7 @@ "@suite-native/biometrics": "workspace:*", "@suite-native/coin-enabling": "workspace:*", "@suite-native/config": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@suite-native/device": "workspace:*", "@suite-native/device-authorization": "workspace:*", "@suite-native/feature-flags": "workspace:*", diff --git a/suite-native/app/src/App.tsx b/suite-native/app/src/App.tsx index 0c812503b65..245b8f31342 100644 --- a/suite-native/app/src/App.tsx +++ b/suite-native/app/src/App.tsx @@ -10,6 +10,7 @@ import { selectIsAppReady, selectIsConnectInitialized, StoreProvider } from '@su import { FormatterProvider } from '@suite-common/formatters'; import { NavigationContainerWithAnalytics } from '@suite-native/navigation'; import { FeatureMessageScreen, MessageSystemBannerRenderer } from '@suite-native/message-system'; +import { OfflineBanner } from '@suite-native/connection-status'; import { IntlProvider } from '@suite-native/intl'; import { isDebugEnv } from '@suite-native/config'; @@ -57,6 +58,7 @@ const AppComponent = () => { return ( + diff --git a/suite-native/app/tsconfig.json b/suite-native/app/tsconfig.json index 88a7dd208d7..68e741f9ab9 100644 --- a/suite-native/app/tsconfig.json +++ b/suite-native/app/tsconfig.json @@ -34,6 +34,7 @@ { "path": "../biometrics" }, { "path": "../coin-enabling" }, { "path": "../config" }, + { "path": "../connection-status" }, { "path": "../device" }, { "path": "../device-authorization" }, { "path": "../feature-flags" }, diff --git a/suite-native/connection-status/package.json b/suite-native/connection-status/package.json new file mode 100644 index 00000000000..294518135d5 --- /dev/null +++ b/suite-native/connection-status/package.json @@ -0,0 +1,25 @@ +{ + "name": "@suite-native/connection-status", + "version": "1.0.0", + "private": true, + "license": "See LICENSE.md in repo root", + "sideEffects": false, + "main": "src/index", + "scripts": { + "lint:js": "yarn g:eslint '**/*.{ts,tsx,js}'", + "depcheck": "yarn g:depcheck", + "type-check": "yarn g:tsc --build" + }, + "dependencies": { + "@react-native-community/netinfo": "11.3.2", + "@suite-common/icons": "workspace:*", + "@suite-native/atoms": "workspace:*", + "@suite-native/intl": "workspace:*", + "@suite-native/settings": "workspace:*", + "@trezor/styles": "workspace:*", + "react": "18.2.0", + "react-native": "0.74.1", + "react-native-safe-area-context": "4.10.3", + "react-redux": "8.0.7" + } +} diff --git a/suite-native/connection-status/src/OfflineBanner.tsx b/suite-native/connection-status/src/OfflineBanner.tsx new file mode 100644 index 00000000000..1195f7163b9 --- /dev/null +++ b/suite-native/connection-status/src/OfflineBanner.tsx @@ -0,0 +1,45 @@ +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { View } from 'react-native'; + +import { Icon } from '@suite-common/icons'; +import { Text, HStack } from '@suite-native/atoms'; +import { Translation } from '@suite-native/intl'; +import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; + +import { useIsOfflineBannerVisible } from './useIsOfflineBannerVisible'; + +const containerStyle = prepareNativeStyle(utils => ({ + backgroundColor: utils.colors.backgroundAlertYellowBold, + alignItems: 'center', +})); + +const contentStyle = prepareNativeStyle<{ topSafeAreaInset: number }>( + (utils, { topSafeAreaInset }) => ({ + marginTop: topSafeAreaInset, + paddingTop: utils.spacings.small, + paddingBottom: 12, + alignItems: 'center', + }), +); + +export const OfflineBanner = () => { + const { applyStyle } = useNativeStyles(); + const { top: topSafeAreaInset } = useSafeAreaInsets(); + + const isOfflineBannerVisible = useIsOfflineBannerVisible(); + + if (!isOfflineBannerVisible) { + return null; + } + + return ( + + + + + + + + + ); +}; diff --git a/suite-native/connection-status/src/index.ts b/suite-native/connection-status/src/index.ts new file mode 100644 index 00000000000..50017fde040 --- /dev/null +++ b/suite-native/connection-status/src/index.ts @@ -0,0 +1,3 @@ +export * from './OfflineBanner'; +export * from './useOfflineBannerAwareSafeAreaInsets'; +export * from './useIsOfflineBannerVisible'; diff --git a/suite-native/connection-status/src/useIsOfflineBannerVisible.tsx b/suite-native/connection-status/src/useIsOfflineBannerVisible.tsx new file mode 100644 index 00000000000..6ffa3b0c296 --- /dev/null +++ b/suite-native/connection-status/src/useIsOfflineBannerVisible.tsx @@ -0,0 +1,12 @@ +import { useSelector } from 'react-redux'; + +import { useNetInfo } from '@react-native-community/netinfo'; + +import { selectIsOnboardingFinished } from '@suite-native/settings'; + +export const useIsOfflineBannerVisible = () => { + const isOnboardingFinished = useSelector(selectIsOnboardingFinished); + const { isConnected } = useNetInfo(); + + return !isConnected && isOnboardingFinished; +}; diff --git a/suite-native/connection-status/src/useOfflineBannerAwareSafeAreaInsets.tsx b/suite-native/connection-status/src/useOfflineBannerAwareSafeAreaInsets.tsx new file mode 100644 index 00000000000..7df454ceddd --- /dev/null +++ b/suite-native/connection-status/src/useOfflineBannerAwareSafeAreaInsets.tsx @@ -0,0 +1,12 @@ +import { EdgeInsets, useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { useIsOfflineBannerVisible } from './useIsOfflineBannerVisible'; + +// If offline banner is visible, return 0 for top inset, otherwise return the top inset from safe area insets +// this is because the offline banner is displayed on top of the screen and we don't want to add any top padding +export const useOfflineBannerAwareSafeAreaInsets = () => { + const { top, ...rest } = useSafeAreaInsets(); + const isOfflineBannerVisible = useIsOfflineBannerVisible(); + + return { top: isOfflineBannerVisible ? 0 : top, ...rest } as EdgeInsets; +}; diff --git a/suite-native/connection-status/tsconfig.json b/suite-native/connection-status/tsconfig.json new file mode 100644 index 00000000000..a9c499fee6b --- /dev/null +++ b/suite-native/connection-status/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { "outDir": "libDev" }, + "references": [ + { "path": "../../suite-common/icons" }, + { "path": "../atoms" }, + { "path": "../intl" }, + { "path": "../settings" }, + { "path": "../../packages/styles" } + ], + "include": [".", "**/*.json"] +} diff --git a/suite-native/intl/src/en.ts b/suite-native/intl/src/en.ts index e898b9e6c1a..91b986a253a 100644 --- a/suite-native/intl/src/en.ts +++ b/suite-native/intl/src/en.ts @@ -19,6 +19,7 @@ export const en = { unknownError: 'Something went wrong', default: 'Default', orSeparator: 'OR', + offline: "You're offline.", }, messageSystem: { killswitch: { diff --git a/suite-native/message-system/package.json b/suite-native/message-system/package.json index be5f630961f..6a7e39e3519 100644 --- a/suite-native/message-system/package.json +++ b/suite-native/message-system/package.json @@ -19,6 +19,7 @@ "@suite-common/suite-types": "workspace:*", "@suite-common/wallet-core": "workspace:*", "@suite-native/atoms": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@suite-native/intl": "workspace:*", "@suite-native/link": "workspace:*", "@trezor/styles": "workspace:*", @@ -26,7 +27,6 @@ "react": "18.2.0", "react-native": "0.74.1", "react-native-reanimated": "3.11.0", - "react-native-safe-area-context": "4.10.3", "react-redux": "8.0.7" } } diff --git a/suite-native/message-system/src/components/MessageSystemBannerRenderer.tsx b/suite-native/message-system/src/components/MessageSystemBannerRenderer.tsx index df264d0bb9d..a6142dca869 100644 --- a/suite-native/message-system/src/components/MessageSystemBannerRenderer.tsx +++ b/suite-native/message-system/src/components/MessageSystemBannerRenderer.tsx @@ -1,4 +1,3 @@ -import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSelector } from 'react-redux'; import { A } from '@mobily/ts-belt'; @@ -6,6 +5,7 @@ import { A } from '@mobily/ts-belt'; import { VStack } from '@suite-native/atoms'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; import { selectActiveBannerMessages } from '@suite-common/message-system'; +import { useOfflineBannerAwareSafeAreaInsets } from '@suite-native/connection-status'; import { MessageBanner } from './MessageBanner'; @@ -17,7 +17,7 @@ const messageBannerContainerStyle = prepareNativeStyle<{ topSafeAreaInset: numbe export const MessageSystemBannerRenderer = () => { const { applyStyle } = useNativeStyles(); - const { top: topSafeAreaInset } = useSafeAreaInsets(); + const { top: topSafeAreaInset } = useOfflineBannerAwareSafeAreaInsets(); const activeBannerMessages = useSelector(selectActiveBannerMessages); const topInset = A.isNotEmpty(activeBannerMessages) ? topSafeAreaInset : 0; diff --git a/suite-native/message-system/tsconfig.json b/suite-native/message-system/tsconfig.json index 7502a2ce774..c19532950a8 100644 --- a/suite-native/message-system/tsconfig.json +++ b/suite-native/message-system/tsconfig.json @@ -16,6 +16,7 @@ "path": "../../suite-common/wallet-core" }, { "path": "../atoms" }, + { "path": "../connection-status" }, { "path": "../intl" }, { "path": "../link" }, { "path": "../../packages/styles" }, diff --git a/suite-native/module-add-accounts/package.json b/suite-native/module-add-accounts/package.json index 29d70da728a..41fda06519f 100644 --- a/suite-native/module-add-accounts/package.json +++ b/suite-native/module-add-accounts/package.json @@ -22,6 +22,7 @@ "@suite-native/accounts": "workspace:*", "@suite-native/alerts": "workspace:*", "@suite-native/atoms": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@suite-native/discovery": "workspace:*", "@suite-native/intl": "workspace:*", "@suite-native/link": "workspace:*", diff --git a/suite-native/module-add-accounts/src/screens/SelectAccountTypeScreen.tsx b/suite-native/module-add-accounts/src/screens/SelectAccountTypeScreen.tsx index 23e4d92683b..9de8641adab 100644 --- a/suite-native/module-add-accounts/src/screens/SelectAccountTypeScreen.tsx +++ b/suite-native/module-add-accounts/src/screens/SelectAccountTypeScreen.tsx @@ -1,5 +1,4 @@ import { useState } from 'react'; -import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { View } from 'react-native'; import { LinearGradient } from 'expo-linear-gradient'; @@ -24,6 +23,7 @@ import { } from '@suite-native/atoms'; import { useTranslate, Translation, TxKeyPath } from '@suite-native/intl'; import { useOpenLink } from '@suite-native/link'; +import { useOfflineBannerAwareSafeAreaInsets } from '@suite-native/connection-status'; import { useAddCoinAccount, accountTypeTranslationKeys } from '../hooks/useAddCoinAccount'; @@ -89,7 +89,7 @@ export const SelectAccountTypeScreen = ({ const { accountType: defaultType, networkSymbol, flowType } = route.params; const { translate } = useTranslate(); const openLink = useOpenLink(); - const insets = useSafeAreaInsets(); + const insets = useOfflineBannerAwareSafeAreaInsets(); const { applyStyle, utils } = useNativeStyles(); const { getAvailableAccountTypesForNetworkSymbol, addCoinAccount } = useAddCoinAccount(); diff --git a/suite-native/module-add-accounts/tsconfig.json b/suite-native/module-add-accounts/tsconfig.json index 35e24b0ebbe..1c416f40bb4 100644 --- a/suite-native/module-add-accounts/tsconfig.json +++ b/suite-native/module-add-accounts/tsconfig.json @@ -17,6 +17,7 @@ { "path": "../accounts" }, { "path": "../alerts" }, { "path": "../atoms" }, + { "path": "../connection-status" }, { "path": "../discovery" }, { "path": "../intl" }, { "path": "../link" }, diff --git a/suite-native/navigation/package.json b/suite-native/navigation/package.json index d3ee5748669..ed50ca94e44 100644 --- a/suite-native/navigation/package.json +++ b/suite-native/navigation/package.json @@ -22,6 +22,7 @@ "@suite-common/wallet-types": "workspace:*", "@suite-native/analytics": "workspace:*", "@suite-native/atoms": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@trezor/connect": "workspace:*", "@trezor/styles": "workspace:*", "@trezor/theme": "workspace:*", diff --git a/suite-native/navigation/src/components/Screen.tsx b/suite-native/navigation/src/components/Screen.tsx index e1f957ec4b2..cd367000893 100644 --- a/suite-native/navigation/src/components/Screen.tsx +++ b/suite-native/navigation/src/components/Screen.tsx @@ -1,6 +1,6 @@ import { useEffect, useContext, ReactNode } from 'react'; import { Platform, ScrollViewProps, StatusBar, View } from 'react-native'; -import { useSafeAreaInsets, EdgeInsets } from 'react-native-safe-area-context'; +import { EdgeInsets } from 'react-native-safe-area-context'; import { useSelector } from 'react-redux'; import * as SystemUI from 'expo-system-ui'; @@ -8,6 +8,7 @@ import * as NavigationBar from 'expo-navigation-bar'; import { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs'; import { useRoute } from '@react-navigation/native'; +import { useOfflineBannerAwareSafeAreaInsets } from '@suite-native/connection-status'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; import { Color, nativeSpacings } from '@trezor/theme'; import { selectIsAnyBannerMessageActive } from '@suite-common/message-system'; @@ -114,7 +115,7 @@ export const Screen = ({ } = useNativeStyles(); const hasPaddingBottom = !useContext(BottomTabBarHeightContext) && hasBottomInset; - const insets = useSafeAreaInsets(); + const insets = useOfflineBannerAwareSafeAreaInsets(); const backgroundCSSColor = colors[backgroundColor]; const barStyle = isDarkColor(backgroundCSSColor) ? 'light-content' : 'dark-content'; diff --git a/suite-native/navigation/tsconfig.json b/suite-native/navigation/tsconfig.json index c7e21690cda..8e1861f35f7 100644 --- a/suite-native/navigation/tsconfig.json +++ b/suite-native/navigation/tsconfig.json @@ -14,6 +14,7 @@ }, { "path": "../analytics" }, { "path": "../atoms" }, + { "path": "../connection-status" }, { "path": "../../packages/connect" }, { "path": "../../packages/styles" }, { "path": "../../packages/theme" } diff --git a/suite-native/notifications/package.json b/suite-native/notifications/package.json index 174b8f5d394..37624de9360 100644 --- a/suite-native/notifications/package.json +++ b/suite-native/notifications/package.json @@ -18,6 +18,7 @@ "@suite-common/wallet-core": "workspace:*", "@suite-common/wallet-types": "workspace:*", "@suite-native/atoms": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@suite-native/formatters": "workspace:*", "@suite-native/navigation": "workspace:*", "@suite-native/theme": "workspace:*", @@ -27,7 +28,6 @@ "react-native": "0.74.1", "react-native-gesture-handler": "2.16.2", "react-native-reanimated": "3.11.0", - "react-native-safe-area-context": "4.10.3", "react-redux": "8.0.7" } } diff --git a/suite-native/notifications/src/components/NotificationRenderer.tsx b/suite-native/notifications/src/components/NotificationRenderer.tsx index 16de0e1615e..81fbebeee0a 100644 --- a/suite-native/notifications/src/components/NotificationRenderer.tsx +++ b/suite-native/notifications/src/components/NotificationRenderer.tsx @@ -1,9 +1,9 @@ -import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSelector } from 'react-redux'; import { Box, VStack } from '@suite-native/atoms'; import { selectOpenedTransactionNotifications } from '@suite-common/toast-notifications'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; +import { useOfflineBannerAwareSafeAreaInsets } from '@suite-native/connection-status'; import { TransactionNotification } from './TransactionNotification'; @@ -19,7 +19,7 @@ const notificationContainerStyle = prepareNativeStyle<{ topSafeAreaInset: number export const NotificationRenderer = () => { const { applyStyle } = useNativeStyles(); - const { top: topSafeAreaInset } = useSafeAreaInsets(); + const { top: topSafeAreaInset } = useOfflineBannerAwareSafeAreaInsets(); const transactionNotifications = useSelector(selectOpenedTransactionNotifications); return ( diff --git a/suite-native/notifications/tsconfig.json b/suite-native/notifications/tsconfig.json index 83013223027..c94347423d1 100644 --- a/suite-native/notifications/tsconfig.json +++ b/suite-native/notifications/tsconfig.json @@ -16,6 +16,7 @@ "path": "../../suite-common/wallet-types" }, { "path": "../atoms" }, + { "path": "../connection-status" }, { "path": "../formatters" }, { "path": "../navigation" }, { "path": "../theme" }, diff --git a/suite-native/toasts/package.json b/suite-native/toasts/package.json index 0e2d7ad97d8..e14e2b356e2 100644 --- a/suite-native/toasts/package.json +++ b/suite-native/toasts/package.json @@ -14,11 +14,11 @@ "@mobily/ts-belt": "^3.13.1", "@suite-common/icons": "workspace:*", "@suite-native/atoms": "workspace:*", + "@suite-native/connection-status": "workspace:*", "@trezor/styles": "workspace:*", "@trezor/theme": "workspace:*", "jotai": "1.9.1", "react": "18.2.0", - "react-native-reanimated": "3.11.0", - "react-native-safe-area-context": "4.10.3" + "react-native-reanimated": "3.11.0" } } diff --git a/suite-native/toasts/src/components/ToastRenderer.tsx b/suite-native/toasts/src/components/ToastRenderer.tsx index 8d364f9528f..e523d7afac5 100644 --- a/suite-native/toasts/src/components/ToastRenderer.tsx +++ b/suite-native/toasts/src/components/ToastRenderer.tsx @@ -1,7 +1,6 @@ -import { useSafeAreaInsets } from 'react-native-safe-area-context'; - import { useAtomValue } from 'jotai'; +import { useOfflineBannerAwareSafeAreaInsets } from '@suite-native/connection-status'; import { Box, VStack } from '@suite-native/atoms'; import { prepareNativeStyle, useNativeStyles } from '@trezor/styles'; @@ -20,7 +19,7 @@ const toastsContainerStyle = prepareNativeStyle<{ topSafeAreaInset: number }>( export const ToastRenderer = () => { const { applyStyle } = useNativeStyles(); - const { top: topSafeAreaInset } = useSafeAreaInsets(); + const { top: topSafeAreaInset } = useOfflineBannerAwareSafeAreaInsets(); const toasts = useAtomValue(toastsAtom); return ( diff --git a/suite-native/toasts/tsconfig.json b/suite-native/toasts/tsconfig.json index 274f237be2e..4b6ba356e1d 100644 --- a/suite-native/toasts/tsconfig.json +++ b/suite-native/toasts/tsconfig.json @@ -4,6 +4,7 @@ "references": [ { "path": "../../suite-common/icons" }, { "path": "../atoms" }, + { "path": "../connection-status" }, { "path": "../../packages/styles" }, { "path": "../../packages/theme" } ] diff --git a/tsconfig.json b/tsconfig.json index fe2ca52b767..b143697c148 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -50,6 +50,9 @@ { "path": "suite-native/blockchain" }, { "path": "suite-native/coin-enabling" }, { "path": "suite-native/config" }, + { + "path": "suite-native/connection-status" + }, { "path": "suite-native/device" }, { "path": "suite-native/device-authorization" diff --git a/yarn.lock b/yarn.lock index 0a193de2f14..83c71b68615 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6678,6 +6678,15 @@ __metadata: languageName: node linkType: hard +"@react-native-community/netinfo@npm:11.3.2": + version: 11.3.2 + resolution: "@react-native-community/netinfo@npm:11.3.2" + peerDependencies: + react-native: ">=0.59" + checksum: 10/5c4f754cf6ab4c065c98c9cf11c79aec04987d542b1d3ee3e6f19b96c1cb051717c44f79e405b92f0cfccbfc4d796a087fa36de14b46c6eca37526dce4dc4c4f + languageName: node + linkType: hard + "@react-native/assets-registry@npm:0.74.83, @react-native/assets-registry@npm:~0.74.83": version: 0.74.83 resolution: "@react-native/assets-registry@npm:0.74.83" @@ -9112,6 +9121,7 @@ __metadata: "@babel/core": "npm:^7.20.0" "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" "@config-plugins/detox": "npm:^7.0.0" + "@react-native-community/netinfo": "npm:11.3.2" "@react-native/babel-preset": "npm:^0.74.83" "@react-native/metro-config": "npm:0.74.83" "@react-navigation/bottom-tabs": "npm:6.5.20" @@ -9137,6 +9147,7 @@ __metadata: "@suite-native/biometrics": "workspace:*" "@suite-native/coin-enabling": "workspace:*" "@suite-native/config": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@suite-native/device": "workspace:*" "@suite-native/device-authorization": "workspace:*" "@suite-native/feature-flags": "workspace:*" @@ -9318,6 +9329,23 @@ __metadata: languageName: unknown linkType: soft +"@suite-native/connection-status@workspace:*, @suite-native/connection-status@workspace:suite-native/connection-status": + version: 0.0.0-use.local + resolution: "@suite-native/connection-status@workspace:suite-native/connection-status" + dependencies: + "@react-native-community/netinfo": "npm:11.3.2" + "@suite-common/icons": "workspace:*" + "@suite-native/atoms": "workspace:*" + "@suite-native/intl": "workspace:*" + "@suite-native/settings": "workspace:*" + "@trezor/styles": "workspace:*" + react: "npm:18.2.0" + react-native: "npm:0.74.1" + react-native-safe-area-context: "npm:4.10.3" + react-redux: "npm:8.0.7" + languageName: unknown + linkType: soft + "@suite-native/device-authorization@workspace:*, @suite-native/device-authorization@workspace:suite-native/device-authorization": version: 0.0.0-use.local resolution: "@suite-native/device-authorization@workspace:suite-native/device-authorization" @@ -9583,6 +9611,7 @@ __metadata: "@suite-common/suite-types": "workspace:*" "@suite-common/wallet-core": "workspace:*" "@suite-native/atoms": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@suite-native/intl": "workspace:*" "@suite-native/link": "workspace:*" "@trezor/styles": "workspace:*" @@ -9590,7 +9619,6 @@ __metadata: react: "npm:18.2.0" react-native: "npm:0.74.1" react-native-reanimated: "npm:3.11.0" - react-native-safe-area-context: "npm:4.10.3" react-redux: "npm:8.0.7" languageName: unknown linkType: soft @@ -9693,6 +9721,7 @@ __metadata: "@suite-native/accounts": "workspace:*" "@suite-native/alerts": "workspace:*" "@suite-native/atoms": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@suite-native/discovery": "workspace:*" "@suite-native/intl": "workspace:*" "@suite-native/link": "workspace:*" @@ -9929,6 +9958,7 @@ __metadata: "@suite-common/wallet-types": "workspace:*" "@suite-native/analytics": "workspace:*" "@suite-native/atoms": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@trezor/connect": "workspace:*" "@trezor/styles": "workspace:*" "@trezor/theme": "workspace:*" @@ -9953,6 +9983,7 @@ __metadata: "@suite-common/wallet-core": "workspace:*" "@suite-common/wallet-types": "workspace:*" "@suite-native/atoms": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@suite-native/formatters": "workspace:*" "@suite-native/navigation": "workspace:*" "@suite-native/theme": "workspace:*" @@ -9962,7 +9993,6 @@ __metadata: react-native: "npm:0.74.1" react-native-gesture-handler: "npm:2.16.2" react-native-reanimated: "npm:3.11.0" - react-native-safe-area-context: "npm:4.10.3" react-redux: "npm:8.0.7" languageName: unknown linkType: soft @@ -10140,12 +10170,12 @@ __metadata: "@mobily/ts-belt": "npm:^3.13.1" "@suite-common/icons": "workspace:*" "@suite-native/atoms": "workspace:*" + "@suite-native/connection-status": "workspace:*" "@trezor/styles": "workspace:*" "@trezor/theme": "workspace:*" jotai: "npm:1.9.1" react: "npm:18.2.0" react-native-reanimated: "npm:3.11.0" - react-native-safe-area-context: "npm:4.10.3" languageName: unknown linkType: soft