From 44df83c9fbd054733f348a08d10f91af5a2ec1b6 Mon Sep 17 00:00:00 2001 From: Adrian Castro <22133246+castdrian@users.noreply.github.com> Date: Sun, 24 Mar 2024 21:24:33 +0100 Subject: [PATCH] fix: use native modals on iOS & respect safe area --- apps/expo/package.json | 1 + apps/expo/src/app/_layout.tsx | 5 ++ .../src/components/player/settings/Sheet.tsx | 49 ++++++++++--------- pnpm-lock.yaml | 13 +++++ 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/apps/expo/package.json b/apps/expo/package.json index 36c848f..88fa75c 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -62,6 +62,7 @@ "react-native-change-icon": "^5.0.0", "react-native-context-menu-view": "^1.14.1", "react-native-gesture-handler": "~2.14.1", + "react-native-ios-modal": "^0.1.8", "react-native-modal": "^13.0.1", "react-native-quick-base64": "^2.0.8", "react-native-quick-crypto": "^0.6.1", diff --git a/apps/expo/src/app/_layout.tsx b/apps/expo/src/app/_layout.tsx index 6c1029d..0c2c658 100644 --- a/apps/expo/src/app/_layout.tsx +++ b/apps/expo/src/app/_layout.tsx @@ -1,10 +1,13 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { useEffect } from "react"; import { GestureHandlerRootView } from "react-native-gesture-handler"; +// @ts-expect-error - No exported types +import { ModalView } from "react-native-ios-modal"; import { useFonts } from "expo-font"; import { SplashScreen, Stack } from "expo-router"; import FontAwesome from "@expo/vector-icons/FontAwesome"; import { DarkTheme, ThemeProvider } from "@react-navigation/native"; +import { setupNativeSheet } from "@tamagui/sheet"; import { ToastProvider, ToastViewport } from "@tamagui/toast"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { TamaguiProvider, Theme, useTheme } from "tamagui"; @@ -20,6 +23,8 @@ export { ErrorBoundary, } from "expo-router"; +setupNativeSheet("ios", ModalView); + export const unstable_settings = { // Ensure that reloading on `/modal` keeps a back button present. initialRouteName: "(tabs)", diff --git a/apps/expo/src/components/player/settings/Sheet.tsx b/apps/expo/src/components/player/settings/Sheet.tsx index d5a87af..9e0ad30 100644 --- a/apps/expo/src/components/player/settings/Sheet.tsx +++ b/apps/expo/src/components/player/settings/Sheet.tsx @@ -1,5 +1,5 @@ import type { SheetProps, ViewProps } from "tamagui"; -import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { ScrollView, Separator, @@ -22,6 +22,7 @@ function SettingsSheet(props: SheetProps) { snapPoints={[90]} dismissOnSnapToBottom modal + native animation="spring" {...props} > @@ -52,27 +53,29 @@ function SettingsSheetFrame({ children: React.ReactNode; isLoading?: boolean; }) { + const insets = useSafeAreaInsets(); + return ( - - - - {isLoading && ( - - )} - {!isLoading && children} - - - + + + {isLoading && ( + + )} + {!isLoading && children} + + ); } @@ -85,9 +88,11 @@ function SettingsHeader({ title: string; rightButton?: React.ReactNode; }) { + const insets = useSafeAreaInsets(); + return ( <> - + {icon} {title} {rightButton} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ec185f..925b630 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,6 +158,9 @@ importers: react-native-gesture-handler: specifier: ~2.14.1 version: 2.14.1(react-native@0.73.6)(react@18.2.0) + react-native-ios-modal: + specifier: ^0.1.8 + version: 0.1.8(react-native@0.73.6)(react@18.2.0) react-native-modal: specifier: ^13.0.1 version: 13.0.1(react-native@0.73.6)(react@18.2.0) @@ -11538,6 +11541,16 @@ packages: react-native: 0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) dev: false + /react-native-ios-modal@0.1.8(react-native@0.73.6)(react@18.2.0): + resolution: {integrity: sha512-kA068hIhI9+r21OnRXzkRevGjGYTVAYf5kzsIFI15IrCiAkR40dE2lqJtOpnrB3lZ9KZeS0ph59qNNpDSG7xpA==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 18.2.0 + react-native: 0.73.6(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) + dev: false + /react-native-modal@13.0.1(react-native@0.73.6)(react@18.2.0): resolution: {integrity: sha512-UB+mjmUtf+miaG/sDhOikRfBOv0gJdBU2ZE1HtFWp6UixW9jCk/bhGdHUgmZljbPpp0RaO/6YiMmQSSK3kkMaw==} peerDependencies: