react-native-screen-transitions 1.0.2 → 1.0.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.
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +201 -233
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +188 -220
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -221,89 +221,18 @@ var ElasticCard = (config = { elasticFactor: 0.5 }) => {
|
|
|
221
221
|
};
|
|
222
222
|
|
|
223
223
|
// src/hooks/use-screen-animation.tsx
|
|
224
|
-
var
|
|
225
|
-
var
|
|
224
|
+
var import_native3 = require("@react-navigation/native");
|
|
225
|
+
var import_react2 = require("react");
|
|
226
226
|
var import_react_native = require("react-native");
|
|
227
227
|
var import_react_native_reanimated5 = require("react-native-reanimated");
|
|
228
228
|
var import_react_native_safe_area_context = require("react-native-safe-area-context");
|
|
229
229
|
|
|
230
|
-
// src/store/utils/use-shallow.tsx
|
|
231
|
-
var import_react = __toESM(require("react"));
|
|
232
|
-
|
|
233
|
-
// src/store/utils/shallow.ts
|
|
234
|
-
var isIterable = (obj) => Symbol.iterator in obj;
|
|
235
|
-
var hasIterableEntries = (value) => (
|
|
236
|
-
// HACK: avoid checking entries type
|
|
237
|
-
"entries" in value
|
|
238
|
-
);
|
|
239
|
-
var compareEntries = (valueA, valueB) => {
|
|
240
|
-
const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());
|
|
241
|
-
const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());
|
|
242
|
-
if (mapA.size !== mapB.size) {
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
for (const [key, value] of mapA) {
|
|
246
|
-
if (!Object.is(value, mapB.get(key))) {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return true;
|
|
251
|
-
};
|
|
252
|
-
var compareIterables = (valueA, valueB) => {
|
|
253
|
-
const iteratorA = valueA[Symbol.iterator]();
|
|
254
|
-
const iteratorB = valueB[Symbol.iterator]();
|
|
255
|
-
let nextA = iteratorA.next();
|
|
256
|
-
let nextB = iteratorB.next();
|
|
257
|
-
while (!nextA.done && !nextB.done) {
|
|
258
|
-
if (!Object.is(nextA.value, nextB.value)) {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
nextA = iteratorA.next();
|
|
262
|
-
nextB = iteratorB.next();
|
|
263
|
-
}
|
|
264
|
-
return !!nextA.done && !!nextB.done;
|
|
265
|
-
};
|
|
266
|
-
function shallow(valueA, valueB) {
|
|
267
|
-
if (Object.is(valueA, valueB)) {
|
|
268
|
-
return true;
|
|
269
|
-
}
|
|
270
|
-
if (typeof valueA !== "object" || valueA === null || typeof valueB !== "object" || valueB === null) {
|
|
271
|
-
return false;
|
|
272
|
-
}
|
|
273
|
-
if (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
if (isIterable(valueA) && isIterable(valueB)) {
|
|
277
|
-
if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {
|
|
278
|
-
return compareEntries(valueA, valueB);
|
|
279
|
-
}
|
|
280
|
-
return compareIterables(valueA, valueB);
|
|
281
|
-
}
|
|
282
|
-
return compareEntries(
|
|
283
|
-
{ entries: () => Object.entries(valueA) },
|
|
284
|
-
{ entries: () => Object.entries(valueB) }
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// src/store/utils/use-shallow.tsx
|
|
289
|
-
function useShallow(selector) {
|
|
290
|
-
const prev = import_react.default.useRef(void 0);
|
|
291
|
-
return (state) => {
|
|
292
|
-
const next = selector(state);
|
|
293
|
-
if (shallow(prev.current, next)) {
|
|
294
|
-
return prev.current;
|
|
295
|
-
}
|
|
296
|
-
prev.current = next;
|
|
297
|
-
return next;
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
|
|
301
230
|
// src/animation-engine.ts
|
|
302
231
|
var import_react_native_reanimated3 = require("react-native-reanimated");
|
|
303
232
|
|
|
304
233
|
// src/store/utils/create-vanilla-store.ts
|
|
305
234
|
var import_immer = require("immer");
|
|
306
|
-
var
|
|
235
|
+
var import_react = require("react");
|
|
307
236
|
function createVanillaStore(initialState) {
|
|
308
237
|
let state = initialState;
|
|
309
238
|
const listeners = /* @__PURE__ */ new Set();
|
|
@@ -333,7 +262,7 @@ function createVanillaStore(initialState) {
|
|
|
333
262
|
return unsubscribe;
|
|
334
263
|
};
|
|
335
264
|
function useStore(selector) {
|
|
336
|
-
return (0,
|
|
265
|
+
return (0, import_react.useSyncExternalStore)(subscribe, () => selector(getState()));
|
|
337
266
|
}
|
|
338
267
|
Object.assign(useStore, {
|
|
339
268
|
setState,
|
|
@@ -344,54 +273,93 @@ function createVanillaStore(initialState) {
|
|
|
344
273
|
return useStore;
|
|
345
274
|
}
|
|
346
275
|
|
|
347
|
-
// src/store/
|
|
348
|
-
var
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
};
|
|
363
|
-
} else {
|
|
364
|
-
const { name = "", status = 0, closing = false, ...rest } = value;
|
|
365
|
-
const newIndex = routeKeys.length;
|
|
366
|
-
routes[key] = {
|
|
367
|
-
id: key,
|
|
368
|
-
index: newIndex,
|
|
369
|
-
name,
|
|
370
|
-
status,
|
|
371
|
-
closing,
|
|
372
|
-
...rest
|
|
373
|
-
};
|
|
374
|
-
routeKeys.push(key);
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
},
|
|
378
|
-
removeRoute: (key) => {
|
|
379
|
-
if (!key) return;
|
|
380
|
-
useRouteStore.setState(({ routes, routeKeys }) => {
|
|
381
|
-
delete routes[key];
|
|
382
|
-
const indexToRemove = routeKeys.indexOf(key);
|
|
383
|
-
if (indexToRemove > -1) {
|
|
384
|
-
routeKeys.splice(indexToRemove, 1);
|
|
385
|
-
}
|
|
276
|
+
// src/store/utils/handle-screen-dismiss.tsx
|
|
277
|
+
var import_native = require("@react-navigation/native");
|
|
278
|
+
var handleScreenDismiss = (screenBeingDismissed, navigation) => {
|
|
279
|
+
const { screens } = ScreenStore.use.getState();
|
|
280
|
+
const dismissedScreen = screens[screenBeingDismissed];
|
|
281
|
+
if (!dismissedScreen) {
|
|
282
|
+
navigation.goBack();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const childScreens = Object.values(screens).filter(
|
|
286
|
+
(screen) => screen.parentNavigatorKey === dismissedScreen.navigatorKey
|
|
287
|
+
);
|
|
288
|
+
if (childScreens.length > 0) {
|
|
289
|
+
ScreenStore.updateScreen(dismissedScreen.id, {
|
|
290
|
+
closing: true
|
|
386
291
|
});
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
const index = useRouteStore.getState().routeKeys.indexOf(key);
|
|
391
|
-
return index > -1 ? useRouteStore.getState().routes[useRouteStore.getState().routeKeys[index - 1]] : null;
|
|
292
|
+
navigation.dispatch(import_native.StackActions.pop(childScreens.length));
|
|
293
|
+
} else {
|
|
294
|
+
navigation.goBack();
|
|
392
295
|
}
|
|
393
296
|
};
|
|
394
297
|
|
|
298
|
+
// src/store/utils/remove-screen.tsx
|
|
299
|
+
var removeScreen = (key) => {
|
|
300
|
+
if (!key) return;
|
|
301
|
+
ScreenStore.use.setState(({ screens, screenKeys }) => {
|
|
302
|
+
delete screens[key];
|
|
303
|
+
const indexToRemove = screenKeys.indexOf(key);
|
|
304
|
+
if (indexToRemove > -1) {
|
|
305
|
+
screenKeys.splice(indexToRemove, 1);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// src/store/utils/should-skip-prevent-default.tsx
|
|
311
|
+
var shouldSkipPreventDefault = (key, navigatorState) => {
|
|
312
|
+
if (!key) return false;
|
|
313
|
+
const { screens } = ScreenStore.use.getState();
|
|
314
|
+
const currentScreen = screens[key];
|
|
315
|
+
const isLastScreenInStack = navigatorState.routes.length === 1 && navigatorState.routes[0].key === key;
|
|
316
|
+
const isParentNavigatorExiting = Boolean(
|
|
317
|
+
currentScreen?.parentNavigatorKey && Object.values(screens).some(
|
|
318
|
+
(screen) => screen.navigatorKey === currentScreen.parentNavigatorKey && screen.closing
|
|
319
|
+
)
|
|
320
|
+
);
|
|
321
|
+
return isLastScreenInStack || isParentNavigatorExiting;
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
// src/store/utils/update-screen.tsx
|
|
325
|
+
var updateScreen = (key, value) => {
|
|
326
|
+
if (!key) return;
|
|
327
|
+
ScreenStore.use.setState(({ screenKeys, screens }) => {
|
|
328
|
+
const currentScreen = screens[key];
|
|
329
|
+
if (currentScreen) {
|
|
330
|
+
screens[key] = {
|
|
331
|
+
...currentScreen,
|
|
332
|
+
...value
|
|
333
|
+
};
|
|
334
|
+
} else {
|
|
335
|
+
const { name = "", status = 0, closing = false, ...rest } = value;
|
|
336
|
+
const newIndex = screenKeys.length;
|
|
337
|
+
screens[key] = {
|
|
338
|
+
id: key,
|
|
339
|
+
index: newIndex,
|
|
340
|
+
name,
|
|
341
|
+
status,
|
|
342
|
+
closing,
|
|
343
|
+
...rest
|
|
344
|
+
};
|
|
345
|
+
screenKeys.push(key);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// src/store/index.ts
|
|
351
|
+
var useScreenStore = createVanillaStore({
|
|
352
|
+
screens: {},
|
|
353
|
+
screenKeys: []
|
|
354
|
+
});
|
|
355
|
+
var ScreenStore = {
|
|
356
|
+
use: useScreenStore,
|
|
357
|
+
updateScreen,
|
|
358
|
+
removeScreen,
|
|
359
|
+
handleScreenDismiss,
|
|
360
|
+
shouldSkipPreventDefault
|
|
361
|
+
};
|
|
362
|
+
|
|
395
363
|
// src/utils/animate.ts
|
|
396
364
|
var import_react_native_reanimated2 = require("react-native-reanimated");
|
|
397
365
|
var animate = (toValue, config, callback) => {
|
|
@@ -412,12 +380,12 @@ var animationValues = {
|
|
|
412
380
|
normalizedGestureY: {},
|
|
413
381
|
gestureDragging: {}
|
|
414
382
|
};
|
|
415
|
-
var triggerAnimation = (
|
|
383
|
+
var triggerAnimation = (screen) => {
|
|
416
384
|
"worklet";
|
|
417
|
-
const { id, closing, status, transitionSpec, onAnimationFinish } =
|
|
385
|
+
const { id, closing, status, transitionSpec, onAnimationFinish } = screen;
|
|
418
386
|
const progressValue = animationValues.screenProgress[id];
|
|
419
387
|
if (!progressValue && __DEV__) {
|
|
420
|
-
console.warn(`Animation values not found for
|
|
388
|
+
console.warn(`Animation values not found for screen: ${id}`);
|
|
421
389
|
return;
|
|
422
390
|
}
|
|
423
391
|
const animationConfig = closing ? transitionSpec?.close : transitionSpec?.open;
|
|
@@ -429,14 +397,16 @@ var triggerAnimation = (route) => {
|
|
|
429
397
|
}
|
|
430
398
|
});
|
|
431
399
|
};
|
|
432
|
-
|
|
433
|
-
(state) => state.
|
|
434
|
-
(
|
|
435
|
-
const currKeys = Object.keys(
|
|
436
|
-
const prevKeys = Object.keys(
|
|
400
|
+
ScreenStore.use.subscribeWithSelector(
|
|
401
|
+
(state) => state.screens,
|
|
402
|
+
(currScreens, prevScreens) => {
|
|
403
|
+
const currKeys = Object.keys(currScreens);
|
|
404
|
+
const prevKeys = Object.keys(prevScreens);
|
|
437
405
|
const incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));
|
|
438
406
|
const removedKeys = prevKeys.filter((k) => !currKeys.includes(k));
|
|
439
|
-
const changedKeys = currKeys.filter(
|
|
407
|
+
const changedKeys = currKeys.filter(
|
|
408
|
+
(k) => currScreens[k] !== prevScreens[k]
|
|
409
|
+
);
|
|
440
410
|
const animatableValues = Object.values(animationValues);
|
|
441
411
|
for (const incomingKey of incomingKeys) {
|
|
442
412
|
for (const value of animatableValues) {
|
|
@@ -450,9 +420,9 @@ RouteStore.use.subscribeWithSelector(
|
|
|
450
420
|
}
|
|
451
421
|
}
|
|
452
422
|
for (const changedKey of changedKeys) {
|
|
453
|
-
const
|
|
454
|
-
if (
|
|
455
|
-
triggerAnimation(
|
|
423
|
+
const currentScreen = currScreens[changedKey];
|
|
424
|
+
if (currentScreen) {
|
|
425
|
+
triggerAnimation(currentScreen);
|
|
456
426
|
}
|
|
457
427
|
}
|
|
458
428
|
}
|
|
@@ -462,10 +432,11 @@ RouteStore.use.subscribeWithSelector(
|
|
|
462
432
|
var import_react_native_gesture_handler = require("react-native-gesture-handler");
|
|
463
433
|
var import_react_native_reanimated4 = require("react-native-reanimated");
|
|
464
434
|
|
|
465
|
-
// src/utils/gesture/
|
|
466
|
-
var
|
|
435
|
+
// src/utils/gesture/apply-gesture-activation-criteria.ts
|
|
436
|
+
var applyGestureActivationCriteria = ({
|
|
467
437
|
gestureDirection,
|
|
468
|
-
gestureResponseDistance
|
|
438
|
+
gestureResponseDistance,
|
|
439
|
+
panGesture
|
|
469
440
|
}) => {
|
|
470
441
|
const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
|
|
471
442
|
if (directions.includes("bidirectional")) {
|
|
@@ -522,7 +493,20 @@ var createGestureActivationCriteria = ({
|
|
|
522
493
|
} else {
|
|
523
494
|
result.failOffsetY = [-toleranceY, toleranceY];
|
|
524
495
|
}
|
|
525
|
-
|
|
496
|
+
if (result?.activeOffsetX) {
|
|
497
|
+
panGesture.activeOffsetX(result.activeOffsetX);
|
|
498
|
+
}
|
|
499
|
+
if (result?.activeOffsetY) {
|
|
500
|
+
panGesture.activeOffsetY(result.activeOffsetY);
|
|
501
|
+
}
|
|
502
|
+
if (result?.failOffsetX) {
|
|
503
|
+
panGesture.failOffsetX(result.failOffsetX);
|
|
504
|
+
}
|
|
505
|
+
if (result?.failOffsetY) {
|
|
506
|
+
panGesture.failOffsetY(result.failOffsetY);
|
|
507
|
+
}
|
|
508
|
+
panGesture.enableTrackpadTwoFingerGesture(true);
|
|
509
|
+
return panGesture;
|
|
526
510
|
};
|
|
527
511
|
|
|
528
512
|
// src/utils/gesture/map-gesture-to-progress.ts
|
|
@@ -538,10 +522,10 @@ var DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;
|
|
|
538
522
|
var buildGestureDetector = ({
|
|
539
523
|
key,
|
|
540
524
|
progress,
|
|
541
|
-
|
|
525
|
+
screenState,
|
|
542
526
|
width,
|
|
543
527
|
height,
|
|
544
|
-
|
|
528
|
+
handleDismiss
|
|
545
529
|
}) => {
|
|
546
530
|
const _translateX = animationValues.gestureX[key];
|
|
547
531
|
const _translateY = animationValues.gestureY[key];
|
|
@@ -554,7 +538,7 @@ var buildGestureDetector = ({
|
|
|
554
538
|
transitionSpec,
|
|
555
539
|
gestureVelocityImpact = GESTURE_VELOCITY_IMPACT,
|
|
556
540
|
gestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE
|
|
557
|
-
} =
|
|
541
|
+
} = screenState;
|
|
558
542
|
const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
|
|
559
543
|
const panGesture = import_react_native_gesture_handler.Gesture.Pan().enabled(gestureEnabled).onStart(() => {
|
|
560
544
|
"worklet";
|
|
@@ -633,7 +617,7 @@ var buildGestureDetector = ({
|
|
|
633
617
|
const spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;
|
|
634
618
|
const onFinish = shouldDismiss ? (isFinished) => {
|
|
635
619
|
"worklet";
|
|
636
|
-
if (isFinished) (0, import_react_native_reanimated4.runOnJS)(
|
|
620
|
+
if (isFinished) (0, import_react_native_reanimated4.runOnJS)(handleDismiss)(screenState.id);
|
|
637
621
|
} : void 0;
|
|
638
622
|
progress.value = animate(finalProgress, spec, onFinish);
|
|
639
623
|
_translateX.value = animate(0, spec);
|
|
@@ -641,25 +625,12 @@ var buildGestureDetector = ({
|
|
|
641
625
|
_normalizedGestureX.value = animate(0, spec);
|
|
642
626
|
_normalizedGestureY.value = animate(0, spec);
|
|
643
627
|
});
|
|
644
|
-
|
|
628
|
+
applyGestureActivationCriteria({
|
|
645
629
|
gestureDirection,
|
|
646
|
-
gestureResponseDistance
|
|
630
|
+
gestureResponseDistance,
|
|
631
|
+
panGesture
|
|
647
632
|
});
|
|
648
|
-
|
|
649
|
-
panGesture.activeOffsetX(criteria.activeOffsetX);
|
|
650
|
-
}
|
|
651
|
-
if (criteria?.activeOffsetY) {
|
|
652
|
-
panGesture.activeOffsetY(criteria.activeOffsetY);
|
|
653
|
-
}
|
|
654
|
-
if (criteria?.failOffsetX) {
|
|
655
|
-
panGesture.failOffsetX(criteria.failOffsetX);
|
|
656
|
-
}
|
|
657
|
-
if (criteria?.failOffsetY) {
|
|
658
|
-
panGesture.failOffsetY(criteria.failOffsetY);
|
|
659
|
-
}
|
|
660
|
-
panGesture.enableTrackpadTwoFingerGesture(true);
|
|
661
|
-
const nativeGesture = import_react_native_gesture_handler.Gesture.Native().shouldCancelWhenOutside(false);
|
|
662
|
-
return import_react_native_gesture_handler.Gesture.Race(panGesture, nativeGesture);
|
|
633
|
+
return panGesture;
|
|
663
634
|
};
|
|
664
635
|
|
|
665
636
|
// src/utils/noop-interpolator.ts
|
|
@@ -672,42 +643,42 @@ var noopinterpolator = () => {
|
|
|
672
643
|
};
|
|
673
644
|
|
|
674
645
|
// src/hooks/use-key.tsx
|
|
675
|
-
var
|
|
676
|
-
var useKey = () => (0,
|
|
646
|
+
var import_native2 = require("@react-navigation/native");
|
|
647
|
+
var useKey = () => (0, import_native2.useRoute)().key;
|
|
677
648
|
|
|
678
649
|
// src/hooks/use-screen-animation.tsx
|
|
679
650
|
var useAnimationBuilder = () => {
|
|
680
651
|
const key = useKey();
|
|
681
652
|
const dimensions = (0, import_react_native.useWindowDimensions)();
|
|
682
653
|
const insets = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
|
|
683
|
-
const navigation = (0,
|
|
684
|
-
const
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
654
|
+
const navigation = (0, import_native3.useNavigation)();
|
|
655
|
+
const progressFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
656
|
+
const gestureDraggingFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
657
|
+
const gestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
658
|
+
const gestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
659
|
+
const normalizedGestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
660
|
+
const normalizedGestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
661
|
+
const currentScreen = ScreenStore.use(
|
|
662
|
+
(0, import_react2.useCallback)((state) => state.screens[key], [key])
|
|
663
|
+
);
|
|
664
|
+
const actualNextScreen = ScreenStore.use(
|
|
665
|
+
(0, import_react2.useCallback)(
|
|
666
|
+
(state) => {
|
|
667
|
+
const current = state.screens[key];
|
|
668
|
+
if (!current) return void 0;
|
|
669
|
+
const nextKey = state.screenKeys[current.index + 1];
|
|
670
|
+
const nextScreen = nextKey ? state.screens[nextKey] : void 0;
|
|
671
|
+
const shouldUseNext = nextScreen?.navigatorKey === current?.navigatorKey;
|
|
672
|
+
return shouldUseNext ? nextScreen : void 0;
|
|
673
|
+
},
|
|
674
|
+
[key]
|
|
675
|
+
)
|
|
705
676
|
);
|
|
706
|
-
const panGesture = (0,
|
|
677
|
+
const panGesture = (0, import_react2.useMemo)(
|
|
707
678
|
() => buildGestureDetector({
|
|
708
679
|
key,
|
|
709
680
|
progress: animationValues.screenProgress[key],
|
|
710
|
-
|
|
681
|
+
screenState: currentScreen || {
|
|
711
682
|
id: key,
|
|
712
683
|
name: key,
|
|
713
684
|
index: 0,
|
|
@@ -716,57 +687,50 @@ var useAnimationBuilder = () => {
|
|
|
716
687
|
},
|
|
717
688
|
width: dimensions.width,
|
|
718
689
|
height: dimensions.height,
|
|
719
|
-
|
|
690
|
+
handleDismiss: (screenBeingDismissed) => {
|
|
691
|
+
ScreenStore.handleScreenDismiss(screenBeingDismissed, navigation);
|
|
692
|
+
}
|
|
720
693
|
}),
|
|
721
|
-
[key,
|
|
694
|
+
[key, currentScreen, dimensions, navigation]
|
|
722
695
|
);
|
|
723
|
-
const
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
696
|
+
const getAnimationValuesForScreen = (0, import_react2.useCallback)(
|
|
697
|
+
(screenId) => ({
|
|
698
|
+
progress: animationValues.screenProgress[screenId] || progressFallback,
|
|
699
|
+
gesture: {
|
|
700
|
+
isDragging: animationValues.gestureDragging[screenId] || gestureDraggingFallback,
|
|
701
|
+
x: animationValues.gestureX[screenId] || gestureXFallback,
|
|
702
|
+
y: animationValues.gestureY[screenId] || gestureYFallback,
|
|
703
|
+
normalizedX: animationValues.normalizedGestureX[screenId] || normalizedGestureXFallback,
|
|
704
|
+
normalizedY: animationValues.normalizedGestureY[screenId] || normalizedGestureYFallback
|
|
705
|
+
}
|
|
706
|
+
}),
|
|
707
|
+
[
|
|
708
|
+
progressFallback,
|
|
709
|
+
gestureDraggingFallback,
|
|
710
|
+
gestureXFallback,
|
|
711
|
+
gestureYFallback,
|
|
712
|
+
normalizedGestureXFallback,
|
|
713
|
+
normalizedGestureYFallback
|
|
714
|
+
]
|
|
715
|
+
);
|
|
716
|
+
return (0, import_react2.useMemo)(() => {
|
|
730
717
|
return {
|
|
731
|
-
current:
|
|
732
|
-
|
|
733
|
-
gesture: {
|
|
734
|
-
isDragging: animationValues.gestureDragging[key] || gestureDraggingFallback,
|
|
735
|
-
x: animationValues.gestureX[key] || gestureXFallback,
|
|
736
|
-
y: animationValues.gestureY[key] || gestureYFallback,
|
|
737
|
-
normalizedX: animationValues.normalizedGestureX[key] || normalizedGestureXFallback,
|
|
738
|
-
normalizedY: animationValues.normalizedGestureY[key] || normalizedGestureYFallback
|
|
739
|
-
}
|
|
740
|
-
},
|
|
741
|
-
next: nextRoute && animationValues.screenProgress[nextRoute.id] ? {
|
|
742
|
-
progress: animationValues.screenProgress[nextRoute.id],
|
|
743
|
-
gesture: {
|
|
744
|
-
isDragging: animationValues.gestureDragging[nextRoute.id] || gestureDraggingFallback,
|
|
745
|
-
x: animationValues.gestureX[nextRoute.id] || gestureXFallback,
|
|
746
|
-
y: animationValues.gestureY[nextRoute.id] || gestureYFallback,
|
|
747
|
-
normalizedX: animationValues.normalizedGestureX[nextRoute.id] || normalizedGestureXFallback,
|
|
748
|
-
normalizedY: animationValues.normalizedGestureY[nextRoute.id] || normalizedGestureYFallback
|
|
749
|
-
}
|
|
750
|
-
} : void 0,
|
|
718
|
+
current: getAnimationValuesForScreen(key),
|
|
719
|
+
next: actualNextScreen ? getAnimationValuesForScreen(actualNextScreen.id) : void 0,
|
|
751
720
|
layouts: { screen: dimensions },
|
|
752
721
|
insets,
|
|
753
|
-
closing:
|
|
754
|
-
screenStyleInterpolator:
|
|
722
|
+
closing: currentScreen?.closing || false,
|
|
723
|
+
screenStyleInterpolator: actualNextScreen?.screenStyleInterpolator || currentScreen?.screenStyleInterpolator || noopinterpolator,
|
|
755
724
|
gestureDetector: panGesture
|
|
756
725
|
};
|
|
757
726
|
}, [
|
|
758
727
|
key,
|
|
759
|
-
|
|
760
|
-
|
|
728
|
+
currentScreen,
|
|
729
|
+
actualNextScreen,
|
|
761
730
|
dimensions,
|
|
762
731
|
insets,
|
|
763
732
|
panGesture,
|
|
764
|
-
|
|
765
|
-
gestureDraggingFallback,
|
|
766
|
-
gestureXFallback,
|
|
767
|
-
gestureYFallback,
|
|
768
|
-
normalizedGestureXFallback,
|
|
769
|
-
normalizedGestureYFallback
|
|
733
|
+
getAnimationValuesForScreen
|
|
770
734
|
]);
|
|
771
735
|
};
|
|
772
736
|
var _useScreenAnimation = () => {
|
|
@@ -789,21 +753,25 @@ var createConfig = ({
|
|
|
789
753
|
}) => {
|
|
790
754
|
return {
|
|
791
755
|
focus: (e) => {
|
|
756
|
+
const parentNavigatorKey = reactNavigation.getParent()?.getState?.()?.key;
|
|
792
757
|
const navigatorKey = reactNavigation.getState().key;
|
|
793
|
-
|
|
758
|
+
ScreenStore.updateScreen(e.target, {
|
|
794
759
|
id: e.target,
|
|
795
760
|
name: route.name,
|
|
796
761
|
status: 1,
|
|
797
762
|
closing: false,
|
|
798
763
|
navigatorKey,
|
|
764
|
+
parentNavigatorKey,
|
|
799
765
|
...config
|
|
800
766
|
});
|
|
801
767
|
},
|
|
802
768
|
beforeRemove: (e) => {
|
|
803
|
-
const
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
769
|
+
const shouldSkipPreventDefault2 = ScreenStore.shouldSkipPreventDefault(
|
|
770
|
+
e.target,
|
|
771
|
+
reactNavigation.getState()
|
|
772
|
+
);
|
|
773
|
+
if (shouldSkipPreventDefault2) {
|
|
774
|
+
ScreenStore.removeScreen(e.target);
|
|
807
775
|
return;
|
|
808
776
|
}
|
|
809
777
|
e.preventDefault();
|
|
@@ -811,10 +779,10 @@ var createConfig = ({
|
|
|
811
779
|
if (!finished) return;
|
|
812
780
|
if (reactNavigation.canGoBack()) {
|
|
813
781
|
reactNavigation.dispatch(e.data?.action);
|
|
814
|
-
|
|
782
|
+
ScreenStore.removeScreen(e.target);
|
|
815
783
|
}
|
|
816
784
|
};
|
|
817
|
-
|
|
785
|
+
ScreenStore.updateScreen(e.target, {
|
|
818
786
|
status: 0,
|
|
819
787
|
closing: true,
|
|
820
788
|
onAnimationFinish: handleFinish
|
|
@@ -824,13 +792,13 @@ var createConfig = ({
|
|
|
824
792
|
};
|
|
825
793
|
|
|
826
794
|
// src/utils/create-transition-component.tsx
|
|
827
|
-
var
|
|
795
|
+
var import_react4 = require("react");
|
|
828
796
|
var import_react_native2 = require("react-native");
|
|
829
797
|
var import_react_native_gesture_handler2 = require("react-native-gesture-handler");
|
|
830
798
|
var import_react_native_reanimated7 = __toESM(require("react-native-reanimated"));
|
|
831
799
|
|
|
832
800
|
// src/hooks/use-skip-first-frame.tsx
|
|
833
|
-
var
|
|
801
|
+
var import_react3 = require("react");
|
|
834
802
|
var import_react_native_reanimated6 = require("react-native-reanimated");
|
|
835
803
|
var useSkipFirstFrame = () => {
|
|
836
804
|
const opacity = (0, import_react_native_reanimated6.useSharedValue)(0);
|
|
@@ -840,7 +808,7 @@ var useSkipFirstFrame = () => {
|
|
|
840
808
|
opacity: opacity.value
|
|
841
809
|
};
|
|
842
810
|
});
|
|
843
|
-
(0,
|
|
811
|
+
(0, import_react3.useEffect)(() => {
|
|
844
812
|
requestAnimationFrame(() => {
|
|
845
813
|
opacity.value = 1;
|
|
846
814
|
});
|
|
@@ -852,7 +820,7 @@ var useSkipFirstFrame = () => {
|
|
|
852
820
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
853
821
|
function createTransitionComponent(Wrapped) {
|
|
854
822
|
const AnimatedComponent = import_react_native_reanimated7.default.createAnimatedComponent(Wrapped);
|
|
855
|
-
const Inner = (0,
|
|
823
|
+
const Inner = (0, import_react4.forwardRef)(
|
|
856
824
|
(props, ref) => {
|
|
857
825
|
const { children, style, ...rest } = props;
|
|
858
826
|
const {
|
|
@@ -898,7 +866,7 @@ function createTransitionComponent(Wrapped) {
|
|
|
898
866
|
}
|
|
899
867
|
);
|
|
900
868
|
Inner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || "Component"})`;
|
|
901
|
-
return (0,
|
|
869
|
+
return (0, import_react4.memo)(Inner);
|
|
902
870
|
}
|
|
903
871
|
|
|
904
872
|
// src/utils/default-screen-options.ts
|