From c101bb0c3b950ba26e31d89c82290c8a4cf43064 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kubaczkowski Date: Wed, 21 Jan 2026 15:15:53 +0100 Subject: [PATCH 1/7] feat: persistent bottom sheet --- example/src/App.tsx | 6 + example/src/bottom-sheet.d.ts | 1 + example/src/screens/HomeScreen.tsx | 10 +- example/src/sheets/ScannerNestedSheets.tsx | 79 +++++++++ example/src/sheets/ScannerSheet.tsx | 189 +++++++++++++++++++++ example/src/sheets/index.ts | 1 + src/BottomSheetBackdrop.tsx | 23 ++- src/BottomSheetHost.tsx | 79 ++++++--- src/BottomSheetManaged.tsx | 21 ++- src/BottomSheetPersistent.tsx | 70 ++++++++ src/bottomSheet.store.ts | 124 +++++++++++--- src/bottomSheetCoordinator.ts | 18 +- src/index.tsx | 1 + src/useBottomSheetControl.ts | 10 +- 14 files changed, 564 insertions(+), 68 deletions(-) create mode 100644 example/src/sheets/ScannerNestedSheets.tsx create mode 100644 example/src/sheets/ScannerSheet.tsx create mode 100644 src/BottomSheetPersistent.tsx diff --git a/example/src/App.tsx b/example/src/App.tsx index 4e3205f..925aae4 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,6 +1,7 @@ import { BottomSheetHost, BottomSheetManagerProvider, + BottomSheetPersistent, BottomSheetScaleView, } from 'react-native-bottom-sheet-stack'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; @@ -8,6 +9,7 @@ import { SafeAreaProvider } from 'react-native-safe-area-context'; import { UserProvider } from './context/UserContext'; import { HomeScreen } from './screens'; +import { ScannerSheet } from './sheets'; import { sharedStyles } from './styles/theme'; export default function App() { @@ -24,6 +26,10 @@ export default function App() { + {/* Persistent sheet - always mounted, opens instantly */} + + + diff --git a/example/src/bottom-sheet.d.ts b/example/src/bottom-sheet.d.ts index 8342bfd..cbbd7bc 100644 --- a/example/src/bottom-sheet.d.ts +++ b/example/src/bottom-sheet.d.ts @@ -7,5 +7,6 @@ declare module 'react-native-bottom-sheet-stack' { }; 'portal-mode-sheet-a': true; 'portal-mode-sheet-b': true; + 'scanner-sheet': true; } } diff --git a/example/src/screens/HomeScreen.tsx b/example/src/screens/HomeScreen.tsx index bd2175f..c62ceef 100644 --- a/example/src/screens/HomeScreen.tsx +++ b/example/src/screens/HomeScreen.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, ScrollView, Text, View } from 'react-native'; +import { ScrollView, StyleSheet, Text, View } from 'react-native'; import { BottomSheetPortal, useBottomSheetControl, @@ -23,6 +23,7 @@ export function HomeScreen() { const { openBottomSheet } = useBottomSheetManager(); const portalSheetControl = useBottomSheetControl('context-portal-sheet'); const portalModeSheetA = useBottomSheetControl('portal-mode-sheet-a'); + const scannerControl = useBottomSheetControl('scanner-sheet'); return ( @@ -112,6 +113,13 @@ export function HomeScreen() { openBottomSheet(, { scaleBackground: true }) } /> + + scannerControl.open({ scaleBackground: true })} + /> {/* Features */} diff --git a/example/src/sheets/ScannerNestedSheets.tsx b/example/src/sheets/ScannerNestedSheets.tsx new file mode 100644 index 0000000..a942e7b --- /dev/null +++ b/example/src/sheets/ScannerNestedSheets.tsx @@ -0,0 +1,79 @@ +import type { BottomSheetMethods } from '@gorhom/bottom-sheet/lib/typescript/types'; +import { forwardRef } from 'react'; +import { Text, View } from 'react-native'; +import { + useBottomSheetManager, + useBottomSheetState, +} from 'react-native-bottom-sheet-stack'; + +import { Badge, Button, SecondaryButton, Sheet } from '../components'; +import { colors, sharedStyles } from '../styles/theme'; + +export const ScannerNestedSheet2 = forwardRef((_, ref) => { + const { close } = useBottomSheetState(); + + const mockHistory = [ + { id: 'QR-A1B2C3D4', date: '2 min ago' }, + { id: 'QR-E5F6G7H8', date: '15 min ago' }, + { id: 'QR-I9J0K1L2', date: '1 hour ago' }, + ]; + + return ( + + + Scan History + Recent scans from this session: + + {mockHistory.map((item) => ( + + + {item.id} + + {item.date} + + ))} + + +