react-native-screen-transitions 3.11.2 → 3.11.3

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.
Files changed (255) hide show
  1. package/lib/commonjs/native-stack/views/NativeStackView.native.js +1 -1
  2. package/lib/commonjs/native-stack/views/NativeStackView.native.js.map +1 -1
  3. package/lib/commonjs/shared/components/boundary/components/boundary-lifecycle.js +36 -0
  4. package/lib/commonjs/shared/components/boundary/components/boundary-lifecycle.js.map +1 -0
  5. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js +1 -13
  6. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -1
  7. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +9 -2
  8. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  9. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js +3 -2
  10. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  11. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js +9 -2
  12. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  13. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js +5 -12
  14. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  15. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +25 -43
  16. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  17. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +13 -0
  18. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +1 -0
  19. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +8 -31
  20. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  21. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +14 -19
  22. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +1 -1
  23. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +8 -0
  24. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  25. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +19 -47
  26. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +1 -1
  27. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  28. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -1
  29. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  30. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js +19 -17
  31. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  32. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js +19 -5
  33. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  34. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js +11 -7
  35. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js.map +1 -1
  36. package/lib/commonjs/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js +31 -0
  37. package/lib/commonjs/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js.map +1 -0
  38. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-completion.js +26 -0
  39. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-completion.js.map +1 -0
  40. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +60 -86
  41. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  42. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +1 -5
  43. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  44. package/lib/commonjs/shared/components/screen-lifecycle/index.js +9 -6
  45. package/lib/commonjs/shared/components/screen-lifecycle/index.js.map +1 -1
  46. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js +28 -6
  47. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  48. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js +1 -2
  49. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  50. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +9 -2
  51. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  52. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +4 -5
  53. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  54. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js +2 -3
  55. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js.map +1 -1
  56. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +4 -5
  57. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  58. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js +2 -3
  59. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js.map +1 -1
  60. package/lib/commonjs/shared/providers/screen/gestures/shared/policy.js +9 -5
  61. package/lib/commonjs/shared/providers/screen/gestures/shared/policy.js.map +1 -1
  62. package/lib/commonjs/shared/providers/stack/blank-stack-state/blank-stack-controller.js +5 -1
  63. package/lib/commonjs/shared/providers/stack/blank-stack-state/blank-stack-controller.js.map +1 -1
  64. package/lib/commonjs/shared/stores/bounds/internals/links.js +1 -1
  65. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  66. package/lib/commonjs/shared/stores/system.store.js +1 -2
  67. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  68. package/lib/commonjs/shared/utils/animation/animate-to-progress.js +0 -22
  69. package/lib/commonjs/shared/utils/animation/animate-to-progress.js.map +1 -1
  70. package/lib/commonjs/shared/utils/navigation/close-action-replay.js +22 -0
  71. package/lib/commonjs/shared/utils/navigation/close-action-replay.js.map +1 -0
  72. package/lib/module/native-stack/views/NativeStackView.native.js +1 -1
  73. package/lib/module/native-stack/views/NativeStackView.native.js.map +1 -1
  74. package/lib/module/shared/components/boundary/components/boundary-lifecycle.js +32 -0
  75. package/lib/module/shared/components/boundary/components/boundary-lifecycle.js.map +1 -0
  76. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js +1 -13
  77. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -1
  78. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +9 -2
  79. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  80. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +3 -2
  81. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  82. package/lib/module/shared/components/boundary/hooks/use-measurer.js +9 -2
  83. package/lib/module/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  84. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js +5 -12
  85. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  86. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +27 -45
  87. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  88. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +8 -0
  89. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +1 -0
  90. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +8 -32
  91. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  92. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +15 -20
  93. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +1 -1
  94. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +8 -0
  95. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  96. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +20 -48
  97. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +1 -1
  98. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  99. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -1
  100. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  101. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +20 -18
  102. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  103. package/lib/module/shared/components/boundary/utils/refresh-signals.js +19 -5
  104. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  105. package/lib/module/shared/components/screen-container/layers/backdrop.js +12 -8
  106. package/lib/module/shared/components/screen-container/layers/backdrop.js.map +1 -1
  107. package/lib/module/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js +25 -0
  108. package/lib/module/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js.map +1 -0
  109. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-completion.js +21 -0
  110. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-completion.js.map +1 -0
  111. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +60 -85
  112. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  113. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +1 -5
  114. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  115. package/lib/module/shared/components/screen-lifecycle/index.js +9 -6
  116. package/lib/module/shared/components/screen-lifecycle/index.js.map +1 -1
  117. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js +29 -7
  118. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  119. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +1 -2
  120. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  121. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +9 -2
  122. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  123. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +4 -5
  124. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  125. package/lib/module/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js +2 -3
  126. package/lib/module/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js.map +1 -1
  127. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +4 -5
  128. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  129. package/lib/module/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js +2 -3
  130. package/lib/module/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js.map +1 -1
  131. package/lib/module/shared/providers/screen/gestures/shared/policy.js +9 -5
  132. package/lib/module/shared/providers/screen/gestures/shared/policy.js.map +1 -1
  133. package/lib/module/shared/providers/stack/blank-stack-state/blank-stack-controller.js +5 -1
  134. package/lib/module/shared/providers/stack/blank-stack-state/blank-stack-controller.js.map +1 -1
  135. package/lib/module/shared/stores/bounds/internals/links.js +1 -1
  136. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  137. package/lib/module/shared/stores/system.store.js +1 -2
  138. package/lib/module/shared/stores/system.store.js.map +1 -1
  139. package/lib/module/shared/utils/animation/animate-to-progress.js +0 -22
  140. package/lib/module/shared/utils/animation/animate-to-progress.js.map +1 -1
  141. package/lib/module/shared/utils/navigation/close-action-replay.js +16 -0
  142. package/lib/module/shared/utils/navigation/close-action-replay.js.map +1 -0
  143. package/lib/typescript/native-stack/views/NativeStackView.native.d.ts.map +1 -1
  144. package/lib/typescript/shared/components/boundary/components/boundary-lifecycle.d.ts +18 -0
  145. package/lib/typescript/shared/components/boundary/components/boundary-lifecycle.d.ts.map +1 -0
  146. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts +1 -2
  147. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts.map +1 -1
  148. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -1
  149. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +3 -2
  150. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -1
  151. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts +3 -2
  152. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts.map +1 -1
  153. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/host.d.ts.map +1 -1
  154. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts +5 -1
  155. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts.map +1 -1
  156. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts +4 -0
  157. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts.map +1 -0
  158. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts +4 -17
  159. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts.map +1 -1
  160. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts +3 -1
  161. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts.map +1 -1
  162. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts.map +1 -1
  163. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts +5 -9
  164. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts.map +1 -1
  165. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts +2 -1
  166. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  167. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +2 -1
  168. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
  169. package/lib/typescript/shared/components/boundary/types.d.ts +6 -0
  170. package/lib/typescript/shared/components/boundary/types.d.ts.map +1 -1
  171. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts +1 -0
  172. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  173. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  174. package/lib/typescript/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.d.ts +27 -0
  175. package/lib/typescript/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.d.ts.map +1 -0
  176. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-completion.d.ts +7 -0
  177. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-completion.d.ts.map +1 -0
  178. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts +2 -7
  179. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
  180. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts +1 -3
  181. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts.map +1 -1
  182. package/lib/typescript/shared/components/screen-lifecycle/index.d.ts.map +1 -1
  183. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts +1 -0
  184. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
  185. package/lib/typescript/shared/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts.map +1 -1
  186. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts +1 -1
  187. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts.map +1 -1
  188. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.d.ts.map +1 -1
  189. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts +1 -1
  190. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts.map +1 -1
  191. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.d.ts.map +1 -1
  192. package/lib/typescript/shared/providers/screen/gestures/shared/policy.d.ts +2 -1
  193. package/lib/typescript/shared/providers/screen/gestures/shared/policy.d.ts.map +1 -1
  194. package/lib/typescript/shared/providers/screen/gestures/types.d.ts +2 -0
  195. package/lib/typescript/shared/providers/screen/gestures/types.d.ts.map +1 -1
  196. package/lib/typescript/shared/providers/stack/blank-stack-state/blank-stack-controller.d.ts.map +1 -1
  197. package/lib/typescript/shared/stores/system.store.d.ts +1 -2
  198. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  199. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts +2 -3
  200. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts.map +1 -1
  201. package/lib/typescript/shared/utils/navigation/close-action-replay.d.ts +4 -0
  202. package/lib/typescript/shared/utils/navigation/close-action-replay.d.ts.map +1 -0
  203. package/package.json +1 -1
  204. package/src/native-stack/views/NativeStackView.native.tsx +3 -1
  205. package/src/shared/components/boundary/components/boundary-lifecycle.tsx +53 -0
  206. package/src/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.ts +0 -14
  207. package/src/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.ts +13 -2
  208. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +7 -2
  209. package/src/shared/components/boundary/hooks/use-measurer.ts +11 -1
  210. package/src/shared/components/boundary/portal/components/boundary-portal/components/host.tsx +13 -11
  211. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.tsx +44 -55
  212. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.ts +10 -0
  213. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.ts +11 -55
  214. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.ts +20 -24
  215. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.ts +11 -0
  216. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.ts +20 -67
  217. package/src/shared/components/boundary/portal/components/boundary-portal/index.tsx +1 -0
  218. package/src/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.ts +3 -2
  219. package/src/shared/components/boundary/providers/boundary-root.provider.tsx +29 -20
  220. package/src/shared/components/boundary/types.ts +9 -0
  221. package/src/shared/components/boundary/utils/refresh-signals.ts +39 -6
  222. package/src/shared/components/screen-container/layers/backdrop.tsx +11 -7
  223. package/src/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.ts +64 -0
  224. package/src/shared/components/screen-lifecycle/hooks/use-close-completion.ts +28 -0
  225. package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +67 -108
  226. package/src/shared/components/screen-lifecycle/hooks/use-transition-start-controller.ts +0 -12
  227. package/src/shared/components/screen-lifecycle/index.tsx +8 -4
  228. package/src/shared/hooks/navigation/use-navigation-helpers.ts +39 -7
  229. package/src/shared/providers/helpers/measured-bounds-writes.ts +1 -1
  230. package/src/shared/providers/screen/gestures/hooks/use-screen-gesture-config.ts +9 -1
  231. package/src/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.ts +4 -6
  232. package/src/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.ts +1 -3
  233. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.ts +4 -6
  234. package/src/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.ts +2 -8
  235. package/src/shared/providers/screen/gestures/shared/policy.ts +17 -6
  236. package/src/shared/providers/screen/gestures/types.ts +2 -0
  237. package/src/shared/providers/stack/blank-stack-state/blank-stack-controller.ts +5 -1
  238. package/src/shared/stores/bounds/internals/links.ts +1 -1
  239. package/src/shared/stores/system.store.ts +1 -2
  240. package/src/shared/utils/animation/animate-to-progress.ts +1 -22
  241. package/src/shared/utils/navigation/close-action-replay.ts +25 -0
  242. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js +0 -30
  243. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js.map +0 -1
  244. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js +0 -47
  245. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js.map +0 -1
  246. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js +0 -25
  247. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js.map +0 -1
  248. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js +0 -40
  249. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js.map +0 -1
  250. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.d.ts +0 -9
  251. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.d.ts.map +0 -1
  252. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.d.ts +0 -9
  253. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.d.ts.map +0 -1
  254. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.ts +0 -36
  255. package/src/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.ts +0 -45
