react-native-screen-transitions 3.6.0 → 3.7.0-alpha.0
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/README.md +2 -2
- package/lib/commonjs/blank-stack/components/stack-view.js +35 -39
- package/lib/commonjs/blank-stack/components/stack-view.js.map +1 -1
- package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js +7 -14
- package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
- package/lib/commonjs/component-stack/components/stack-view.js +4 -11
- package/lib/commonjs/component-stack/components/stack-view.js.map +1 -1
- package/lib/commonjs/component-stack/navigators/create-component-stack-navigator.js +1 -1
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +6 -0
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
- package/lib/commonjs/shared/adapters/with-screen-transitions/context.js +28 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/context.js.map +1 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/index.js +75 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/index.js.map +1 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/options.js +103 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/options.js.map +1 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js +143 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/types.js +6 -0
- package/lib/commonjs/shared/adapters/with-screen-transitions/types.js.map +1 -0
- package/lib/commonjs/shared/components/activity/helpers.js +9 -0
- package/lib/commonjs/shared/components/activity/helpers.js.map +1 -0
- package/lib/commonjs/shared/components/activity/index.js +20 -0
- package/lib/commonjs/shared/components/activity/index.js.map +1 -0
- package/lib/commonjs/shared/components/activity/variants/activity-container.js +29 -0
- package/lib/commonjs/shared/components/activity/variants/activity-container.js.map +1 -0
- package/lib/commonjs/shared/components/activity/variants/activity-screen.js +107 -0
- package/lib/commonjs/shared/components/activity/variants/activity-screen.js.map +1 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-measurer.js +10 -4
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-measurer.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/utils/measured-bounds.js +13 -1
- package/lib/commonjs/shared/components/create-boundary-component/utils/measured-bounds.js.map +1 -1
- package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +8 -17
- package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
- package/lib/commonjs/shared/components/screen-lifecycle/index.js +1 -1
- package/lib/commonjs/shared/components/screen-lifecycle/index.js.map +1 -1
- package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js +10 -4
- package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
- package/lib/commonjs/shared/hooks/navigation/use-stack.js +63 -6
- package/lib/commonjs/shared/hooks/navigation/use-stack.js.map +1 -1
- package/lib/commonjs/shared/index.js +8 -0
- package/lib/commonjs/shared/index.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/descriptors/descriptors.provider.js +18 -29
- package/lib/commonjs/shared/providers/screen/descriptors/descriptors.provider.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/descriptors/index.js +6 -0
- package/lib/commonjs/shared/providers/screen/descriptors/index.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/ownership/resolve-ownership.js +2 -1
- package/lib/commonjs/shared/providers/screen/gestures/ownership/resolve-ownership.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/pan/pan-lifecycle.js +4 -1
- package/lib/commonjs/shared/providers/screen/gestures/pan/pan-lifecycle.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/pan/use-pan-behavior.js +4 -3
- package/lib/commonjs/shared/providers/screen/gestures/pan/use-pan-behavior.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/pinch/pinch-lifecycle.js +4 -1
- package/lib/commonjs/shared/providers/screen/gestures/pinch/pinch-lifecycle.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/gestures/pinch/use-pinch-behavior.js +4 -3
- package/lib/commonjs/shared/providers/screen/gestures/pinch/use-pinch-behavior.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
- package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
- package/lib/commonjs/shared/providers/stack/direct.provider.js +4 -3
- package/lib/commonjs/shared/providers/stack/direct.provider.js.map +1 -1
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +199 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +62 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +81 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +123 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +6 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js +24 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +131 -0
- package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
- package/lib/commonjs/shared/providers/stack/managed.provider.js +18 -29
- package/lib/commonjs/shared/providers/stack/managed.provider.js.map +1 -1
- package/lib/commonjs/shared/types/stack.types.js.map +1 -1
- package/lib/commonjs/shared/utils/create-provider.js +99 -10
- package/lib/commonjs/shared/utils/create-provider.js.map +1 -1
- package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
- package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
- package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js +23 -6
- package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
- package/lib/commonjs/shared/utils/visibility-block-offset.js +13 -0
- package/lib/commonjs/shared/utils/visibility-block-offset.js.map +1 -0
- package/lib/module/blank-stack/components/stack-view.js +36 -40
- package/lib/module/blank-stack/components/stack-view.js.map +1 -1
- package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js +7 -14
- package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
- package/lib/module/component-stack/components/stack-view.js +4 -11
- package/lib/module/component-stack/components/stack-view.js.map +1 -1
- package/lib/module/component-stack/navigators/create-component-stack-navigator.js +1 -1
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js +6 -0
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
- package/lib/module/shared/adapters/with-screen-transitions/context.js +23 -0
- package/lib/module/shared/adapters/with-screen-transitions/context.js.map +1 -0
- package/lib/module/shared/adapters/with-screen-transitions/index.js +66 -0
- package/lib/module/shared/adapters/with-screen-transitions/index.js.map +1 -0
- package/lib/module/shared/adapters/with-screen-transitions/options.js +98 -0
- package/lib/module/shared/adapters/with-screen-transitions/options.js.map +1 -0
- package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js +138 -0
- package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -0
- package/lib/module/shared/adapters/with-screen-transitions/types.js +4 -0
- package/lib/module/shared/adapters/with-screen-transitions/types.js.map +1 -0
- package/lib/module/shared/components/activity/helpers.js +5 -0
- package/lib/module/shared/components/activity/helpers.js.map +1 -0
- package/lib/module/shared/components/activity/index.js +5 -0
- package/lib/module/shared/components/activity/index.js.map +1 -0
- package/lib/module/shared/components/activity/variants/activity-container.js +24 -0
- package/lib/module/shared/components/activity/variants/activity-container.js.map +1 -0
- package/lib/module/shared/components/activity/variants/activity-screen.js +103 -0
- package/lib/module/shared/components/activity/variants/activity-screen.js.map +1 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js +11 -5
- package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js +11 -0
- package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js.map +1 -1
- package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +8 -17
- package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
- package/lib/module/shared/components/screen-lifecycle/index.js +1 -1
- package/lib/module/shared/components/screen-lifecycle/index.js.map +1 -1
- package/lib/module/shared/hooks/navigation/use-navigation-helpers.js +11 -5
- package/lib/module/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
- package/lib/module/shared/hooks/navigation/use-stack.js +63 -6
- package/lib/module/shared/hooks/navigation/use-stack.js.map +1 -1
- package/lib/module/shared/index.js +3 -0
- package/lib/module/shared/index.js.map +1 -1
- package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js +17 -29
- package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js.map +1 -1
- package/lib/module/shared/providers/screen/descriptors/index.js +1 -1
- package/lib/module/shared/providers/screen/descriptors/index.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js +2 -1
- package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js +2 -2
- package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js +5 -2
- package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js +4 -3
- package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js +5 -2
- package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js.map +1 -1
- package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js +4 -3
- package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js.map +1 -1
- package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
- package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
- package/lib/module/shared/providers/stack/direct.provider.js +5 -4
- package/lib/module/shared/providers/stack/direct.provider.js.map +1 -1
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +194 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +57 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +69 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +118 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +4 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js +19 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +126 -0
- package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
- package/lib/module/shared/providers/stack/managed.provider.js +19 -30
- package/lib/module/shared/providers/stack/managed.provider.js.map +1 -1
- package/lib/module/shared/types/stack.types.js.map +1 -1
- package/lib/module/shared/utils/create-provider.js +100 -11
- package/lib/module/shared/utils/create-provider.js.map +1 -1
- package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
- package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
- package/lib/module/shared/utils/navigation/sync-routes-with-removed.js +23 -6
- package/lib/module/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
- package/lib/module/shared/utils/visibility-block-offset.js +8 -0
- package/lib/module/shared/utils/visibility-block-offset.js.map +1 -0
- package/lib/typescript/blank-stack/components/stack-view.d.ts.map +1 -1
- package/lib/typescript/blank-stack/index.d.ts +1 -1
- package/lib/typescript/blank-stack/index.d.ts.map +1 -1
- package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts +4 -6
- package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -1
- package/lib/typescript/blank-stack/types.d.ts +41 -29
- package/lib/typescript/blank-stack/types.d.ts.map +1 -1
- package/lib/typescript/component-stack/components/stack-view.d.ts.map +1 -1
- package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts +1 -1
- package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +5 -0
- package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +25 -0
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts +15 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts.map +1 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts +11 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts.map +1 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts +16 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts.map +1 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts +12 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts.map +1 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts +24 -0
- package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts.map +1 -0
- package/lib/typescript/shared/components/activity/helpers.d.ts +4 -0
- package/lib/typescript/shared/components/activity/helpers.d.ts.map +1 -0
- package/lib/typescript/shared/components/activity/index.d.ts +3 -0
- package/lib/typescript/shared/components/activity/index.d.ts.map +1 -0
- package/lib/typescript/shared/components/activity/variants/activity-container.d.ts +6 -0
- package/lib/typescript/shared/components/activity/variants/activity-container.d.ts.map +1 -0
- package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts +13 -0
- package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts.map +1 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-measurer.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/index.d.ts +2 -2
- package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts +1 -0
- package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts.map +1 -1
- package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts +1 -2
- package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts +1 -0
- package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/navigation/use-stack.d.ts +13 -1
- package/lib/typescript/shared/hooks/navigation/use-stack.d.ts.map +1 -1
- package/lib/typescript/shared/index.d.ts +15 -11
- package/lib/typescript/shared/index.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts +11 -3
- package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/descriptors/index.d.ts +1 -1
- package/lib/typescript/shared/providers/screen/descriptors/index.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/gestures/ownership/resolve-ownership.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pan/use-pan-behavior.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/gestures/pinch/use-pinch-behavior.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts +3 -1
- package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
- package/lib/typescript/shared/providers/stack/direct.provider.d.ts.map +1 -1
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts +13 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts +12 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts +11 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts +12 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts +40 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts +12 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts +13 -0
- package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts.map +1 -0
- package/lib/typescript/shared/providers/stack/managed.provider.d.ts.map +1 -1
- package/lib/typescript/shared/types/index.d.ts +2 -2
- package/lib/typescript/shared/types/index.d.ts.map +1 -1
- package/lib/typescript/shared/types/providers/managed-stack.types.d.ts +3 -9
- package/lib/typescript/shared/types/providers/managed-stack.types.d.ts.map +1 -1
- package/lib/typescript/shared/types/screen.types.d.ts +24 -0
- package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
- package/lib/typescript/shared/types/stack.types.d.ts +7 -0
- package/lib/typescript/shared/types/stack.types.d.ts.map +1 -1
- package/lib/typescript/shared/utils/create-provider.d.ts +17 -3
- package/lib/typescript/shared/utils/create-provider.d.ts.map +1 -1
- package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts +2 -1
- package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts.map +1 -1
- package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts +2 -1
- package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts.map +1 -1
- package/lib/typescript/shared/utils/visibility-block-offset.d.ts +2 -0
- package/lib/typescript/shared/utils/visibility-block-offset.d.ts.map +1 -0
- package/package.json +11 -1
- package/src/blank-stack/components/stack-view.tsx +54 -48
- package/src/blank-stack/index.ts +1 -0
- package/src/blank-stack/navigators/create-blank-stack-navigator.tsx +7 -15
- package/src/blank-stack/types.ts +44 -29
- package/src/component-stack/components/stack-view.tsx +4 -11
- package/src/component-stack/navigators/create-component-stack-navigator.tsx +1 -1
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +5 -0
- package/src/native-stack/types.ts +25 -0
- package/src/shared/adapters/with-screen-transitions/context.tsx +42 -0
- package/src/shared/adapters/with-screen-transitions/index.tsx +155 -0
- package/src/shared/adapters/with-screen-transitions/options.ts +172 -0
- package/src/shared/adapters/with-screen-transitions/stack-layout.tsx +233 -0
- package/src/shared/adapters/with-screen-transitions/types.ts +28 -0
- package/src/shared/components/activity/helpers.ts +8 -0
- package/src/shared/components/activity/index.tsx +2 -0
- package/src/shared/components/activity/variants/activity-container.tsx +25 -0
- package/src/shared/components/activity/variants/activity-screen.tsx +133 -0
- package/src/shared/components/create-boundary-component/hooks/use-measurer.ts +23 -4
- package/src/shared/components/create-boundary-component/utils/measured-bounds.ts +15 -0
- package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +9 -26
- package/src/shared/components/screen-lifecycle/index.tsx +1 -1
- package/src/shared/hooks/navigation/use-navigation-helpers.ts +9 -3
- package/src/shared/hooks/navigation/use-stack.tsx +115 -6
- package/src/shared/index.ts +9 -0
- package/src/shared/providers/screen/descriptors/descriptors.provider.tsx +31 -31
- package/src/shared/providers/screen/descriptors/index.tsx +1 -0
- package/src/shared/providers/screen/gestures/ownership/resolve-ownership.ts +2 -1
- package/src/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.ts +2 -2
- package/src/shared/providers/screen/gestures/pan/pan-lifecycle.ts +7 -2
- package/src/shared/providers/screen/gestures/pan/use-pan-behavior.ts +10 -2
- package/src/shared/providers/screen/gestures/pinch/pinch-lifecycle.ts +7 -2
- package/src/shared/providers/screen/gestures/pinch/use-pinch-behavior.ts +8 -3
- package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +17 -1
- package/src/shared/providers/stack/direct.provider.tsx +13 -4
- package/src/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.ts +368 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.ts +129 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.ts +139 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.ts +198 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/helpers/types.ts +57 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/index.ts +40 -0
- package/src/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.ts +160 -0
- package/src/shared/providers/stack/managed.provider.tsx +23 -39
- package/src/shared/types/index.ts +3 -0
- package/src/shared/types/providers/managed-stack.types.ts +6 -8
- package/src/shared/types/screen.types.ts +25 -0
- package/src/shared/types/stack.types.ts +11 -0
- package/src/shared/utils/create-provider.tsx +183 -8
- package/src/shared/utils/navigation/resolve-scene-neighbors.ts +9 -4
- package/src/shared/utils/navigation/sync-routes-with-removed.ts +38 -7
- package/src/shared/utils/visibility-block-offset.ts +4 -0
- package/lib/commonjs/blank-stack/components/stack-view.native.js +0 -64
- package/lib/commonjs/blank-stack/components/stack-view.native.js.map +0 -1
- package/lib/commonjs/shared/components/native-screen-container.js +0 -42
- package/lib/commonjs/shared/components/native-screen-container.js.map +0 -1
- package/lib/commonjs/shared/components/native-screen.js +0 -125
- package/lib/commonjs/shared/components/native-screen.js.map +0 -1
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -51
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -15
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -14
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -13
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js +0 -101
- package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
- package/lib/module/blank-stack/components/stack-view.native.js +0 -60
- package/lib/module/blank-stack/components/stack-view.native.js.map +0 -1
- package/lib/module/shared/components/native-screen-container.js +0 -37
- package/lib/module/shared/components/native-screen-container.js.map +0 -1
- package/lib/module/shared/components/native-screen.js +0 -119
- package/lib/module/shared/components/native-screen.js.map +0 -1
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -47
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -10
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -9
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -8
- package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
- package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js +0 -95
- package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
- package/lib/typescript/blank-stack/components/stack-view.native.d.ts +0 -3
- package/lib/typescript/blank-stack/components/stack-view.native.d.ts.map +0 -1
- package/lib/typescript/shared/components/native-screen-container.d.ts +0 -6
- package/lib/typescript/shared/components/native-screen-container.d.ts.map +0 -1
- package/lib/typescript/shared/components/native-screen.d.ts +0 -12
- package/lib/typescript/shared/components/native-screen.d.ts.map +0 -1
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts +0 -10
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts.map +0 -1
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts +0 -2
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts.map +0 -1
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts +0 -3
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts.map +0 -1
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts +0 -3
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts.map +0 -1
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts +0 -19
- package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts.map +0 -1
- package/src/blank-stack/components/stack-view.native.tsx +0 -74
- package/src/shared/components/native-screen-container.tsx +0 -33
- package/src/shared/components/native-screen.tsx +0 -176
- package/src/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.ts +0 -65
- package/src/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.ts +0 -15
- package/src/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.ts +0 -12
- package/src/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.ts +0 -11
- package/src/shared/providers/stack/helpers/use-local-routes/index.ts +0 -147
|
@@ -2,9 +2,10 @@ import type { Route } from "@react-navigation/native";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import {
|
|
5
|
-
StackContext,
|
|
6
5
|
type StackContextValue,
|
|
6
|
+
StackProvider,
|
|
7
7
|
} from "../../hooks/navigation/use-stack";
|
|
8
|
+
import { AnimationStore } from "../../stores/animation.store";
|
|
8
9
|
import type {
|
|
9
10
|
ManagedStackContextValue,
|
|
10
11
|
ManagedStackProps,
|
|
@@ -17,9 +18,7 @@ import type {
|
|
|
17
18
|
BaseStackScene,
|
|
18
19
|
} from "../../types/stack.types";
|
|
19
20
|
import { useStackCoreContext } from "./core.provider";
|
|
20
|
-
import {
|
|
21
|
-
import { useLocalRoutes } from "./helpers/use-local-routes";
|
|
22
|
-
import { useProcessedRoutes } from "./helpers/use-processed-routes";
|
|
21
|
+
import { useManagedStackState } from "./helpers/managed-stack-state";
|
|
23
22
|
import { useStackDerived } from "./helpers/use-stack-derived";
|
|
24
23
|
|
|
25
24
|
const ManagedStackContext =
|
|
@@ -43,70 +42,55 @@ function useManagedStackValue<
|
|
|
43
42
|
props: ManagedStackProps<TDescriptor, TNavigation>,
|
|
44
43
|
): ManagedStackResult<TDescriptor> {
|
|
45
44
|
const { flags } = useStackCoreContext();
|
|
46
|
-
const { state, handleCloseRoute,
|
|
45
|
+
const { state, handleCloseRoute, requestDismiss } =
|
|
46
|
+
useManagedStackState(props);
|
|
47
47
|
const navigatorKey = props.state.key;
|
|
48
48
|
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
processed.routeKeys,
|
|
53
|
-
processed.animationMaps,
|
|
49
|
+
const animationMaps = useMemo(
|
|
50
|
+
() => state.routeKeys.map((routeKey) => AnimationStore.getBag(routeKey)),
|
|
51
|
+
[state.routeKeys],
|
|
54
52
|
);
|
|
53
|
+
const { optimisticFocusedIndex } = useStackDerived(animationMaps);
|
|
55
54
|
|
|
56
55
|
const focusedIndex = props.state.index;
|
|
57
56
|
|
|
58
|
-
// Common stack context (consumed by useStack())
|
|
59
57
|
const stackContextValue = useMemo<StackContextValue>(
|
|
60
58
|
() => ({
|
|
61
59
|
flags,
|
|
62
60
|
navigatorKey,
|
|
63
|
-
routeKeys:
|
|
61
|
+
routeKeys: state.routeKeys,
|
|
64
62
|
routes: state.routes as Route<string>[],
|
|
65
|
-
scenes:
|
|
63
|
+
scenes: state.scenes as BaseStackScene[],
|
|
66
64
|
optimisticFocusedIndex,
|
|
65
|
+
focusedIndex,
|
|
66
|
+
requestDismiss,
|
|
67
67
|
}),
|
|
68
68
|
[
|
|
69
69
|
flags,
|
|
70
70
|
navigatorKey,
|
|
71
|
-
|
|
71
|
+
state.routeKeys,
|
|
72
72
|
state.routes,
|
|
73
|
-
|
|
73
|
+
state.scenes,
|
|
74
74
|
optimisticFocusedIndex,
|
|
75
|
+
focusedIndex,
|
|
76
|
+
requestDismiss,
|
|
75
77
|
],
|
|
76
78
|
);
|
|
77
79
|
|
|
78
|
-
// Managed-specific context (consumed by useManagedStackContext())
|
|
79
80
|
const managedContextValue = useMemo<ManagedStackContextValue>(
|
|
80
81
|
() => ({
|
|
81
|
-
activeScreensLimit: processed.activeScreensLimit,
|
|
82
|
-
closingRouteKeysShared: closingRouteKeys.shared,
|
|
83
82
|
handleCloseRoute,
|
|
84
|
-
backdropBehaviors: processed.backdropBehaviors,
|
|
85
83
|
}),
|
|
86
|
-
[
|
|
87
|
-
processed.activeScreensLimit,
|
|
88
|
-
closingRouteKeys.shared,
|
|
89
|
-
handleCloseRoute,
|
|
90
|
-
processed.backdropBehaviors,
|
|
91
|
-
],
|
|
84
|
+
[handleCloseRoute],
|
|
92
85
|
);
|
|
93
86
|
|
|
94
|
-
// Combined props for render children (stack-view components)
|
|
95
87
|
const renderProps = useMemo<ManagedStackRenderProps<TDescriptor>>(
|
|
96
88
|
() => ({
|
|
97
|
-
|
|
98
|
-
scenes: processed.scenes,
|
|
89
|
+
scenes: state.scenes,
|
|
99
90
|
focusedIndex,
|
|
100
|
-
|
|
101
|
-
shouldShowFloatOverlay: processed.shouldShowFloatOverlay,
|
|
91
|
+
shouldShowFloatOverlay: state.shouldShowFloatOverlay,
|
|
102
92
|
}),
|
|
103
|
-
[
|
|
104
|
-
state.descriptors,
|
|
105
|
-
processed.scenes,
|
|
106
|
-
focusedIndex,
|
|
107
|
-
closingRouteMap,
|
|
108
|
-
processed.shouldShowFloatOverlay,
|
|
109
|
-
],
|
|
93
|
+
[state.scenes, focusedIndex, state.shouldShowFloatOverlay],
|
|
110
94
|
);
|
|
111
95
|
|
|
112
96
|
return { stackContextValue, managedContextValue, renderProps };
|
|
@@ -125,11 +109,11 @@ function withManagedStack<
|
|
|
125
109
|
useManagedStackValue<TDescriptor, TNavigation>(props);
|
|
126
110
|
|
|
127
111
|
return (
|
|
128
|
-
<
|
|
112
|
+
<StackProvider value={stackContextValue}>
|
|
129
113
|
<ManagedStackContext.Provider value={managedContextValue}>
|
|
130
114
|
<Component {...renderProps} />
|
|
131
115
|
</ManagedStackContext.Provider>
|
|
132
|
-
</
|
|
116
|
+
</StackProvider>
|
|
133
117
|
);
|
|
134
118
|
};
|
|
135
119
|
}
|
|
@@ -34,6 +34,7 @@ export type {
|
|
|
34
34
|
export type { OverlayProps } from "./overlay.types";
|
|
35
35
|
export type {
|
|
36
36
|
GestureTracking,
|
|
37
|
+
InactiveBehavior,
|
|
37
38
|
Layout,
|
|
38
39
|
ScreenKey,
|
|
39
40
|
ScreenTransitionConfig,
|
|
@@ -46,4 +47,6 @@ export type {
|
|
|
46
47
|
BaseStackScene,
|
|
47
48
|
BaseStackState,
|
|
48
49
|
DescriptorMap,
|
|
50
|
+
StackDescriptorSource,
|
|
51
|
+
StackSceneActivity,
|
|
49
52
|
} from "./stack.types";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { SharedValue } from "react-native-reanimated";
|
|
2
1
|
import type { StackContextValue } from "../../hooks/navigation/use-stack";
|
|
3
2
|
import type {
|
|
4
3
|
BaseStackDescriptor,
|
|
@@ -6,6 +5,7 @@ import type {
|
|
|
6
5
|
BaseStackRoute,
|
|
7
6
|
BaseStackScene,
|
|
8
7
|
BaseStackState,
|
|
8
|
+
StackDescriptorSource,
|
|
9
9
|
} from "../stack.types";
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -18,8 +18,11 @@ export interface ManagedStackProps<
|
|
|
18
18
|
> {
|
|
19
19
|
state: BaseStackState<TDescriptor["route"]>;
|
|
20
20
|
navigation: TNavigation;
|
|
21
|
-
descriptors: Record<string, TDescriptor
|
|
22
|
-
describe: (
|
|
21
|
+
descriptors: Record<string, StackDescriptorSource<TDescriptor>>;
|
|
22
|
+
describe: (
|
|
23
|
+
route: TDescriptor["route"],
|
|
24
|
+
placeholder: boolean,
|
|
25
|
+
) => StackDescriptorSource<TDescriptor>;
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
/**
|
|
@@ -27,10 +30,7 @@ export interface ManagedStackProps<
|
|
|
27
30
|
* Shared fields (routes, scenes, etc.) live in StackContext.
|
|
28
31
|
*/
|
|
29
32
|
export interface ManagedStackContextValue {
|
|
30
|
-
activeScreensLimit: number;
|
|
31
|
-
closingRouteKeysShared: SharedValue<string[]>;
|
|
32
33
|
handleCloseRoute: (payload: { route: BaseStackRoute }) => void;
|
|
33
|
-
backdropBehaviors: string[];
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -40,10 +40,8 @@ export interface ManagedStackContextValue {
|
|
|
40
40
|
export interface ManagedStackRenderProps<
|
|
41
41
|
TDescriptor extends BaseStackDescriptor = BaseStackDescriptor,
|
|
42
42
|
> {
|
|
43
|
-
descriptors: Record<string, TDescriptor>;
|
|
44
43
|
scenes: BaseStackScene<TDescriptor>[];
|
|
45
44
|
focusedIndex: number;
|
|
46
|
-
closingRouteMap: React.RefObject<Readonly<Record<string, true>>>;
|
|
47
45
|
shouldShowFloatOverlay: boolean;
|
|
48
46
|
}
|
|
49
47
|
|
|
@@ -43,6 +43,31 @@ export type SnapPoint = number | "auto";
|
|
|
43
43
|
|
|
44
44
|
export type BackdropBehavior = "block" | "passthrough" | "dismiss" | "collapse";
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Controls how an inactive screen is retained after it is no longer active.
|
|
48
|
+
*
|
|
49
|
+
* - `keep`
|
|
50
|
+
* keep inactive screen mounted, attached, visible, not interactive
|
|
51
|
+
* RNS: activityState=1, visible=true
|
|
52
|
+
* React Activity: mode="visible"
|
|
53
|
+
*
|
|
54
|
+
* - `freeze`
|
|
55
|
+
* keep last painted UI visible but stop/suspend inactive work where platform allows
|
|
56
|
+
* RNS: activityState=1, visible=true, maybe freezeOnBlur/shouldFreeze later
|
|
57
|
+
* React Activity: mode="hidden" with paint preserved
|
|
58
|
+
*
|
|
59
|
+
* - `detach`
|
|
60
|
+
* remove inactive screen from native/view presentation after safe paint
|
|
61
|
+
* RNS: activityState=0, visible=false
|
|
62
|
+
* React Activity: mode="hidden" + display none, or equivalent
|
|
63
|
+
*
|
|
64
|
+
* - `unmount`
|
|
65
|
+
* actually remove React subtree when the inactive screen is safe to remove
|
|
66
|
+
* RNS native: only after safe paint for non-nested screens
|
|
67
|
+
* web: return null
|
|
68
|
+
*/
|
|
69
|
+
export type InactiveBehavior = "keep" | "freeze" | "detach" | "unmount";
|
|
70
|
+
|
|
46
71
|
export type TransitionAwareProps<T extends object> = AnimatedProps<T> & {
|
|
47
72
|
/**
|
|
48
73
|
* Connects this component to custom animated styles defined in screenStyleInterpolator.
|
|
@@ -18,6 +18,8 @@ export interface BaseStackRoute {
|
|
|
18
18
|
params?: object;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
export type StackSceneActivity = "active" | "inert" | "inactive" | "closing";
|
|
22
|
+
|
|
21
23
|
/**
|
|
22
24
|
* Base navigation interface - minimal contract for gesture handling.
|
|
23
25
|
* Both React Navigation helpers and ComponentNavigation satisfy this.
|
|
@@ -45,9 +47,16 @@ export interface BaseStackDescriptor<
|
|
|
45
47
|
route: TRoute;
|
|
46
48
|
navigation: TNavigation;
|
|
47
49
|
options: TOptions;
|
|
50
|
+
activity?: StackSceneActivity;
|
|
48
51
|
render?: () => React.JSX.Element | null;
|
|
49
52
|
}
|
|
50
53
|
|
|
54
|
+
export type StackDescriptorSource<
|
|
55
|
+
TDescriptor extends BaseStackDescriptor = BaseStackDescriptor,
|
|
56
|
+
> = Omit<TDescriptor, "activity"> & {
|
|
57
|
+
activity?: StackSceneActivity;
|
|
58
|
+
};
|
|
59
|
+
|
|
51
60
|
/**
|
|
52
61
|
* Base scene interface - route + descriptor pair.
|
|
53
62
|
* Used by all stack views to iterate over screens.
|
|
@@ -57,6 +66,8 @@ export interface BaseStackScene<
|
|
|
57
66
|
> {
|
|
58
67
|
route: TDescriptor["route"];
|
|
59
68
|
descriptor: TDescriptor;
|
|
69
|
+
previousDescriptor?: TDescriptor;
|
|
70
|
+
nextDescriptor?: TDescriptor;
|
|
60
71
|
}
|
|
61
72
|
|
|
62
73
|
/**
|
|
@@ -6,12 +6,82 @@
|
|
|
6
6
|
import {
|
|
7
7
|
createContext,
|
|
8
8
|
type ReactNode,
|
|
9
|
+
useCallback,
|
|
9
10
|
useContext,
|
|
11
|
+
useLayoutEffect,
|
|
10
12
|
useMemo,
|
|
11
13
|
useRef,
|
|
14
|
+
useSyncExternalStore,
|
|
12
15
|
} from "react";
|
|
13
16
|
|
|
14
|
-
type InnerProviderComponent =
|
|
17
|
+
type InnerProviderComponent = React.FC<{ children: ReactNode }>;
|
|
18
|
+
|
|
19
|
+
type ProviderSnapshot<
|
|
20
|
+
ContextValue,
|
|
21
|
+
Guarded extends boolean,
|
|
22
|
+
> = Guarded extends true ? ContextValue : ContextValue | null;
|
|
23
|
+
|
|
24
|
+
type ProviderSelector<ContextValue, Guarded extends boolean, Selected> = (
|
|
25
|
+
value: ProviderSnapshot<ContextValue, Guarded>,
|
|
26
|
+
) => Selected;
|
|
27
|
+
|
|
28
|
+
type ProviderStoreHook<ContextValue, Guarded extends boolean> = {
|
|
29
|
+
(): ProviderSnapshot<ContextValue, Guarded>;
|
|
30
|
+
<Selected>(
|
|
31
|
+
selector: ProviderSelector<ContextValue, Guarded, Selected>,
|
|
32
|
+
): Selected;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type ProviderOptionalStoreHook<ContextValue> = {
|
|
36
|
+
(): ContextValue | null;
|
|
37
|
+
<Selected>(selector: (value: ContextValue | null) => Selected): Selected;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export interface ProviderStoreApi<ContextValue> {
|
|
41
|
+
getSnapshot: () => ContextValue | null;
|
|
42
|
+
subscribe: (listener: () => void) => () => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface MutableProviderStoreApi<ContextValue>
|
|
46
|
+
extends ProviderStoreApi<ContextValue> {
|
|
47
|
+
notify: () => void;
|
|
48
|
+
setSnapshot: (snapshot: ContextValue | null) => boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const NullProviderStore: ProviderStoreApi<never> = {
|
|
52
|
+
getSnapshot: () => null,
|
|
53
|
+
subscribe: () => () => {},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const createProviderStore = <ContextValue,>(
|
|
57
|
+
initialSnapshot: ContextValue | null,
|
|
58
|
+
): MutableProviderStoreApi<ContextValue> => {
|
|
59
|
+
let snapshot = initialSnapshot;
|
|
60
|
+
const listeners = new Set<() => void>();
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
getSnapshot: () => snapshot,
|
|
64
|
+
notify: () => {
|
|
65
|
+
for (const listener of listeners) {
|
|
66
|
+
listener();
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
setSnapshot: (nextSnapshot) => {
|
|
70
|
+
if (Object.is(snapshot, nextSnapshot)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
snapshot = nextSnapshot;
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
subscribe: (listener) => {
|
|
78
|
+
listeners.add(listener);
|
|
79
|
+
return () => {
|
|
80
|
+
listeners.delete(listener);
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
};
|
|
15
85
|
|
|
16
86
|
export default function createProvider<
|
|
17
87
|
ProviderName extends string,
|
|
@@ -31,10 +101,17 @@ export default function createProvider<
|
|
|
31
101
|
},
|
|
32
102
|
) => {
|
|
33
103
|
const { guarded = true } = options ?? {};
|
|
104
|
+
const providerDisplayName = `${name}Provider`;
|
|
105
|
+
const innerProviderDisplayName = `${name}InnerProvider`;
|
|
34
106
|
|
|
35
107
|
const Context = createContext<ContextValue | null>(null);
|
|
36
108
|
Context.displayName = name;
|
|
37
109
|
|
|
110
|
+
const StoreContext = createContext<ProviderStoreApi<ContextValue> | null>(
|
|
111
|
+
null,
|
|
112
|
+
);
|
|
113
|
+
StoreContext.displayName = `${name}Store`;
|
|
114
|
+
|
|
38
115
|
const Provider: React.FC<ProviderProps> = (props) => {
|
|
39
116
|
const {
|
|
40
117
|
children = (props as { children?: ReactNode }).children,
|
|
@@ -53,20 +130,46 @@ export default function createProvider<
|
|
|
53
130
|
[enabled, value],
|
|
54
131
|
);
|
|
55
132
|
|
|
133
|
+
const storeRef = useRef<MutableProviderStoreApi<ContextValue> | null>(
|
|
134
|
+
null,
|
|
135
|
+
);
|
|
136
|
+
const pendingNotifyRef = useRef(false);
|
|
137
|
+
|
|
138
|
+
if (storeRef.current === null) {
|
|
139
|
+
storeRef.current = createProviderStore<ContextValue>(memoValue);
|
|
140
|
+
}
|
|
141
|
+
const store = storeRef.current;
|
|
142
|
+
|
|
143
|
+
pendingNotifyRef.current =
|
|
144
|
+
store.setSnapshot(memoValue) || pendingNotifyRef.current;
|
|
145
|
+
|
|
146
|
+
useLayoutEffect(() => {
|
|
147
|
+
if (!pendingNotifyRef.current) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
pendingNotifyRef.current = false;
|
|
152
|
+
store.notify();
|
|
153
|
+
});
|
|
154
|
+
|
|
56
155
|
// Per-instance ref ensures InnerProvider reads latest value while keeping
|
|
57
156
|
// a stable component reference.
|
|
58
157
|
const valueRef = useRef<ContextValue | null>(memoValue);
|
|
59
158
|
valueRef.current = memoValue;
|
|
60
159
|
|
|
61
|
-
const InnerProvider = useMemo(
|
|
62
|
-
|
|
63
|
-
|
|
160
|
+
const InnerProvider = useMemo((): InnerProviderComponent => {
|
|
161
|
+
const NamedInnerProvider: InnerProviderComponent = ({ children }) => (
|
|
162
|
+
<StoreContext.Provider value={store}>
|
|
64
163
|
<Context.Provider value={valueRef.current}>
|
|
65
164
|
{children}
|
|
66
165
|
</Context.Provider>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
166
|
+
</StoreContext.Provider>
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
NamedInnerProvider.displayName = innerProviderDisplayName;
|
|
170
|
+
|
|
171
|
+
return NamedInnerProvider;
|
|
172
|
+
}, [store]);
|
|
70
173
|
|
|
71
174
|
if (typeof children === "function") {
|
|
72
175
|
return children({
|
|
@@ -74,8 +177,13 @@ export default function createProvider<
|
|
|
74
177
|
} as { [K in ProviderName as `${K}Provider`]: InnerProviderComponent });
|
|
75
178
|
}
|
|
76
179
|
|
|
77
|
-
return
|
|
180
|
+
return (
|
|
181
|
+
<StoreContext.Provider value={store}>
|
|
182
|
+
<Context.Provider value={memoValue}>{children}</Context.Provider>
|
|
183
|
+
</StoreContext.Provider>
|
|
184
|
+
);
|
|
78
185
|
};
|
|
186
|
+
Provider.displayName = providerDisplayName;
|
|
79
187
|
|
|
80
188
|
const useEnhancedContext = (): ContextValue | null => {
|
|
81
189
|
const context = useContext(Context);
|
|
@@ -89,18 +197,85 @@ export default function createProvider<
|
|
|
89
197
|
return context;
|
|
90
198
|
};
|
|
91
199
|
|
|
200
|
+
const useStoreSelector = <Selected,>(
|
|
201
|
+
selector?: (value: ContextValue | null) => Selected,
|
|
202
|
+
): Selected | ContextValue | null => {
|
|
203
|
+
const store = useContext(StoreContext);
|
|
204
|
+
const resolvedStore =
|
|
205
|
+
store ?? (NullProviderStore as ProviderStoreApi<ContextValue>);
|
|
206
|
+
const selectorRef = useRef<typeof selector>(selector);
|
|
207
|
+
selectorRef.current = selector;
|
|
208
|
+
|
|
209
|
+
const getSelectedSnapshot = useCallback(() => {
|
|
210
|
+
if (guarded && store === null) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
`${name} store must be used within a ${name}Provider`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const snapshot = resolvedStore.getSnapshot();
|
|
217
|
+
|
|
218
|
+
if (guarded && snapshot === null) {
|
|
219
|
+
throw new Error(
|
|
220
|
+
`${name} store must be used within an enabled ${name}Provider`,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return selectorRef.current ? selectorRef.current(snapshot) : snapshot;
|
|
225
|
+
}, [resolvedStore, store]);
|
|
226
|
+
|
|
227
|
+
return useSyncExternalStore(
|
|
228
|
+
resolvedStore.subscribe,
|
|
229
|
+
getSelectedSnapshot,
|
|
230
|
+
getSelectedSnapshot,
|
|
231
|
+
);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const useOptionalStoreSelector = <Selected,>(
|
|
235
|
+
selector?: (value: ContextValue | null) => Selected,
|
|
236
|
+
): Selected | ContextValue | null => {
|
|
237
|
+
const store = useContext(StoreContext);
|
|
238
|
+
const resolvedStore =
|
|
239
|
+
store ?? (NullProviderStore as ProviderStoreApi<ContextValue>);
|
|
240
|
+
const selectorRef = useRef<typeof selector>(selector);
|
|
241
|
+
selectorRef.current = selector;
|
|
242
|
+
|
|
243
|
+
const getSelectedSnapshot = useCallback(() => {
|
|
244
|
+
const snapshot = resolvedStore.getSnapshot();
|
|
245
|
+
return selectorRef.current ? selectorRef.current(snapshot) : snapshot;
|
|
246
|
+
}, [resolvedStore]);
|
|
247
|
+
|
|
248
|
+
return useSyncExternalStore(
|
|
249
|
+
resolvedStore.subscribe,
|
|
250
|
+
getSelectedSnapshot,
|
|
251
|
+
getSelectedSnapshot,
|
|
252
|
+
);
|
|
253
|
+
};
|
|
254
|
+
|
|
92
255
|
return {
|
|
93
256
|
[`${name}Context`]: Context,
|
|
257
|
+
[`${name}StoreContext`]: StoreContext,
|
|
94
258
|
[`${name}Provider`]: Provider,
|
|
95
259
|
[`use${name}Context`]: useEnhancedContext,
|
|
260
|
+
[`use${name}Store`]: useStoreSelector,
|
|
261
|
+
[`use${name}OptionalStore`]: useOptionalStoreSelector,
|
|
96
262
|
} as {
|
|
97
263
|
[P in ProviderName as `${P}Context`]: React.Context<ContextValue>;
|
|
264
|
+
} & {
|
|
265
|
+
[P in ProviderName as `${P}StoreContext`]: React.Context<ProviderStoreApi<ContextValue> | null>;
|
|
98
266
|
} & {
|
|
99
267
|
[P in ProviderName as `${P}Provider`]: React.FC<ProviderProps>;
|
|
100
268
|
} & {
|
|
101
269
|
[P in ProviderName as `use${P}Context`]: () => Guarded extends true
|
|
102
270
|
? ContextValue
|
|
103
271
|
: ContextValue | null;
|
|
272
|
+
} & {
|
|
273
|
+
[P in ProviderName as `use${P}Store`]: ProviderStoreHook<
|
|
274
|
+
ContextValue,
|
|
275
|
+
Guarded
|
|
276
|
+
>;
|
|
277
|
+
} & {
|
|
278
|
+
[P in ProviderName as `use${P}OptionalStore`]: ProviderOptionalStoreHook<ContextValue>;
|
|
104
279
|
};
|
|
105
280
|
};
|
|
106
281
|
}
|
|
@@ -4,6 +4,7 @@ interface SceneWithKey {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
type IsRouteClosing = (routeKey: string) => boolean;
|
|
7
|
+
type GetRouteClosingOrder = (routeKey: string) => number | undefined;
|
|
7
8
|
|
|
8
9
|
const findPreviousDescriptor = <T extends SceneWithKey>(
|
|
9
10
|
scenes: T[],
|
|
@@ -45,6 +46,7 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
|
|
|
45
46
|
scenes: T[],
|
|
46
47
|
sceneIndex: number,
|
|
47
48
|
isRouteClosing: IsRouteClosing,
|
|
49
|
+
getRouteClosingOrder?: GetRouteClosingOrder,
|
|
48
50
|
): {
|
|
49
51
|
previousDescriptor: T["descriptor"] | undefined;
|
|
50
52
|
nextDescriptor: T["descriptor"] | undefined;
|
|
@@ -69,7 +71,8 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
|
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
let nextDescriptor: T["descriptor"] | undefined;
|
|
72
|
-
let
|
|
74
|
+
let latestClosingAbove: T["descriptor"] | undefined;
|
|
75
|
+
let latestClosingAboveOrder = Number.NEGATIVE_INFINITY;
|
|
73
76
|
|
|
74
77
|
for (let i = sceneIndex + 1; i < scenes.length; i++) {
|
|
75
78
|
const candidate = scenes[i];
|
|
@@ -80,13 +83,15 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
|
|
|
80
83
|
break;
|
|
81
84
|
}
|
|
82
85
|
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
const closeOrder = getRouteClosingOrder?.(candidate.route.key) ?? i;
|
|
87
|
+
if (closeOrder >= latestClosingAboveOrder) {
|
|
88
|
+
latestClosingAbove = candidate.descriptor;
|
|
89
|
+
latestClosingAboveOrder = closeOrder;
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
if (nextDescriptor === undefined) {
|
|
89
|
-
nextDescriptor =
|
|
94
|
+
nextDescriptor = latestClosingAbove;
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
const previousDescriptor = findPreviousDescriptor(
|
|
@@ -2,6 +2,8 @@ import type { useClosingRouteKeys } from "../../hooks/navigation/use-closing-rou
|
|
|
2
2
|
import type { RouteWithKey } from "../../types/stack.types";
|
|
3
3
|
import { composeDescriptors } from "./compose-descriptors";
|
|
4
4
|
|
|
5
|
+
type ClosingRouteKeys = Set<string> | ReturnType<typeof useClosingRouteKeys>;
|
|
6
|
+
|
|
5
7
|
type SyncRoutesWithRemovedParams<
|
|
6
8
|
Route extends RouteWithKey,
|
|
7
9
|
DescriptorMap extends Record<string, unknown>,
|
|
@@ -10,7 +12,36 @@ type SyncRoutesWithRemovedParams<
|
|
|
10
12
|
prevDescriptors: DescriptorMap;
|
|
11
13
|
nextRoutes: Route[];
|
|
12
14
|
nextDescriptors: DescriptorMap;
|
|
13
|
-
closingRouteKeys:
|
|
15
|
+
closingRouteKeys: ClosingRouteKeys;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const addClosingRouteKey = (
|
|
19
|
+
closingRouteKeys: ClosingRouteKeys,
|
|
20
|
+
key: string,
|
|
21
|
+
) => {
|
|
22
|
+
closingRouteKeys.add(key);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const deleteClosingRouteKey = (
|
|
26
|
+
closingRouteKeys: ClosingRouteKeys,
|
|
27
|
+
key: string,
|
|
28
|
+
) => {
|
|
29
|
+
if (closingRouteKeys instanceof Set) {
|
|
30
|
+
closingRouteKeys.delete(key);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
closingRouteKeys.remove(key);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const getClosingRouteKeyValues = (
|
|
38
|
+
closingRouteKeys: ClosingRouteKeys,
|
|
39
|
+
): Iterable<string> => {
|
|
40
|
+
if (closingRouteKeys instanceof Set) {
|
|
41
|
+
return closingRouteKeys;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return closingRouteKeys.ref.current;
|
|
14
45
|
};
|
|
15
46
|
|
|
16
47
|
/**
|
|
@@ -60,16 +91,16 @@ export const syncRoutesWithRemoved = <
|
|
|
60
91
|
|
|
61
92
|
if (nextRouteWasPresent && !previousRouteStillPresent) {
|
|
62
93
|
// Previous route was removed, mark as closing
|
|
63
|
-
closingRouteKeys
|
|
94
|
+
addClosingRouteKey(closingRouteKeys, previousFocusedRoute.key);
|
|
64
95
|
|
|
65
96
|
derivedRoutes.push(previousFocusedRoute);
|
|
66
97
|
} else {
|
|
67
98
|
// Next route is now active, not closing
|
|
68
|
-
closingRouteKeys
|
|
99
|
+
deleteClosingRouteKey(closingRouteKeys, nextFocusedRoute.key);
|
|
69
100
|
|
|
70
101
|
if (!previousRouteStillPresent) {
|
|
71
102
|
// Previous route needs to be inserted for transition
|
|
72
|
-
closingRouteKeys
|
|
103
|
+
deleteClosingRouteKey(closingRouteKeys, previousFocusedRoute.key);
|
|
73
104
|
|
|
74
105
|
const insertIndex = Math.max(derivedRoutes.length - 1, 0);
|
|
75
106
|
derivedRoutes.splice(insertIndex, 0, previousFocusedRoute);
|
|
@@ -77,14 +108,14 @@ export const syncRoutesWithRemoved = <
|
|
|
77
108
|
}
|
|
78
109
|
} else if (nextFocusedRoute) {
|
|
79
110
|
// Same focused route, ensure it's not marked as closing
|
|
80
|
-
closingRouteKeys
|
|
111
|
+
deleteClosingRouteKey(closingRouteKeys, nextFocusedRoute.key);
|
|
81
112
|
}
|
|
82
113
|
|
|
83
114
|
// Clean up closing keys that are no longer in the route list
|
|
84
115
|
const activeKeys = new Set(derivedRoutes.map((route) => route.key));
|
|
85
|
-
for (const key of Array.from(closingRouteKeys
|
|
116
|
+
for (const key of Array.from(getClosingRouteKeyValues(closingRouteKeys))) {
|
|
86
117
|
if (!activeKeys.has(key)) {
|
|
87
|
-
closingRouteKeys
|
|
118
|
+
deleteClosingRouteKey(closingRouteKeys, key);
|
|
88
119
|
}
|
|
89
120
|
}
|
|
90
121
|
|