diff --git a/app/jest.config.cjs b/app/jest.config.cjs index a7d19eb81b..0295df82ab 100644 --- a/app/jest.config.cjs +++ b/app/jest.config.cjs @@ -42,8 +42,6 @@ module.exports = { '/../packages/mobile-sdk-alpha/dist/cjs/index.cjs', '^@selfxyz/mobile-sdk-alpha/components$': '/../packages/mobile-sdk-alpha/dist/cjs/components/index.cjs', - '^@selfxyz/mobile-sdk-alpha/hooks$': - '/../packages/mobile-sdk-alpha/dist/cjs/hooks/index.cjs', '^@selfxyz/mobile-sdk-alpha/onboarding/(.*)$': '/../packages/mobile-sdk-alpha/dist/cjs/flows/onboarding/$1.cjs', '^@selfxyz/mobile-sdk-alpha/disclosing/(.*)$': diff --git a/app/src/screens/dev/DevSettingsScreen.tsx b/app/src/screens/dev/DevSettingsScreen.tsx index d40e48c4f4..cae5815aea 100644 --- a/app/src/screens/dev/DevSettingsScreen.tsx +++ b/app/src/screens/dev/DevSettingsScreen.tsx @@ -16,6 +16,7 @@ import { Button, Sheet, Text, XStack, YStack } from 'tamagui'; import { useNavigation } from '@react-navigation/native'; import type { NativeStackScreenProps } from '@react-navigation/native-stack'; import { Check, ChevronDown, ChevronRight } from '@tamagui/lucide-icons'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { red500, @@ -30,7 +31,6 @@ import { yellow500, } from '@selfxyz/mobile-sdk-alpha/constants/colors'; import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts'; -import { useSafeBottomPadding } from '@selfxyz/mobile-sdk-alpha/hooks'; import BugIcon from '@/assets/icons/bug_icon.svg'; import IdIcon from '@/assets/icons/id_icon.svg'; @@ -298,7 +298,8 @@ const DevSettingsScreen: React.FC = ({}) => { const setLoggingSeverity = useSettingStore(state => state.setLoggingSeverity); const [hasNotificationPermission, setHasNotificationPermission] = useState(false); - const paddingBottom = useSafeBottomPadding(20); + const { bottom } = useSafeAreaInsets(); + const paddingBottom = bottom + 20; // Check notification permissions on mount useEffect(() => { diff --git a/app/src/screens/documents/aadhaar/AadhaarUploadErrorScreen.tsx b/app/src/screens/documents/aadhaar/AadhaarUploadErrorScreen.tsx index 35e8d1726c..99d5be09c5 100644 --- a/app/src/screens/documents/aadhaar/AadhaarUploadErrorScreen.tsx +++ b/app/src/screens/documents/aadhaar/AadhaarUploadErrorScreen.tsx @@ -6,6 +6,7 @@ import React from 'react'; import { XStack, YStack } from 'tamagui'; import type { RouteProp } from '@react-navigation/native'; import { useNavigation, useRoute } from '@react-navigation/native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSelfClient } from '@selfxyz/mobile-sdk-alpha'; import { BodyText, PrimaryButton } from '@selfxyz/mobile-sdk-alpha/components'; @@ -17,7 +18,6 @@ import { slate500, white, } from '@selfxyz/mobile-sdk-alpha/constants/colors'; -import { useSafeBottomPadding } from '@selfxyz/mobile-sdk-alpha/hooks'; import { getErrorMessages } from '@selfxyz/mobile-sdk-alpha/onboarding/import-aadhaar'; import WarningIcon from '@/assets/images/warning.svg'; @@ -33,7 +33,8 @@ type AadhaarUploadErrorRoute = RouteProp< >; const AadhaarUploadErrorScreen: React.FC = () => { - const paddingBottom = useSafeBottomPadding(extraYPadding + 35); + const { bottom } = useSafeAreaInsets(); + const paddingBottom = bottom + extraYPadding + 35; const navigation = useNavigation(); const route = useRoute(); const { trackEvent } = useSelfClient(); diff --git a/app/src/screens/documents/aadhaar/AadhaarUploadScreen.tsx b/app/src/screens/documents/aadhaar/AadhaarUploadScreen.tsx index d624ac2b8d..7addbacc2d 100644 --- a/app/src/screens/documents/aadhaar/AadhaarUploadScreen.tsx +++ b/app/src/screens/documents/aadhaar/AadhaarUploadScreen.tsx @@ -8,6 +8,7 @@ import { Linking } from 'react-native'; import { Image, XStack, YStack } from 'tamagui'; import { useNavigation } from '@react-navigation/native'; import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSelfClient } from '@selfxyz/mobile-sdk-alpha'; import { BodyText, PrimaryButton } from '@selfxyz/mobile-sdk-alpha/components'; @@ -19,7 +20,6 @@ import { slate500, white, } from '@selfxyz/mobile-sdk-alpha/constants/colors'; -import { useSafeBottomPadding } from '@selfxyz/mobile-sdk-alpha/hooks'; import { useAadhaar } from '@selfxyz/mobile-sdk-alpha/onboarding/import-aadhaar'; import AadhaarImage from '@/assets/images/512w.png'; @@ -32,7 +32,8 @@ import type { RootStackParamList } from '@/navigation'; import { extraYPadding } from '@/utils/styleUtils'; const AadhaarUploadScreen: React.FC = () => { - const paddingBottom = useSafeBottomPadding(extraYPadding + 50); + const { bottom } = useSafeAreaInsets(); + const paddingBottom = bottom + extraYPadding + 50; const navigation = useNavigation>(); diff --git a/app/src/screens/documents/aadhaar/AadhaarUploadedSuccessScreen.tsx b/app/src/screens/documents/aadhaar/AadhaarUploadedSuccessScreen.tsx index de9856b837..43433d93a3 100644 --- a/app/src/screens/documents/aadhaar/AadhaarUploadedSuccessScreen.tsx +++ b/app/src/screens/documents/aadhaar/AadhaarUploadedSuccessScreen.tsx @@ -6,6 +6,7 @@ import React from 'react'; import { YStack } from 'tamagui'; import { useNavigation } from '@react-navigation/native'; import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSelfClient } from '@selfxyz/mobile-sdk-alpha'; import { BodyText, PrimaryButton } from '@selfxyz/mobile-sdk-alpha/components'; @@ -17,14 +18,14 @@ import { slate500, white, } from '@selfxyz/mobile-sdk-alpha/constants/colors'; -import { useSafeBottomPadding } from '@selfxyz/mobile-sdk-alpha/hooks'; import BlueCheckIcon from '@/assets/images/blue_check.svg'; import type { RootStackParamList } from '@/navigation'; import { extraYPadding } from '@/utils/styleUtils'; const AadhaarUploadedSuccessScreen: React.FC = () => { - const paddingBottom = useSafeBottomPadding(extraYPadding + 35); + const { bottom } = useSafeAreaInsets(); + const paddingBottom = bottom + extraYPadding + 35; const navigation = useNavigation>(); const { trackEvent } = useSelfClient(); diff --git a/app/src/screens/home/HomeScreen.tsx b/app/src/screens/home/HomeScreen.tsx index 151da5f55b..e31d83ce8c 100644 --- a/app/src/screens/home/HomeScreen.tsx +++ b/app/src/screens/home/HomeScreen.tsx @@ -19,6 +19,7 @@ import { useRoute, } from '@react-navigation/native'; import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import type { DocumentCatalog, IDDocument } from '@selfxyz/common/utils/types'; import type { DocumentMetadata } from '@selfxyz/mobile-sdk-alpha'; @@ -34,7 +35,6 @@ import { slate300, } from '@selfxyz/mobile-sdk-alpha/constants/colors'; import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts'; -import { useSafeBottomPadding } from '@selfxyz/mobile-sdk-alpha/hooks'; import LogoInversed from '@/assets/images/logo_inversed.svg'; import UnverifiedHumanImage from '@/assets/images/unverified_human.png'; @@ -155,7 +155,8 @@ const HomeScreen: React.FC = () => { }, [documentCatalog]); // Calculate bottom padding to prevent button bleeding into system navigation - const bottomPadding = useSafeBottomPadding(20); + const { bottom } = useSafeAreaInsets(); + const bottomPadding = bottom + 20; // Create a stable reference to avoid hook dependency issues const onEarnPointsPressRef = useRef< diff --git a/packages/mobile-sdk-alpha/package.json b/packages/mobile-sdk-alpha/package.json index 2262c33016..f59bd7b3ef 100644 --- a/packages/mobile-sdk-alpha/package.json +++ b/packages/mobile-sdk-alpha/package.json @@ -69,18 +69,6 @@ "import": "./dist/esm/components/index.js", "require": "./dist/cjs/components/index.cjs" }, - "./hooks": { - "types": "./dist/esm/hooks/index.d.ts", - "react-native": "./dist/esm/hooks/index.js", - "import": "./dist/esm/hooks/index.js", - "require": "./dist/cjs/hooks/index.cjs" - }, - "./hooks/useSafeBottomPadding": { - "types": "./dist/esm/hooks/useSafeBottomPadding.d.ts", - "react-native": "./dist/esm/hooks/useSafeBottomPadding.js", - "import": "./dist/esm/hooks/useSafeBottomPadding.js", - "require": "./dist/cjs/hooks/useSafeBottomPadding.cjs" - }, "./utils/utils": { "types": "./dist/esm/utils/utils.d.ts", "react-native": "./dist/esm/utils/utils.js", @@ -195,6 +183,7 @@ "react-native-blur-effect": "^1.1.3", "react-native-haptic-feedback": "*", "react-native-localize": "*", + "react-native-safe-area-context": "^5.6.1", "react-native-svg": "*", "react-native-webview": "^13.16.0" }, diff --git a/packages/mobile-sdk-alpha/src/flows/onboarding/confirm-identification.tsx b/packages/mobile-sdk-alpha/src/flows/onboarding/confirm-identification.tsx index ca181efadf..c4f01687ca 100644 --- a/packages/mobile-sdk-alpha/src/flows/onboarding/confirm-identification.tsx +++ b/packages/mobile-sdk-alpha/src/flows/onboarding/confirm-identification.tsx @@ -4,6 +4,7 @@ import { useCallback, useEffect } from 'react'; import { StyleSheet } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import type { DocumentCategory } from '@selfxyz/common/utils/types'; @@ -17,7 +18,6 @@ import { black, white } from '../../constants/colors'; import { useSelfClient } from '../../context'; import { loadSelectedDocument } from '../../documents/utils'; import { notificationSuccess } from '../../haptic'; -import { useSafeBottomPadding } from '../../hooks/useSafeBottomPadding'; import { ExpandableBottomLayout } from '../../layouts/ExpandableBottomLayout'; import { SdkEvents } from '../../types/events'; import type { SelfClient } from '../../types/public'; @@ -41,7 +41,8 @@ export const ConfirmIdentificationScreen = ({ onBeforeConfirm }: { onBeforeConfi // Calculate bottom padding to prevent button bleeding into system navigation // ExpandableBottomLayout.BottomSection handles safe areas internally - const paddingBottom = useSafeBottomPadding(20); + const { bottom } = useSafeAreaInsets(); + const paddingBottom = bottom + 20; return ( diff --git a/packages/mobile-sdk-alpha/src/hooks/index.ts b/packages/mobile-sdk-alpha/src/hooks/index.ts deleted file mode 100644 index e81b2b0b2c..0000000000 --- a/packages/mobile-sdk-alpha/src/hooks/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc. -// SPDX-License-Identifier: BUSL-1.1 -// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. - -export { useSafeBottomPadding } from './useSafeBottomPadding'; diff --git a/packages/mobile-sdk-alpha/src/hooks/useSafeBottomPadding.ts b/packages/mobile-sdk-alpha/src/hooks/useSafeBottomPadding.ts deleted file mode 100644 index b37b884914..0000000000 --- a/packages/mobile-sdk-alpha/src/hooks/useSafeBottomPadding.ts +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc. -// SPDX-License-Identifier: BUSL-1.1 -// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. - -import { useMemo } from 'react'; -import { Dimensions } from 'react-native'; - -/** - * Custom hook to calculate bottom padding that prevents UI elements from bleeding - * into the system navigation area on smaller screens. - * - * This hook uses screen height detection to add extra padding for smaller screens - * (< 900px height) to account for system navigation bars and safe areas. - * - * @param basePadding - Base padding to add (default: 20) - * @returns Total bottom padding value - * - * @example - * ```tsx - * // For use with ExpandableBottomLayout.BottomSection - * const bottomPadding = useSafeBottomPadding(20); - * - * ``` - * - */ -export const useSafeBottomPadding = (basePadding: number = 20): number => { - const { height: windowHeight } = Dimensions.get('window'); - - return useMemo(() => { - const isSmallScreen = windowHeight < 900; - const fallbackPadding = isSmallScreen ? 50 : 0; - return basePadding + fallbackPadding; - }, [windowHeight, basePadding]); -}; diff --git a/packages/mobile-sdk-alpha/tsup.config.ts b/packages/mobile-sdk-alpha/tsup.config.ts index 60b7c5effc..a050846079 100644 --- a/packages/mobile-sdk-alpha/tsup.config.ts +++ b/packages/mobile-sdk-alpha/tsup.config.ts @@ -41,8 +41,6 @@ const entry = { 'constants/colors': 'src/constants/colors.ts', 'constants/fonts': 'src/constants/fonts.ts', 'components/index': 'src/components/index.ts', - 'hooks/index': 'src/hooks/index.ts', - 'hooks/useSafeBottomPadding': 'src/hooks/useSafeBottomPadding.ts', stores: 'src/stores/index.ts', 'utils/utils': 'src/utils/utils.ts', ...flowEntries, @@ -78,6 +76,7 @@ export default defineConfig([ 'lottie-react-native', 'react-native-haptic-feedback', 'react-native-localize', + 'react-native-safe-area-context', // SVG files should be handled by React Native's SVG transformer /\.svg$/, ], @@ -129,6 +128,7 @@ export default defineConfig([ 'lottie-react-native', 'react-native-haptic-feedback', 'react-native-localize', + 'react-native-safe-area-context', // SVG files should be handled by React Native's SVG transformer /\.svg$/, ],