@@ -1,61 +1,37 @@
1
- import { useLayoutEffect } from "react";
2
1
  import type { View } from "react-native";
3
2
  import {
4
3
  cancelAnimation,
4
+ type MeasuredDimensions,
5
5
  measure,
6
- runOnUI,
7
- type SharedValue,
8
6
  useAnimatedReaction,
9
7
  useAnimatedRef,
10
8
  useSharedValue,
11
9
  withDelay,
12
10
  withTiming,
13
11
  } from "react-native-reanimated";
14
- import { ScrollStore } from "../../../../../../stores/scroll.store";
15
- import { getVisibilityBlockOffset } from "../../../../../../utils/visibility-block-offset";
16
- import {
17
- adjustedMeasuredBoundsForOverscrollDeltas,
18
- correctMeasuredBoundsForVisibilityGate,
19
- } from "../../../../utils/measured-bounds";
20
- import {
21
- clearPortalHostBounds,
22
- setPortalHostBounds,
23
- } from "../stores/host-bounds.store";
24
12
 
25
13
  const HOST_MEASUREMENT_RETRY_DELAY_MS = 16;
26
14
 
27
15
  type UseHostMeasurementParams = {
28
- capturesScroll: boolean;
29
- enabled: boolean;
30
- hostKey: string;
31
- screenKey: string;
32
- visibilityBlocked: SharedValue<boolean>;
33
- viewportHeight: number;
34
- viewportWidth: number;
16
+ measurementKey: string | null;
35
17
  };
