@lodev09/react-native-true-sheet 4.0.0-beta.0 → 4.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +42 -31
- package/RNTrueSheet.podspec +10 -2
- package/android/build.gradle +2 -1
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +174 -49
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerViewManager.kt +7 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt +371 -18
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetContentViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterView.kt +150 -21
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetFooterViewManager.kt +14 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderView.kt +38 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetHeaderViewManager.kt +28 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +84 -24
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPackage.kt +5 -4
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekView.kt +72 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetPeekViewManager.kt +33 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetStateUpdater.kt +45 -0
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +526 -231
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +1217 -603
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +136 -29
- package/android/src/main/java/com/lodev09/truesheet/core/RNScreensEventObserver.kt +63 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetBehavior.kt +36 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetBottomSheetView.kt +255 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt +303 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDetentCalculator.kt +277 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDimView.kt +162 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +180 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetKeyboardObserver.kt +207 -0
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetStackManager.kt +220 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +112 -0
- package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/KeyboardUtils.kt +84 -0
- package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +93 -67
- package/android/src/main/java/com/lodev09/truesheet/utils/ViewUtils.kt +30 -0
- package/android/src/main/jni/CMakeLists.txt +63 -0
- package/android/src/main/jni/TrueSheetSpec.h +19 -0
- package/android/src/main/jni/TrueSheetStateUpdater.cpp +96 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp +43 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h +37 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h +24 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.cpp +56 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.cpp +11 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h +41 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.cpp +18 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetInsets.h +16 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h +28 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +61 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.h +45 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.cpp +23 -0
- package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewState.h +52 -0
- package/ios/TrueSheetContainerView.h +81 -6
- package/ios/TrueSheetContainerView.mm +275 -21
- package/ios/TrueSheetContentView.h +38 -1
- package/ios/TrueSheetContentView.mm +413 -43
- package/ios/TrueSheetFooterView.h +27 -2
- package/ios/TrueSheetFooterView.mm +141 -35
- package/ios/{events/OnDidDismissEvent.h → TrueSheetHeaderView.h} +10 -7
- package/ios/TrueSheetHeaderView.mm +64 -0
- package/ios/TrueSheetModule.mm +92 -5
- package/ios/TrueSheetPeekView.h +32 -0
- package/ios/TrueSheetPeekView.mm +99 -0
- package/ios/TrueSheetView.h +7 -15
- package/ios/TrueSheetView.mm +633 -215
- package/ios/TrueSheetViewController.h +84 -16
- package/ios/TrueSheetViewController.mm +1136 -333
- package/ios/core/RNScreensEventObserver.h +46 -0
- package/ios/core/RNScreensEventObserver.mm +280 -0
- package/ios/core/TrueSheetBlurView.h +27 -0
- package/ios/core/TrueSheetBlurView.mm +82 -0
- package/ios/core/TrueSheetDetentCalculator.h +107 -0
- package/ios/core/TrueSheetDetentCalculator.mm +197 -0
- package/ios/core/TrueSheetGrabberView.h +72 -0
- package/ios/core/TrueSheetGrabberView.mm +178 -0
- package/ios/core/TrueSheetKeyboardObserver.h +39 -0
- package/ios/core/TrueSheetKeyboardObserver.mm +112 -0
- package/ios/events/TrueSheetDragEvents.h +39 -0
- package/ios/events/TrueSheetDragEvents.mm +62 -0
- package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
- package/ios/events/TrueSheetFocusEvents.mm +49 -0
- package/ios/events/TrueSheetLifecycleEvents.h +40 -0
- package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
- package/ios/events/TrueSheetStateEvents.h +35 -0
- package/ios/events/TrueSheetStateEvents.mm +49 -0
- package/ios/tvos/TrueSheetStubs.mm +154 -0
- package/ios/{events/OnMountEvent.h → utils/BlurUtil.h} +5 -7
- package/ios/utils/BlurUtil.mm +69 -0
- package/ios/utils/GestureUtil.h +7 -0
- package/ios/utils/GestureUtil.mm +12 -0
- package/ios/utils/PlatformUtil.h +15 -0
- package/ios/utils/UIView+FirstResponder.h +15 -0
- package/ios/utils/UIView+FirstResponder.mm +26 -0
- package/ios/{events/OnWillDismissEvent.h → utils/UIView+ScrollEdgeInteraction.h} +6 -7
- package/ios/utils/UIView+ScrollEdgeInteraction.mm +62 -0
- package/ios/utils/WindowUtil.mm +17 -1
- package/lib/module/TrueSheet.js +224 -64
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/TrueSheet.web.js +1201 -0
- package/lib/module/TrueSheet.web.js.map +1 -0
- package/lib/module/TrueSheetPeek.js +15 -0
- package/lib/module/TrueSheetPeek.js.map +1 -0
- package/lib/module/TrueSheetPeek.web.js +55 -0
- package/lib/module/TrueSheetPeek.web.js.map +1 -0
- package/lib/module/TrueSheetProvider.js +28 -0
- package/lib/module/TrueSheetProvider.js.map +1 -0
- package/lib/module/TrueSheetProvider.web.js +157 -0
- package/lib/module/TrueSheetProvider.web.js.map +1 -0
- package/lib/module/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/lib/module/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/lib/module/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/lib/module/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/lib/module/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/lib/module/index.js +3 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/mocks/index.js +93 -0
- package/lib/module/mocks/index.js.map +1 -0
- package/lib/module/mocks/navigation.js +85 -0
- package/lib/module/mocks/navigation.js.map +1 -0
- package/lib/module/mocks/reanimated.js +91 -0
- package/lib/module/mocks/reanimated.js.map +1 -0
- package/lib/module/navigation/TrueSheetRouter.js +170 -0
- package/lib/module/navigation/TrueSheetRouter.js.map +1 -0
- package/lib/module/navigation/TrueSheetView.js +71 -0
- package/lib/module/navigation/TrueSheetView.js.map +1 -0
- package/lib/module/navigation/createTrueSheetNavigator.js +63 -0
- package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -0
- package/lib/module/navigation/index.js +6 -0
- package/lib/module/navigation/index.js.map +1 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/index.js +5 -0
- package/lib/module/navigation/screen/index.js.map +1 -0
- package/lib/module/navigation/screen/types.js +4 -0
- package/lib/module/navigation/screen/types.js.map +1 -0
- package/lib/module/navigation/screen/useSheetScreenState.js +68 -0
- package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
- package/lib/module/navigation/types.js +4 -0
- package/lib/module/navigation/types.js.map +1 -0
- package/lib/module/navigation/useTrueSheetNavigation.js +24 -0
- package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.js +15 -9
- package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js +81 -0
- package/lib/module/reanimated/ReanimatedTrueSheet.web.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
- package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
- package/lib/module/reanimated/index.js +2 -2
- package/lib/module/reanimated/index.js.map +1 -1
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js +20 -0
- package/lib/module/reanimated/useReanimatedPositionChangeHandler.web.js.map +1 -0
- package/lib/module/specs/NativeTrueSheetModule.js.map +1 -1
- package/lib/module/web/constants.js +16 -0
- package/lib/module/web/constants.js.map +1 -0
- package/lib/module/web/vaul/README.md +9 -0
- package/lib/module/web/vaul/browser.js +30 -0
- package/lib/module/web/vaul/browser.js.map +1 -0
- package/lib/module/web/vaul/constants.js +15 -0
- package/lib/module/web/vaul/constants.js.map +1 -0
- package/lib/module/web/vaul/context.js +59 -0
- package/lib/module/web/vaul/context.js.map +1 -0
- package/lib/module/web/vaul/helpers.js +93 -0
- package/lib/module/web/vaul/helpers.js.map +1 -0
- package/lib/module/web/vaul/index.js +1309 -0
- package/lib/module/web/vaul/index.js.map +1 -0
- package/lib/module/web/vaul/style.css +287 -0
- package/lib/module/web/vaul/style.css.d.js +2 -0
- package/lib/module/web/vaul/style.css.d.js.map +1 -0
- package/lib/module/web/vaul/types.js +2 -0
- package/lib/module/web/vaul/types.js.map +1 -0
- package/lib/module/web/vaul/use-composed-refs.js +34 -0
- package/lib/module/web/vaul/use-composed-refs.js.map +1 -0
- package/lib/module/web/vaul/use-controllable-state.js +54 -0
- package/lib/module/web/vaul/use-controllable-state.js.map +1 -0
- package/lib/module/web/vaul/use-position-fixed.js +123 -0
- package/lib/module/web/vaul/use-position-fixed.js.map +1 -0
- package/lib/module/web/vaul/use-prevent-scroll.js +258 -0
- package/lib/module/web/vaul/use-prevent-scroll.js.map +1 -0
- package/lib/module/web/vaul/use-scale-background.js +57 -0
- package/lib/module/web/vaul/use-scale-background.js.map +1 -0
- package/lib/module/web/vaul/use-snap-points.js +305 -0
- package/lib/module/web/vaul/use-snap-points.js.map +1 -0
- package/lib/typescript/src/TrueSheet.d.ts +51 -14
- package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.types.d.ts +463 -54
- package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.web.d.ts +5 -0
- package/lib/typescript/src/TrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts +9 -0
- package/lib/typescript/src/TrueSheetPeek.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts +28 -0
- package/lib/typescript/src/TrueSheetPeek.web.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts +18 -0
- package/lib/typescript/src/TrueSheetProvider.d.ts.map +1 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts +27 -0
- package/lib/typescript/src/TrueSheetProvider.web.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetContainerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetContentViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts +2 -0
- package/lib/typescript/src/fabric/TrueSheetFooterViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetHeaderViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts +6 -0
- package/lib/typescript/src/fabric/TrueSheetPeekViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +67 -16
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/mocks/index.d.ts +43 -0
- package/lib/typescript/src/mocks/index.d.ts.map +1 -0
- package/lib/typescript/src/mocks/navigation.d.ts +66 -0
- package/lib/typescript/src/mocks/navigation.d.ts.map +1 -0
- package/lib/typescript/src/mocks/reanimated.d.ts +48 -0
- package/lib/typescript/src/mocks/reanimated.d.ts.map +1 -0
- package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +57 -0
- package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -0
- package/lib/typescript/src/navigation/TrueSheetView.d.ts +10 -0
- package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -0
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +35 -0
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -0
- package/lib/typescript/src/navigation/index.d.ts +6 -0
- package/lib/typescript/src/navigation/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
- package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/types.d.ts +15 -0
- package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +153 -0
- package/lib/typescript/src/navigation/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +23 -0
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts +41 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheet.web.d.ts.map +1 -0
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
- package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts +15 -0
- package/lib/typescript/src/reanimated/useReanimatedPositionChangeHandler.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts +25 -3
- package/lib/typescript/src/specs/NativeTrueSheetModule.d.ts.map +1 -1
- package/lib/typescript/src/web/constants.d.ts +14 -0
- package/lib/typescript/src/web/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/browser.d.ts +8 -0
- package/lib/typescript/src/web/vaul/browser.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/constants.d.ts +13 -0
- package/lib/typescript/src/web/vaul/constants.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/context.d.ts +53 -0
- package/lib/typescript/src/web/vaul/context.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts +17 -0
- package/lib/typescript/src/web/vaul/helpers.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/index.d.ts +228 -0
- package/lib/typescript/src/web/vaul/index.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/types.d.ts +7 -0
- package/lib/typescript/src/web/vaul/types.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts +14 -0
- package/lib/typescript/src/web/vaul/use-composed-refs.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts +9 -0
- package/lib/typescript/src/web/vaul/use-controllable-state.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts +19 -0
- package/lib/typescript/src/web/vaul/use-position-fixed.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts +18 -0
- package/lib/typescript/src/web/vaul/use-prevent-scroll.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts +2 -0
- package/lib/typescript/src/web/vaul/use-scale-background.d.ts.map +1 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts +38 -0
- package/lib/typescript/src/web/vaul/use-snap-points.d.ts.map +1 -0
- package/package.json +78 -34
- package/react-native.config.js +9 -2
- package/src/TrueSheet.tsx +276 -60
- package/src/TrueSheet.types.ts +525 -71
- package/src/TrueSheet.web.tsx +1366 -0
- package/src/TrueSheetPeek.tsx +11 -0
- package/src/TrueSheetPeek.web.tsx +63 -0
- package/src/TrueSheetProvider.tsx +33 -0
- package/src/TrueSheetProvider.web.tsx +220 -0
- package/src/fabric/TrueSheetContainerViewNativeComponent.ts +1 -1
- package/src/fabric/TrueSheetContentViewNativeComponent.ts +5 -1
- package/src/fabric/TrueSheetFooterViewNativeComponent.ts +10 -2
- package/src/fabric/TrueSheetHeaderViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetPeekViewNativeComponent.ts +8 -0
- package/src/fabric/TrueSheetViewNativeComponent.ts +105 -18
- package/src/index.ts +2 -2
- package/src/mocks/index.ts +89 -0
- package/src/mocks/navigation.ts +72 -0
- package/src/mocks/reanimated.ts +101 -0
- package/src/navigation/TrueSheetRouter.ts +234 -0
- package/src/navigation/TrueSheetView.tsx +99 -0
- package/src/navigation/createTrueSheetNavigator.tsx +93 -0
- package/src/navigation/index.ts +14 -0
- package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
- package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
- package/src/navigation/screen/index.ts +3 -0
- package/src/navigation/screen/types.ts +21 -0
- package/src/navigation/screen/useSheetScreenState.ts +107 -0
- package/src/navigation/types.ts +219 -0
- package/src/navigation/useTrueSheetNavigation.ts +26 -0
- package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
- package/src/reanimated/ReanimatedTrueSheet.web.tsx +75 -0
- package/src/reanimated/ReanimatedTrueSheetProvider.tsx +12 -8
- package/src/reanimated/useReanimatedPositionChangeHandler.web.ts +31 -0
- package/src/specs/NativeTrueSheetModule.ts +28 -3
- package/src/web/constants.ts +13 -0
- package/src/web/vaul/README.md +9 -0
- package/src/web/vaul/browser.ts +38 -0
- package/src/web/vaul/constants.ts +20 -0
- package/src/web/vaul/context.ts +101 -0
- package/src/web/vaul/helpers.ts +124 -0
- package/src/web/vaul/index.tsx +1740 -0
- package/src/web/vaul/style.css +287 -0
- package/src/web/vaul/style.css.d.ts +1 -0
- package/src/web/vaul/types.ts +7 -0
- package/src/web/vaul/use-composed-refs.ts +35 -0
- package/src/web/vaul/use-controllable-state.ts +66 -0
- package/src/web/vaul/use-position-fixed.ts +147 -0
- package/src/web/vaul/use-prevent-scroll.ts +309 -0
- package/src/web/vaul/use-scale-background.ts +64 -0
- package/src/web/vaul/use-snap-points.ts +455 -0
- package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
- package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
- package/android/src/main/java/com/lodev09/truesheet/events/SizeChangeEvent.kt +0 -27
- package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
- package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
- package/android/src/main/res/values/styles.xml +0 -8
- package/ios/events/OnDetentChangeEvent.h +0 -28
- package/ios/events/OnDetentChangeEvent.mm +0 -30
- package/ios/events/OnDidDismissEvent.mm +0 -25
- package/ios/events/OnDidPresentEvent.h +0 -28
- package/ios/events/OnDidPresentEvent.mm +0 -30
- package/ios/events/OnDragBeginEvent.h +0 -28
- package/ios/events/OnDragBeginEvent.mm +0 -30
- package/ios/events/OnDragChangeEvent.h +0 -28
- package/ios/events/OnDragChangeEvent.mm +0 -30
- package/ios/events/OnDragEndEvent.h +0 -28
- package/ios/events/OnDragEndEvent.mm +0 -30
- package/ios/events/OnMountEvent.mm +0 -25
- package/ios/events/OnPositionChangeEvent.mm +0 -32
- package/ios/events/OnSizeChangeEvent.h +0 -28
- package/ios/events/OnSizeChangeEvent.mm +0 -30
- package/ios/events/OnWillDismissEvent.mm +0 -25
- package/ios/events/OnWillPresentEvent.h +0 -28
- package/ios/events/OnWillPresentEvent.mm +0 -30
- package/ios/utils/LayoutUtil.h +0 -44
- package/ios/utils/LayoutUtil.mm +0 -50
- package/lib/module/TrueSheetGrabber.js +0 -51
- package/lib/module/TrueSheetGrabber.js.map +0 -1
- package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
- package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
- package/src/TrueSheetGrabber.tsx +0 -82
- package/src/__mocks__/index.js +0 -67
|
@@ -1,102 +1,128 @@
|
|
|
1
1
|
package com.lodev09.truesheet.utils
|
|
2
2
|
|
|
3
|
-
import android.
|
|
4
|
-
import android.
|
|
3
|
+
import android.content.res.Configuration
|
|
4
|
+
import android.graphics.Point
|
|
5
5
|
import android.os.Build
|
|
6
|
-
import android.util.DisplayMetrics
|
|
7
6
|
import android.view.View
|
|
8
7
|
import android.view.WindowInsets
|
|
9
8
|
import android.view.WindowManager
|
|
10
9
|
import com.facebook.react.bridge.ReactContext
|
|
10
|
+
import kotlin.math.min
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Data class for top/bottom insets
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
|
-
@SuppressLint("DiscouragedApi")
|
|
17
|
-
private fun getIdentifierHeight(context: ReactContext, name: String): Int =
|
|
18
|
-
context.resources.getDimensionPixelSize(
|
|
19
|
-
context.resources.getIdentifier(name, "dimen", "android")
|
|
20
|
-
).takeIf { it > 0 } ?: 0
|
|
15
|
+
data class Insets(val top: Int, val bottom: Int)
|
|
21
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Utility object for screen dimension calculations.
|
|
19
|
+
* Inset calculation approach inspired by react-native-safe-area-context.
|
|
20
|
+
*
|
|
21
|
+
* Note: This library requires React Native 0.76+ which has minSdk API 24.
|
|
22
|
+
*/
|
|
23
|
+
object ScreenUtils {
|
|
22
24
|
/**
|
|
23
|
-
* Get
|
|
24
|
-
*
|
|
25
|
-
* @param context React context
|
|
26
|
-
* @return Status bar height in pixels
|
|
25
|
+
* Get root window insets for API 30+ (Android R)
|
|
27
26
|
*/
|
|
28
|
-
fun
|
|
29
|
-
// Modern approach using WindowInsets (API 30+)
|
|
27
|
+
private fun getInsetsR(rootView: View): Insets? {
|
|
30
28
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
31
|
-
val
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
val insets = rootView.rootWindowInsets?.getInsets(
|
|
30
|
+
WindowInsets.Type.statusBars() or
|
|
31
|
+
WindowInsets.Type.displayCutout() or
|
|
32
|
+
WindowInsets.Type.navigationBars()
|
|
33
|
+
) ?: return null
|
|
34
|
+
return Insets(
|
|
35
|
+
top = insets.top,
|
|
36
|
+
bottom = insets.bottom
|
|
37
|
+
)
|
|
37
38
|
}
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Get root window insets for API 24-29
|
|
44
|
+
*/
|
|
45
|
+
@Suppress("DEPRECATION")
|
|
46
|
+
private fun getInsetsLegacy(rootView: View): Insets? {
|
|
47
|
+
val insets = rootView.rootWindowInsets ?: return null
|
|
48
|
+
return Insets(
|
|
49
|
+
top = insets.systemWindowInsetTop,
|
|
50
|
+
// Use min to avoid including soft keyboard
|
|
51
|
+
bottom = min(insets.systemWindowInsetBottom, insets.stableInsetBottom)
|
|
52
|
+
)
|
|
41
53
|
}
|
|
42
54
|
|
|
43
55
|
/**
|
|
44
|
-
*
|
|
56
|
+
* Get safe area insets from ReactContext using the activity's decor view.
|
|
45
57
|
*
|
|
46
|
-
* @param
|
|
47
|
-
* @
|
|
48
|
-
* @return Screen height in pixels
|
|
58
|
+
* @param reactContext The ReactContext to get insets from
|
|
59
|
+
* @return Insets with top (status bar) and bottom (navigation bar) values in pixels
|
|
49
60
|
*/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
val
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
56
|
-
context.display?.getRealMetrics(displayMetrics)
|
|
61
|
+
fun getInsets(reactContext: ReactContext): Insets {
|
|
62
|
+
val activity = reactContext.currentActivity ?: return Insets(0, 0)
|
|
63
|
+
val decorView = activity.window?.decorView ?: return Insets(0, 0)
|
|
64
|
+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
65
|
+
getInsetsR(decorView)
|
|
57
66
|
} else {
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
val screenHeight = displayMetrics.heightPixels
|
|
62
|
-
val statusBarHeight = getStatusBarHeight(context)
|
|
67
|
+
getInsetsLegacy(decorView)
|
|
68
|
+
} ?: Insets(0, 0)
|
|
69
|
+
}
|
|
63
70
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Get the real physical device screen height, including system bars.
|
|
73
|
+
* This is consistent across all API levels.
|
|
74
|
+
*
|
|
75
|
+
* @param reactContext The ReactContext to get context from
|
|
76
|
+
* @return Real screen height in pixels
|
|
77
|
+
*/
|
|
78
|
+
@Suppress("DEPRECATION")
|
|
79
|
+
fun getRealScreenHeight(reactContext: ReactContext): Int {
|
|
80
|
+
val windowManager = reactContext.getSystemService(WindowManager::class.java)
|
|
81
|
+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
82
|
+
windowManager.currentWindowMetrics.bounds.height()
|
|
69
83
|
} else {
|
|
70
|
-
|
|
84
|
+
val size = Point()
|
|
85
|
+
windowManager.defaultDisplay.getRealSize(size)
|
|
86
|
+
size.y
|
|
71
87
|
}
|
|
88
|
+
}
|
|
72
89
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Get the screen width using the same method as React Native's useWindowDimensions.
|
|
92
|
+
*
|
|
93
|
+
* @param reactContext The ReactContext to get resources from
|
|
94
|
+
* @return Screen width in pixels
|
|
95
|
+
*/
|
|
96
|
+
fun getScreenWidth(reactContext: ReactContext): Int = reactContext.resources.displayMetrics.widthPixels
|
|
78
97
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
screenHeight - statusBarHeight - navigationBarHeight
|
|
88
|
-
}
|
|
89
|
-
}
|
|
98
|
+
/**
|
|
99
|
+
* Calculate the screen height using the same method as React Native's useWindowDimensions.
|
|
100
|
+
* This returns the window height which automatically accounts for edge-to-edge mode.
|
|
101
|
+
*
|
|
102
|
+
* @param reactContext The ReactContext to get resources from
|
|
103
|
+
* @return Screen height in pixels
|
|
104
|
+
*/
|
|
105
|
+
fun getScreenHeight(reactContext: ReactContext): Int = reactContext.resources.displayMetrics.heightPixels
|
|
90
106
|
|
|
91
107
|
/**
|
|
92
|
-
* Get the
|
|
108
|
+
* Get the location of a view in screen coordinates
|
|
93
109
|
*
|
|
94
|
-
* @param view The view to get screen
|
|
95
|
-
* @return
|
|
110
|
+
* @param view The view to get screen location for
|
|
111
|
+
* @return IntArray with [x, y] coordinates in screen space
|
|
96
112
|
*/
|
|
97
|
-
fun
|
|
113
|
+
fun getScreenLocation(view: View): IntArray {
|
|
98
114
|
val location = IntArray(2)
|
|
99
115
|
view.getLocationOnScreen(location)
|
|
100
|
-
return location
|
|
116
|
+
return location
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Returns true if the device is a phone in portrait orientation.
|
|
121
|
+
*/
|
|
122
|
+
fun isPortraitPhone(reactContext: ReactContext): Boolean {
|
|
123
|
+
val config = reactContext.resources.configuration
|
|
124
|
+
val isPortrait = config.orientation == Configuration.ORIENTATION_PORTRAIT
|
|
125
|
+
val isPhone = config.smallestScreenWidthDp < 600
|
|
126
|
+
return isPortrait && isPhone
|
|
101
127
|
}
|
|
102
128
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package com.lodev09.truesheet.utils
|
|
2
|
+
|
|
3
|
+
import android.view.View
|
|
4
|
+
import android.view.ViewGroup
|
|
5
|
+
import android.widget.ScrollView
|
|
6
|
+
import androidx.core.widget.NestedScrollView
|
|
7
|
+
|
|
8
|
+
fun View.isDescendantOf(ancestor: View): Boolean {
|
|
9
|
+
if (!isAttachedToWindow) return false
|
|
10
|
+
var current: View? = this
|
|
11
|
+
while (current != null) {
|
|
12
|
+
if (current === ancestor) return true
|
|
13
|
+
current = (current.parent as? View)
|
|
14
|
+
}
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fun ViewGroup.smoothScrollBy(dx: Int, dy: Int) {
|
|
19
|
+
when (this) {
|
|
20
|
+
is ScrollView -> smoothScrollBy(dx, dy)
|
|
21
|
+
is NestedScrollView -> smoothScrollBy(dx, dy)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fun ViewGroup.smoothScrollTo(x: Int, y: Int) {
|
|
26
|
+
when (this) {
|
|
27
|
+
is ScrollView -> smoothScrollTo(x, y)
|
|
28
|
+
is NestedScrollView -> smoothScrollTo(x, y)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.13)
|
|
2
|
+
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
3
|
+
|
|
4
|
+
set(LIB_LITERAL TrueSheetSpec)
|
|
5
|
+
set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL})
|
|
6
|
+
|
|
7
|
+
set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
|
|
8
|
+
set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp)
|
|
9
|
+
set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
|
|
10
|
+
set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL})
|
|
11
|
+
|
|
12
|
+
file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_DIR}/react/renderer/components/${LIB_LITERAL}/*.cpp)
|
|
13
|
+
file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_ANDROID_GENERATED_JNI_DIR}/*.cpp ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp)
|
|
14
|
+
|
|
15
|
+
add_library(
|
|
16
|
+
${LIB_TARGET_NAME}
|
|
17
|
+
SHARED
|
|
18
|
+
${LIB_CUSTOM_SRCS}
|
|
19
|
+
${LIB_CODEGEN_SRCS}
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
target_include_directories(
|
|
23
|
+
${LIB_TARGET_NAME}
|
|
24
|
+
PUBLIC
|
|
25
|
+
.
|
|
26
|
+
${LIB_COMMON_DIR}
|
|
27
|
+
${LIB_ANDROID_GENERATED_JNI_DIR}
|
|
28
|
+
${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
target_link_libraries(
|
|
32
|
+
${LIB_TARGET_NAME}
|
|
33
|
+
ReactAndroid::reactnative
|
|
34
|
+
ReactAndroid::jsi
|
|
35
|
+
fbjni::fbjni
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
target_include_directories(
|
|
39
|
+
${CMAKE_PROJECT_NAME}
|
|
40
|
+
PUBLIC
|
|
41
|
+
${CMAKE_CURRENT_SOURCE_DIR}
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 80)
|
|
45
|
+
target_compile_reactnative_options(${LIB_TARGET_NAME} PUBLIC)
|
|
46
|
+
else()
|
|
47
|
+
target_compile_options(
|
|
48
|
+
${LIB_TARGET_NAME}
|
|
49
|
+
PRIVATE
|
|
50
|
+
-fexceptions
|
|
51
|
+
-frtti
|
|
52
|
+
-std=c++20
|
|
53
|
+
-Wall
|
|
54
|
+
)
|
|
55
|
+
endif()
|
|
56
|
+
|
|
57
|
+
target_compile_options(
|
|
58
|
+
${LIB_TARGET_NAME}
|
|
59
|
+
PRIVATE
|
|
60
|
+
-Wpedantic
|
|
61
|
+
-Wno-gnu-zero-variadic-macro-arguments
|
|
62
|
+
-Wno-dollar-in-identifier-extension
|
|
63
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <ReactCommon/JavaTurboModule.h>
|
|
4
|
+
#include <ReactCommon/TurboModule.h>
|
|
5
|
+
#include <jsi/jsi.h>
|
|
6
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h>
|
|
7
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h>
|
|
8
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetViewComponentDescriptor.h>
|
|
9
|
+
|
|
10
|
+
namespace facebook {
|
|
11
|
+
namespace react {
|
|
12
|
+
|
|
13
|
+
JSI_EXPORT
|
|
14
|
+
std::shared_ptr<TurboModule> TrueSheetSpec_ModuleProvider(
|
|
15
|
+
const std::string &moduleName,
|
|
16
|
+
const JavaTurboModule::InitParams ¶ms);
|
|
17
|
+
|
|
18
|
+
} // namespace react
|
|
19
|
+
} // namespace facebook
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Created by Jovanni Lo (@lodev09)
|
|
3
|
+
// Copyright (c) 2024-present. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This source code is licensed under the MIT license found in the
|
|
6
|
+
// LICENSE file in the root directory of this source tree.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#include <fbjni/fbjni.h>
|
|
10
|
+
#include <react/fabric/StateWrapperImpl.h>
|
|
11
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h>
|
|
12
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetInsets.h>
|
|
13
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetViewState.h>
|
|
14
|
+
#include <react/renderer/core/ConcreteState.h>
|
|
15
|
+
|
|
16
|
+
namespace facebook::react {
|
|
17
|
+
|
|
18
|
+
static std::shared_ptr<const State> getStateFromWrapper(jni::alias_ref<jobject> stateWrapper) {
|
|
19
|
+
static const auto stateWrapperImplClass =
|
|
20
|
+
jni::findClassStatic(StateWrapperImpl::StateWrapperImplJavaDescriptor);
|
|
21
|
+
if (!stateWrapper->isInstanceOf(stateWrapperImplClass)) {
|
|
22
|
+
return nullptr;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
auto impl = jni::static_ref_cast<StateWrapperImpl::jhybridobject>(stateWrapper);
|
|
26
|
+
return impl->cthis()->getState();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Kotlin's StateWrapper.updateState is hardcoded async. This bridges to
|
|
30
|
+
// ConcreteState::updateState with unstable_Immediate so the commit — and, when
|
|
31
|
+
// called from the UI thread, the mount — run synchronously, letting Yoga resize
|
|
32
|
+
// the container in the same frame as the sheet (parity with iOS).
|
|
33
|
+
static jboolean updateStateImmediate(
|
|
34
|
+
jni::alias_ref<jclass> /*clazz*/,
|
|
35
|
+
jni::alias_ref<jobject> stateWrapper,
|
|
36
|
+
jfloat containerWidth,
|
|
37
|
+
jfloat containerHeight) {
|
|
38
|
+
auto state = getStateFromWrapper(stateWrapper);
|
|
39
|
+
if (!state) {
|
|
40
|
+
return JNI_FALSE;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
auto concreteState = std::static_pointer_cast<const ConcreteState<TrueSheetViewState>>(state);
|
|
44
|
+
|
|
45
|
+
// Copy the latest data so fields this bridge doesn't set survive the update
|
|
46
|
+
TrueSheetViewState newState = concreteState->getData();
|
|
47
|
+
newState.containerWidth = containerWidth;
|
|
48
|
+
newState.containerHeight = containerHeight;
|
|
49
|
+
concreteState->updateState(std::move(newState), EventQueue::UpdateMode::unstable_Immediate);
|
|
50
|
+
|
|
51
|
+
return JNI_TRUE;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Same synchronous bridge for the footer's bottom inset — the footer must be
|
|
55
|
+
// padded (and resized) before detents are configured, otherwise the behavior
|
|
56
|
+
// is set up against the unpadded footer height and the auto detent lands an
|
|
57
|
+
// inset short.
|
|
58
|
+
static jboolean updateFooterStateImmediate(
|
|
59
|
+
jni::alias_ref<jclass> /*clazz*/,
|
|
60
|
+
jni::alias_ref<jobject> stateWrapper,
|
|
61
|
+
jfloat bottomInset) {
|
|
62
|
+
auto state = getStateFromWrapper(stateWrapper);
|
|
63
|
+
if (!state) {
|
|
64
|
+
return JNI_FALSE;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
auto concreteState =
|
|
68
|
+
std::static_pointer_cast<const ConcreteState<TrueSheetFooterViewState>>(state);
|
|
69
|
+
|
|
70
|
+
// Copy the latest data so fields this bridge doesn't set survive the update
|
|
71
|
+
TrueSheetFooterViewState newState = concreteState->getData();
|
|
72
|
+
newState.bottomInset = bottomInset;
|
|
73
|
+
newState.initialized = true;
|
|
74
|
+
concreteState->updateState(std::move(newState), EventQueue::UpdateMode::unstable_Immediate);
|
|
75
|
+
|
|
76
|
+
return JNI_TRUE;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Publishes the precalculated bottom safe-area inset so a late-mounted
|
|
80
|
+
// footer's first layout is already padded (see TrueSheetFooterViewShadowNode).
|
|
81
|
+
static void setBottomSafeArea(jni::alias_ref<jclass> /*clazz*/, jfloat insetDp) {
|
|
82
|
+
TrueSheetInsets::setBottomSafeArea(insetDp);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
} // namespace facebook::react
|
|
86
|
+
|
|
87
|
+
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/) {
|
|
88
|
+
return facebook::jni::initialize(vm, [] {
|
|
89
|
+
facebook::jni::findClassStatic("com/lodev09/truesheet/TrueSheetStateUpdater")
|
|
90
|
+
->registerNatives({
|
|
91
|
+
makeNativeMethod("nativeUpdateState", facebook::react::updateStateImmediate),
|
|
92
|
+
makeNativeMethod("nativeUpdateFooterState", facebook::react::updateFooterStateImmediate),
|
|
93
|
+
makeNativeMethod("nativeSetBottomSafeArea", facebook::react::setBottomSafeArea),
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewComponentDescriptor.h
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.h>
|
|
4
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
5
|
+
|
|
6
|
+
namespace facebook::react {
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Descriptor for <TrueSheetContentView> component.
|
|
10
|
+
*/
|
|
11
|
+
class TrueSheetContentViewComponentDescriptor final
|
|
12
|
+
: public ConcreteComponentDescriptor<TrueSheetContentViewShadowNode> {
|
|
13
|
+
using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
|
|
14
|
+
|
|
15
|
+
void adopt(ShadowNode &shadowNode) const override {
|
|
16
|
+
auto &concreteShadowNode =
|
|
17
|
+
static_cast<TrueSheetContentViewShadowNode &>(shadowNode);
|
|
18
|
+
concreteShadowNode.adjustLayoutWithState();
|
|
19
|
+
|
|
20
|
+
ConcreteComponentDescriptor::adopt(shadowNode);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#include "TrueSheetContentViewShadowNode.h"
|
|
2
|
+
|
|
3
|
+
#include <react/renderer/components/view/conversions.h>
|
|
4
|
+
|
|
5
|
+
namespace facebook::react {
|
|
6
|
+
|
|
7
|
+
using namespace yoga;
|
|
8
|
+
|
|
9
|
+
extern const char TrueSheetContentViewComponentName[] = "TrueSheetContentView";
|
|
10
|
+
|
|
11
|
+
void TrueSheetContentViewShadowNode::adjustLayoutWithState() {
|
|
12
|
+
ensureUnsealed();
|
|
13
|
+
|
|
14
|
+
auto state = std::static_pointer_cast<
|
|
15
|
+
const TrueSheetContentViewShadowNode::ConcreteState>(getState());
|
|
16
|
+
auto stateData = state->getData();
|
|
17
|
+
|
|
18
|
+
auto &props = getConcreteProps();
|
|
19
|
+
|
|
20
|
+
// When a ScrollView is pinned under an auto detent, fill the container so
|
|
21
|
+
// descendant flex layouts (flex:1 wrappers, the ScrollView itself) resolve
|
|
22
|
+
// against a definite height and the viewport is bounded — natural layout is
|
|
23
|
+
// circular there since the sheet height derives from the ScrollView's content
|
|
24
|
+
// size instead (see ContentView's naturalHeight on each platform). For fixed
|
|
25
|
+
// detents, content lays out naturally like a regular view.
|
|
26
|
+
auto flexGrow = stateData.scrollableBounded
|
|
27
|
+
? FloatOptional{1.0f}
|
|
28
|
+
: props.yogaStyle.flexGrow();
|
|
29
|
+
auto flexShrink = stateData.scrollableBounded
|
|
30
|
+
? FloatOptional{1.0f}
|
|
31
|
+
: props.yogaStyle.flexShrink();
|
|
32
|
+
|
|
33
|
+
if (yogaNode_.style().flexGrow() != flexGrow ||
|
|
34
|
+
yogaNode_.style().flexShrink() != flexShrink) {
|
|
35
|
+
yoga::Style adjustedStyle = props.yogaStyle;
|
|
36
|
+
adjustedStyle.setFlexGrow(flexGrow);
|
|
37
|
+
adjustedStyle.setFlexShrink(flexShrink);
|
|
38
|
+
yogaNode_.setStyle(adjustedStyle);
|
|
39
|
+
yogaNode_.setDirty(true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <jsi/jsi.h>
|
|
4
|
+
#include <react/renderer/components/TrueSheetSpec/EventEmitters.h>
|
|
5
|
+
#include <react/renderer/components/TrueSheetSpec/Props.h>
|
|
6
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h>
|
|
7
|
+
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
|
|
8
|
+
|
|
9
|
+
namespace facebook::react {
|
|
10
|
+
|
|
11
|
+
JSI_EXPORT extern const char TrueSheetContentViewComponentName[];
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* `ShadowNode` for <TrueSheetContentView> component.
|
|
15
|
+
*/
|
|
16
|
+
class JSI_EXPORT TrueSheetContentViewShadowNode final
|
|
17
|
+
: public ConcreteViewShadowNode<
|
|
18
|
+
TrueSheetContentViewComponentName,
|
|
19
|
+
TrueSheetContentViewProps,
|
|
20
|
+
TrueSheetContentViewEventEmitter,
|
|
21
|
+
TrueSheetContentViewState> {
|
|
22
|
+
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
|
23
|
+
|
|
24
|
+
public:
|
|
25
|
+
void adjustLayoutWithState();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#include "TrueSheetContentViewState.h"
|
|
2
|
+
|
|
3
|
+
namespace facebook::react {
|
|
4
|
+
|
|
5
|
+
#ifdef ANDROID
|
|
6
|
+
folly::dynamic TrueSheetContentViewState::getDynamic() const {
|
|
7
|
+
return folly::dynamic::object("scrollableBounded", scrollableBounded);
|
|
8
|
+
}
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#ifdef ANDROID
|
|
4
|
+
#include <folly/dynamic.h>
|
|
5
|
+
#include <react/renderer/mapbuffer/MapBuffer.h>
|
|
6
|
+
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
namespace facebook::react {
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* State for <TrueSheetContentView> component.
|
|
13
|
+
* Set from native when a ScrollView is pinned so the shadow node bounds the
|
|
14
|
+
* content to the container via flexShrink (see TrueSheetContentViewShadowNode).
|
|
15
|
+
*/
|
|
16
|
+
class TrueSheetContentViewState final {
|
|
17
|
+
public:
|
|
18
|
+
TrueSheetContentViewState() = default;
|
|
19
|
+
|
|
20
|
+
#ifdef ANDROID
|
|
21
|
+
TrueSheetContentViewState(
|
|
22
|
+
TrueSheetContentViewState const &previousState,
|
|
23
|
+
folly::dynamic data)
|
|
24
|
+
: scrollableBounded(data["scrollableBounded"].getBool()) {}
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
bool scrollableBounded{false};
|
|
28
|
+
|
|
29
|
+
#ifdef ANDROID
|
|
30
|
+
folly::dynamic getDynamic() const;
|
|
31
|
+
MapBuffer getMapBuffer() const {
|
|
32
|
+
return MapBufferBuilder::EMPTY();
|
|
33
|
+
}
|
|
34
|
+
#endif
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
} // namespace facebook::react
|
package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetFooterViewComponentDescriptor.h
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewShadowNode.h>
|
|
4
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
5
|
+
|
|
6
|
+
namespace facebook::react {
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Descriptor for <TrueSheetFooterView> component.
|
|
10
|
+
*/
|
|
11
|
+
class TrueSheetFooterViewComponentDescriptor final
|
|
12
|
+
: public ConcreteComponentDescriptor<TrueSheetFooterViewShadowNode> {
|
|
13
|
+
using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
|
|
14
|
+
|
|
15
|
+
void adopt(ShadowNode &shadowNode) const override {
|
|
16
|
+
auto &concreteShadowNode =
|
|
17
|
+
static_cast<TrueSheetFooterViewShadowNode &>(shadowNode);
|
|
18
|
+
concreteShadowNode.adjustLayoutWithState();
|
|
19
|
+
|
|
20
|
+
ConcreteComponentDescriptor::adopt(shadowNode);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#include "TrueSheetFooterViewShadowNode.h"
|
|
2
|
+
|
|
3
|
+
#include <react/renderer/components/view/conversions.h>
|
|
4
|
+
|
|
5
|
+
#include "TrueSheetInsets.h"
|
|
6
|
+
|
|
7
|
+
namespace facebook::react {
|
|
8
|
+
|
|
9
|
+
using namespace yoga;
|
|
10
|
+
|
|
11
|
+
extern const char TrueSheetFooterViewComponentName[] = "TrueSheetFooterView";
|
|
12
|
+
|
|
13
|
+
void TrueSheetFooterViewShadowNode::adjustLayoutWithState() {
|
|
14
|
+
ensureUnsealed();
|
|
15
|
+
|
|
16
|
+
auto state = std::static_pointer_cast<
|
|
17
|
+
const TrueSheetFooterViewShadowNode::ConcreteState>(getState());
|
|
18
|
+
auto stateData = state->getData();
|
|
19
|
+
|
|
20
|
+
auto &props = getConcreteProps();
|
|
21
|
+
|
|
22
|
+
// Until native pushes the real inset (which requires this node to already
|
|
23
|
+
// exist), seed a late-mounted footer's first layout with the precalculated
|
|
24
|
+
// inset — otherwise it lays out unpadded and forces a second sheet resize.
|
|
25
|
+
float bottomInset = stateData.bottomInset;
|
|
26
|
+
if (!stateData.initialized && props.autoBottomInset) {
|
|
27
|
+
bottomInset = TrueSheetInsets::bottomSafeArea();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A footer pinned to the sheet's bottom edge owns the bottom safe-area
|
|
31
|
+
// inset — pad it on top of any style padding so its content clears the
|
|
32
|
+
// home indicator while the background fills the inset.
|
|
33
|
+
auto padding = props.yogaStyle.padding(Edge::Bottom);
|
|
34
|
+
if (bottomInset > 0) {
|
|
35
|
+
// Base bottom padding from the style — Edge::Bottom wins over
|
|
36
|
+
// Vertical/All, mirroring Yoga's own resolution. Points only.
|
|
37
|
+
float base = 0;
|
|
38
|
+
for (auto edge : {Edge::Bottom, Edge::Vertical, Edge::All}) {
|
|
39
|
+
auto length = props.yogaStyle.padding(edge);
|
|
40
|
+
if (length.isDefined()) {
|
|
41
|
+
base = length.isPoints() ? length.value().unwrap() : 0;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
padding = StyleLength::points(base + bottomInset);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (yogaNode_.style().padding(Edge::Bottom) != padding) {
|
|
49
|
+
yoga::Style adjustedStyle = props.yogaStyle;
|
|
50
|
+
adjustedStyle.setPadding(Edge::Bottom, padding);
|
|
51
|
+
yogaNode_.setStyle(adjustedStyle);
|
|
52
|
+
yogaNode_.setDirty(true);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <jsi/jsi.h>
|
|
4
|
+
#include <react/renderer/components/TrueSheetSpec/EventEmitters.h>
|
|
5
|
+
#include <react/renderer/components/TrueSheetSpec/Props.h>
|
|
6
|
+
#include <react/renderer/components/TrueSheetSpec/TrueSheetFooterViewState.h>
|
|
7
|
+
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
|
|
8
|
+
|
|
9
|
+
namespace facebook::react {
|
|
10
|
+
|
|
11
|
+
JSI_EXPORT extern const char TrueSheetFooterViewComponentName[];
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* `ShadowNode` for <TrueSheetFooterView> component.
|
|
15
|
+
*/
|
|
16
|
+
class JSI_EXPORT TrueSheetFooterViewShadowNode final
|
|
17
|
+
: public ConcreteViewShadowNode<
|
|
18
|
+
TrueSheetFooterViewComponentName,
|
|
19
|
+
TrueSheetFooterViewProps,
|
|
20
|
+
TrueSheetFooterViewEventEmitter,
|
|
21
|
+
TrueSheetFooterViewState> {
|
|
22
|
+
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
|
23
|
+
|
|
24
|
+
public:
|
|
25
|
+
void adjustLayoutWithState();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
} // namespace facebook::react
|