Шторка выезжает снизу на пружине и останавливается на одном из упоров — долей высоты экрана. Её можно тянуть за ручку или за содержимое, когда оно прокручено к началу: после отпускания она доводится до ближайшего упора с учётом скорости жеста, выше верхнего упора сопротивляется, а резкое смахивание вниз закрывает её. Тап по затемнению, кнопка «Назад» на Android и Escape в вебе тоже закрывают шторку.
Оберните экран в DetentDrawerProvider: с fixed шторка рисуется поверх всей страницы, а с scaleBackground страница позади отступает и слегка уменьшается по мере открытия. Жесты и пружины работают на UI-потоке, при «Уменьшении движения» шторка просто проявляется без пружины. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install react-native-reanimated react-native-gesture-handlerpnpm add react-native-reanimated react-native-gesture-handleryarn add react-native-reanimated react-native-gesture-handlerbun add react-native-reanimated react-native-gesture-handlerСкопируйте эти файлы в src/shared/components/organisms/detent-drawer/:
Код доступен по подпискеPro
Исходник «Шторка с упорами» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Шторка с упорами» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Упоры detents — доли высоты контейнера, initialDetent — индекс упора, на котором шторка открывается.
openТип boolean
onCloseТип () => void
detents?Тип readonly number[]
initialDetent?Тип number
onProgress?Тип (progress: number) => void
fixed?Тип boolean
scaleBackground?Тип boolean
radius?Тип number
maxWidth?Тип number
children?Тип ReactNode
style?Тип StyleProp<ViewStyle>
label?Тип string