36
18
 
37
19
  export const useHostMeasurement = ({
38
- capturesScroll,
39
- enabled,
40
- hostKey,
41
- screenKey,
42
- visibilityBlocked,
43
- viewportHeight,
44
- viewportWidth,
20
+ measurementKey,
45
21
  }: UseHostMeasurementParams) => {
46
22
  const hostRef = useAnimatedRef<View>();
47
- const scrollMetadata = ScrollStore.getValue(screenKey, "metadata");
48
- const hasMeasuredHost = useSharedValue(false);
23
+ const hostBounds = useSharedValue<MeasuredDimensions | null>(null);
24
+ const measuredKey = useSharedValue<string | null>(null);
49
25
  const retryToken = useSharedValue(0);
50
26
 
51
27
  useAnimatedReaction(
52
28
  () => {
53
29
  "worklet";
54
- if (!enabled) {
30
+ if (!measurementKey) {
55
31
  return null;
56
32
  }
57
33
 
58
- return [hasMeasuredHost.get(), retryToken.get()] as const;
34
+ return [measurementKey, measuredKey.get(), retryToken.get()] as const;
59
35
  },
60
36
  (state) => {
61
37
  "worklet";
@@ -64,9 +40,8 @@ export const useHostMeasurement = ({
64
40
  return;
65
41
  }
66
42
 
67
- const [hasAlreadyMeasured] = state;
68
-
69
- if (!enabled || hasAlreadyMeasured) {
43
+ const [requestedKey, completedKey] = state;
44
+ if (requestedKey === completedKey) {
70
45
  return;
71
46
  }
72
47
 
@@ -85,23 +60,7 @@ export const useHostMeasurement = ({
85
60
 
86
61
  cancelAnimation(retryToken);
87
62
 
88
- // A measurement taken mid rubber-band would bake the transient
89
- // overscroll displacement into the host frame. Store the at-rest
90
- // position instead; clamped scroll deltas share that basis.
91
- const currentScroll = scrollMetadata.get();
92
- const overscrollNormalized = capturesScroll
93
- ? adjustedMeasuredBoundsForOverscrollDeltas(measured, currentScroll)
94
- : measured;
95
-
96
- const correctedMeasured = correctMeasuredBoundsForVisibilityGate({
97
- measured: overscrollNormalized,
98
- visibilityBlocked: visibilityBlocked.get(),
99
- visibilityBlockOffset: getVisibilityBlockOffset(viewportHeight),
100
- viewportWidth,
101
- viewportHeight,
102
- });
103
-
104
- if (correctedMeasured.width <= 0 || correctedMeasured.height <= 0) {
63
+ if (measured.width <= 0 || measured.height <= 0) {
105
64
  cancelAnimation(retryToken);
106
65
  retryToken.set(
107
66
  withDelay(
@@ -112,27 +71,21 @@ export const useHostMeasurement = ({
112
71
  return;
113
72
  }
114
73
 
115
- setPortalHostBounds(hostKey, {
116
- x: correctedMeasured.x,
117
- y: correctedMeasured.y,
118
- width: correctedMeasured.width,
119
- height: correctedMeasured.height,
120
- pageX: correctedMeasured.pageX,
121
- pageY: correctedMeasured.pageY,
122
- scroll: capturesScroll ? currentScroll : null,
74
+ hostBounds.set({
75
+ x: measured.x,
76
+ y: measured.y,
77
+ width: measured.width,
78
+ height: measured.height,
79
+ pageX: measured.pageX,
80
+ pageY: measured.pageY,
123
81
  });
124
-
125
- hasMeasuredHost.set(true);
82
+ measuredKey.set(requestedKey);
126
83
  },
127
84
  );
128
85
 
129
- useLayoutEffect(() => {
130
- return () => {
131
- runOnUI(clearPortalHostBounds)(hostKey);
132
- };
133
- }, [hostKey]);
134
-
135
86
  return {
87
+ hostBounds,
136
88
  hostRef,
89
+ measuredKey,
137
90
  };
138
91
  };
@@ -71,6 +71,7 @@ const EnabledBoundaryPortal = memo(function EnabledBoundaryPortal({
71
71
  }
72
72
 
73
73
  const { teleportProps } = useBoundaryPortalAttachment({ boundaryId });
74
+
74
75
  const { handleOnLayout, placeholderStyle } = usePlaceholderStyles();
75
76
 
76
77
  return (
@@ -1,14 +1,15 @@
1
1
  import { useSyncExternalStore } from "react";
2
2
  import type { SharedValue } from "react-native-reanimated";
3
3
  import type { NormalizedTransitionInterpolatedStyle } from "../../../../../../types/animation.types";
4
+ import type { BoundaryLocalMeasurementValue } from "../../../../types";
4
5
 
5
6
  export type ActivePortalBoundaryHost = {
6
7
  boundaryId: string;
7
8
  hostKey: string;
9
+ localMeasurement: BoundaryLocalMeasurementValue;
8
10
  pairKey: string;
9
11
  portalHostName: string;
10
12
  portalHostReady: SharedValue<boolean>;
11
- screenKey: string;
12
13
  slotsMap: SharedValue<NormalizedTransitionInterpolatedStyle>;
13
14
  };
14
15
 
@@ -54,10 +55,10 @@ const isSameHost = (
54
55
  return (
55
56
  a.boundaryId === b.boundaryId &&
56
57
  a.hostKey === b.hostKey &&
58
+ a.localMeasurement === b.localMeasurement &&
57
59
  a.pairKey === b.pairKey &&
58
60
  a.portalHostName === b.portalHostName &&
59
61
  a.portalHostReady === b.portalHostReady &&
60
- a.screenKey === b.screenKey &&
61
62
  a.slotsMap === b.slotsMap
62
63
  );
63
64
  };
@@ -8,7 +8,7 @@ import {
8
8
  } from "react";
9
9
  import type { View } from "react-native";
10
10
  import type { AnimatedRef } from "react-native-reanimated";
11
- import { useAnimatedRef } from "react-native-reanimated";
11
+ import { useAnimatedRef, useSharedValue } from "react-native-reanimated";
12
12
  import { useDescriptorsStore } from "../../../providers/screen/descriptors";
13
13
  import {
14
14
  useComposedSlotStyles,
@@ -19,7 +19,7 @@ import { createBoundTag } from "../../../stores/bounds/helpers/link-pairs.helper
19
19
  import type { BoundTag } from "../../../stores/bounds/types";
20
20
  import createProvider from "../../../utils/create-provider";
21
21
  import { logger } from "../../../utils/logger";
22
- import { useBoundaryMeasurement } from "../hooks/use-boundary-measurement";
22
+ import { BoundaryLifecycle } from "../components/boundary-lifecycle";
23
23
  import {
24
24
  type BoundaryPortalRuntime,
25
25
  resolveBoundaryPortal,
@@ -27,6 +27,8 @@ import {
27
27
  import type {
28
28
  BoundaryConfigProps,
29
29
  BoundaryId,
30
+ BoundaryLocalMeasurement,
31
+ BoundaryLocalMeasurementValue,
30
32
  BoundaryOwnProps,
31
33
  } from "../types";
32
34
 
@@ -44,6 +46,7 @@ export type BoundaryRootRenderState = {
44
46
  boundTag: BoundTag;
45
47
  currentScreenKey: string;
46
48
  handoffEnabled: boolean;
49
+ localMeasurement: BoundaryLocalMeasurementValue;
47
50
  measurementRef: AnimatedRef<View>;
48
51
  portalRuntime: BoundaryPortalRuntime;
49
52
  ref: AnimatedRef<View>;
@@ -96,7 +99,9 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
96
99
  (s) => s.derivations.currentScreenKey,
97
100
  );
98
101
  const isCurrentScreenClosing = useBlankStackStore(
99
- (store) => store?.scenesByKey[currentScreenKey]?.activity === "closing",
102
+ (store) =>
103
+ portalRuntime.handoff &&
104
+ store?.scenesByKey[currentScreenKey]?.activity === "closing",
100
105
  );
101
106
  const retainedBoundTagRef = useRef(requestedBoundTag);
102
107
  const shouldRetainClosingBoundTag =
@@ -110,10 +115,6 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
110
115
  }
111
116
 
112
117
  const boundTag = retainedBoundTagRef.current;
113
- const hasConfiguredInterpolator = useDescriptorsStore(
114
- (s) => s.derivations.hasConfiguredInterpolator,
115
- );
116
- const runtimeEnabled = enabled && hasConfiguredInterpolator;
117
118
  // Associated slot styles attach whenever the boundary is enabled,
118
119
  // independent of whether an interpolator is configured for this transition.
119
120
  const shouldAttachAssociatedStyles = enabled;
@@ -123,6 +124,9 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
123
124
  const associatedStackingStyles = useSlotStackingStyles(boundTag.tag);
124
125
  const rootRef = useAnimatedRef<View>();
125
126
  const measurementRef = useAnimatedRef<View>();
127
+ const localMeasurement = useSharedValue<BoundaryLocalMeasurement | null>(
128
+ null,
129
+ );
126
130
 
127
131
  useLayoutEffect(() => {
128
132
  if (__DEV__ && targetCount > 1) {
@@ -137,18 +141,6 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
137
141
 
138
142
  useImperativeHandle(forwardedRef, () => rootRef.current as any, [rootRef]);
139
143
 
140
- useBoundaryMeasurement({
141
- boundTag,
142
- enabled,
143
- runtimeEnabled,
144
- currentScreenKey,
145
- measuredRef,
146
- style: hasTarget ? targetStyle : style,
147
- handoff: portalRuntime.handoff,
148
- escapeClipping: portalRuntime.escapeClipping,
149
- config,
150
- });
151
-
152
144
  const shouldRenderBoundaryRootThroughPortal =
153
145
  shouldEscapeBoundaryRootToScreenHost && !hasTarget;
154
146
  const handoffEnabled = enabled && portalRuntime.handoff;
@@ -173,6 +165,7 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
173
165
  boundTag,
174
166
  currentScreenKey,
175
167
  handoffEnabled,
168
+ localMeasurement,
176
169
  measurementRef,
177
170
  portalRuntime,
178
171
  ref: rootRef,
@@ -185,6 +178,7 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
185
178
  currentScreenKey,
186
179
  handoffEnabled,
187
180
  hasTarget,
181
+ localMeasurement,
188
182
  measurementRef,
189
183
  portalRuntime,
190
184
  rootRef,
@@ -194,7 +188,22 @@ export const { BoundaryRootProvider, useBoundaryRootStore } = createProvider(
194
188
 
195
189
  return {
196
190
  value,
197
- children: children(value),
191
+ children: (
192
+ <>
193
+ {children(value)}
194
+ <BoundaryLifecycle
195
+ boundTag={boundTag}
196
+ config={config}
197
+ currentScreenKey={currentScreenKey}
198
+ enabled={enabled}
199
+ escapeClipping={portalRuntime.escapeClipping}
200
+ handoff={portalRuntime.handoff}
201
+ localMeasurement={localMeasurement}
202
+ measuredRef={measuredRef}
203
+ style={hasTarget ? targetStyle : style}
204
+ />
205
+ </>
206
+ ),
198
207
  };
199
208
  },
200
209
  );
@@ -1,3 +1,4 @@
1
+ import type { MeasuredDimensions, SharedValue } from "react-native-reanimated";
1
2
  import type { ScreenPairKey } from "../../stores/bounds/types";
2
3
  import type { BoundsOptions } from "../../utils/bounds/types/options";
3
4
 
@@ -60,3 +61,11 @@ export type MeasureTarget =
60
61
  };
61
62
 
62
63
  export type MeasureBoundary = (target: MeasureTarget) => void;
64
+
65
+ export type BoundaryLocalMeasurement = {
66
+ bounds: MeasuredDimensions;
67
+ pairKey: ScreenPairKey;
68
+ };
69
+
70
+ export type BoundaryLocalMeasurementValue =
71
+ SharedValue<BoundaryLocalMeasurement | null>;
@@ -34,6 +34,7 @@ export const getRefreshBoundarySignal = (params: {
34
34
  linkId: string;
35
35
  group?: string;
36
36
  shouldRefresh: boolean;
37
+ settled?: boolean;
37
38
  closing: boolean;
38
39
  linkState?: LinkPairsState;
39
40
  }): RefreshBoundarySignal | null => {
@@ -46,13 +47,14 @@ export const getRefreshBoundarySignal = (params: {
46
47
  linkId,
47
48
  group,
48
49
  shouldRefresh,
50
+ settled = false,
49
51
  closing,
50
52
  linkState,
51
53
  } = params;
52
54
 
53
55
  if (!enabled) return null;
54
56
 
55
- if (!shouldRefresh) {
57
+ if (!shouldRefresh && (!group || !settled)) {
56
58
  return null;
57
59
  }
58
60
 
@@ -95,16 +97,33 @@ export const getRefreshBoundarySignal = (params: {
95
97
  // Source side:
96
98
  // When the activeId changes, trigger a refresh to ensure the source bounds are captured.
97
99
  if (sourcePairKey) {
98
- const activeId = linkState?.[sourcePairKey]?.groups?.[group]?.activeId;
100
+ const pair = linkState?.[sourcePairKey];
101
+ const groupState = pair?.groups?.[group];
102
+ const activeId = groupState?.activeId;
99
103
 
100
104
  if (activeId !== linkId) {
101
105
  return null;
102
106
  }
103
107
 
108
+ // The opening member is captured by the initial handshake. A settled
109
+ // refresh is only needed after selection moves to another member.
110
+ if (
111
+ !shouldRefresh &&
112
+ (groupState?.initialId === undefined ||
113
+ activeId === groupState.initialId ||
114
+ !!pair?.links?.[linkId]?.source)
115
+ ) {
116
+ return null;
117
+ }
118
+
104
119
  return buildRefreshSignal(
105
120
  "source",
106
121
  sourcePairKey,
107
- [group, linkId, closing ? "closing" : "settled"].join("|"),
122
+ [
123
+ group,
124
+ linkId,
125
+ shouldRefresh ? (closing ? "closing" : "settled") : "retarget",
126
+ ].join("|"),
108
127
  );
109
128
  }
110
129
 
@@ -114,8 +133,9 @@ export const getRefreshBoundarySignal = (params: {
114
133
 
115
134
  // Destination side:
116
135
  // When the activeId changes, trigger a refresh to ensure the destination bounds are captured.
117
- const activeId =
118
- linkState?.[refreshDestinationPairKey]?.groups?.[group]?.activeId;
136
+ const pair = linkState?.[refreshDestinationPairKey];
137
+ const groupState = pair?.groups?.[group];
138
+ const activeId = groupState?.activeId;
119
139
 
120
140
  // Destination retargeting should only measure a concrete member that already
121
141
  // participates in the pair. Missing members fall back to initialId at resolve.
@@ -123,9 +143,22 @@ export const getRefreshBoundarySignal = (params: {
123
143
  return null;
124
144
  }
125
145
 
146
+ if (
147
+ !shouldRefresh &&
148
+ (groupState?.initialId === undefined ||
149
+ activeId === groupState.initialId ||
150
+ !!pair?.links?.[linkId]?.destination)
151
+ ) {
152
+ return null;
153
+ }
154
+
126
155
  return buildRefreshSignal(
127
156
  "destination",
128
157
  refreshDestinationPairKey,
129
- [group, linkId, closing ? "closing" : "settled"].join("|"),
158
+ [
159
+ group,
160
+ linkId,
161
+ shouldRefresh ? (closing ? "closing" : "settled") : "retarget",
162
+ ].join("|"),
130
163
  );
131
164
  };
@@ -1,6 +1,6 @@
1
1
  import { type ComponentType, memo, useCallback, useMemo } from "react";
2
2
  import { Pressable, StyleSheet } from "react-native";
3
- import Animated, { runOnUI } from "react-native-reanimated";
3
+ import Animated, { runOnJS, runOnUI } from "react-native-reanimated";
4
4
  import { DefaultSnapSpec } from "../../../configs/specs";
5
5
  import { useNavigationHelpers } from "../../../hooks/navigation/use-navigation-helpers";
6
6
  import { useDescriptorsStore } from "../../../providers/screen/descriptors";
@@ -23,7 +23,7 @@ export const BackdropLayer = memo(function BackdropLayer({
23
23
  backdropBehavior: BackdropBehavior;
24
24
  isBackdropActive: boolean;
25
25
  }) {
26
- const { dismissScreen } = useNavigationHelpers();
26
+ const { isRemovePrevented, requestDismiss } = useNavigationHelpers();
27
27
 
28
28
  const routeKey = useDescriptorsStore(
29
29
  (store) => store.derivations.currentScreenKey,
@@ -34,9 +34,10 @@ export const BackdropLayer = memo(function BackdropLayer({
34
34
  const rawSnapPoints = useDescriptorsStore(
35
35
  (store) => store.options.snapPoints,
36
36
  );
37
- const canDismiss = useDescriptorsStore(
37
+ const isGestureDismissEnabled = useDescriptorsStore(
38
38
  (store) => store.options.gestureEnabled !== false,
39
39
  );
40
+ const canDismiss = isGestureDismissEnabled && !isRemovePrevented;
40
41
  const transitionSpec = useDescriptorsStore(
41
42
  (store) => store.options.transitionSpec,
42
43
  );
@@ -56,14 +57,14 @@ export const BackdropLayer = memo(function BackdropLayer({
56
57
 
57
58
  const handleBackdropPress = useCallback(() => {
58
59
  if (backdropBehavior === "dismiss") {
59
- dismissScreen();
60
+ requestDismiss();
60
61
  return;
61
62
  }
62
63
 
63
64
  if (backdropBehavior === "collapse") {
64
65
  // No snap points → fallback to dismiss
65
66
  if (!rawSnapPoints || rawSnapPoints.length === 0) {
66
- dismissScreen();
67
+ requestDismiss();
67
68
  return;
68
69
  }
69
70
 
@@ -108,8 +109,11 @@ export const BackdropLayer = memo(function BackdropLayer({
108
109
  animations,
109
110
  targetProgress,
110
111
  animationProgress,
111
- onAnimationFinish: shouldDismiss ? dismissScreen : undefined,
112
112
  });
113
+
114
+ if (shouldDismiss) {
115
+ runOnJS(requestDismiss)();
116
+ }
113
117
  })();
114
118
  }
115
119
  }, [
@@ -121,7 +125,7 @@ export const BackdropLayer = memo(function BackdropLayer({
121
125
  rawSnapPoints,
122
126
  canDismiss,
123
127
  transitionSpec,
124
- dismissScreen,
128
+ requestDismiss,
125
129
  routeKey,
126
130
  ]);
127
131
 
@@ -0,0 +1,64 @@
1
+ interface CloseInterceptionState {
2
+ enabled: boolean;
3
+ ownsAction: boolean;
4
+ ancestorDismissing: boolean;
5
+ routeIndex: number;
6
+ focusedIndex: number;
7
+ }
8
+
9
+ interface NavigationRouteLike {
10
+ key: string;
11
+ state?: NavigationStateLike;
12
+ }
13
+
14
+ interface NavigationStateLike {
15
+ key?: string;
16
+ routes: NavigationRouteLike[];
17
+ }
18
+
19
+ interface NavigationActionLike {
20
+ source?: unknown;
21
+ target?: unknown;
22
+ }
23
+
24
+ const containsRouteKey = (
25
+ routes: NavigationRouteLike[],
26
+ routeKey: string,
27
+ ): boolean =>
28
+ routes.some(
29
+ (route) =>
30
+ route.key === routeKey ||
31
+ (route.state ? containsRouteKey(route.state.routes, routeKey) : false),
32
+ );
33
+
34
+ export const doesNavigatorOwnCloseAction = ({
35
+ state,
36
+ action,
37
+ }: {
38
+ state: NavigationStateLike;
39
+ action: NavigationActionLike;
40
+ }): boolean => {
41
+ if (typeof action.target === "string") {
42
+ return action.target === state.key;
43
+ }
44
+
45
+ if (typeof action.source === "string") {
46
+ return containsRouteKey(state.routes, action.source);
47
+ }
48
+
49
+ return true;
50
+ };
51
+
52
+ /** Only the focused removable route owns a stack close transition. */
53
+ export const shouldInterceptClose = ({
54
+ enabled,
55
+ ownsAction,
56
+ ancestorDismissing,
57
+ routeIndex,
58
+ focusedIndex,
59
+ }: CloseInterceptionState) =>
60
+ enabled &&
61
+ ownsAction &&
62
+ !ancestorDismissing &&
63
+ routeIndex > 0 &&
64
+ routeIndex === focusedIndex;
@@ -0,0 +1,28 @@
1
+ import {
2
+ runOnJS,
3
+ type SharedValue,
4
+ useAnimatedReaction,
5
+ } from "react-native-reanimated";
6
+
7
+ export const useCloseCompletion = ({
8
+ closing,
9
+ animationProgress,
10
+ onComplete,
11
+ }: {
12
+ closing: SharedValue<number>;
13
+ animationProgress: SharedValue<number>;
14
+ onComplete: () => void;
15
+ }) => {
16
+ useAnimatedReaction(
17
+ () => {
18
+ "worklet";
19
+ return !!closing.get() && animationProgress.get() <= 0;
20
+ },
21
+ (complete, previouslyComplete) => {
22
+ "worklet";
23
+ if (complete && !previouslyComplete) {
24
+ runOnJS(onComplete)();
25
+ }
26
+ },
27
+ );
28
+ };