@ionic/react-router 9.0.7-dev.11791478996.1b854592 → 9.0.7-dev.11792524803.14f0e7d2

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.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import React, { useRef, useState, useEffect, useCallback } from 'react';
2
- import { Route, matchPath as matchPath$1, Routes, Navigate, UNSAFE_RouteContext, matchRoutes, useLocation, useNavigate, BrowserRouter, useNavigationType, HashRouter } from 'react-router-dom';
2
+ import { Route, matchPath as matchPath$1, Routes, Navigate, UNSAFE_RouteContext, matchRoutes, useLocation, useNavigate, BrowserRouter, useNavigationType, MemoryRouter, HashRouter } from 'react-router-dom';
3
3
  import { IonRoute, ViewStacks, generateId, ViewLifeCycleManager, createDebugLogger, StackContext, RouteManagerContext, getConfig, LocationHistory, NavManager } from '@ionic/react';
4
4
  import { LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER } from '@ionic/core/components';
5
- import { MemoryRouter, useLocation as useLocation$1, useNavigationType as useNavigationType$1 } from 'react-router';
6
5
 
7
6
  const IonRouteInner = ({ path, index, caseSensitive, element }) => {
8
7
  return React.createElement(Route, { path: path, index: index, caseSensitive: caseSensitive, element: element });
@@ -622,14 +621,16 @@ const getFallbackParamsFromViewItems = (allViewItems, currentOutletId, currentPa
622
621
  return params;
623
622
  };
624
623
  /**
625
- * Builds the matches array for RouteContext.
624
+ * Builds the matches array for RouteContext. The leaf `pathname` uses the absolute base,
625
+ * because the raw match is relative for a route without a leading slash, which breaks
626
+ * relative links, and includes a splat's tail, which loops an index `<Navigate>`.
626
627
  */
627
- const buildContextMatches = (parentMatches, combinedParams, routeMatch, routeInfoPathname, absolutePathnameBase, viewItem, routeElement, componentElement) => {
628
+ const buildContextMatches = (parentMatches, combinedParams, absolutePathnameBase, viewItem, routeElement, componentElement) => {
628
629
  return [
629
630
  ...parentMatches,
630
631
  {
631
632
  params: combinedParams,
632
- pathname: routeMatch?.pathname || routeInfoPathname,
633
+ pathname: absolutePathnameBase,
633
634
  pathnameBase: absolutePathnameBase,
634
635
  route: {
635
636
  id: viewItem.id,
@@ -982,7 +983,7 @@ class ReactRouterViewStack extends ViewStacks {
982
983
  const combinedParams = { ...accumulatedParentParams, ...(routeMatch?.params ?? {}) };
983
984
  const parentPathnameBase = parentMatches.length > 0 ? parentMatches[parentMatches.length - 1].pathnameBase : '/';
984
985
  const absolutePathnameBase = computeAbsolutePathnameBase(routeElement, routeMatch, parentPathnameBase, routeInfo.pathname);
985
- const contextMatches = buildContextMatches(parentMatches, combinedParams, routeMatch, routeInfo.pathname, absolutePathnameBase, viewItem, routeElement, componentElement);
986
+ const contextMatches = buildContextMatches(parentMatches, combinedParams, absolutePathnameBase, viewItem, routeElement, componentElement);
986
987
  const routeContextValue = parentContext
987
988
  ? { ...parentContext, matches: contextMatches }
988
989
  : { outlet: null, matches: contextMatches, isDataRoute: false };
@@ -2578,7 +2579,7 @@ class StackManager extends React.PureComponent {
2578
2579
  return canStartSwipe;
2579
2580
  };
2580
2581
  const onStart = async () => {
2581
- // Core skips onEnd when an animated swipe ends without a progress animation, so a
2582
+ // Core only calls onEnd when a progress animation exists, so with animations off a
2582
2583
  // previous gesture can leave its mark behind. Drop any stale one before marking.
2583
2584
  this.clearSwipeRevealedView();
2584
2585
  const { routeInfo } = this.props;
@@ -2607,9 +2608,9 @@ class StackManager extends React.PureComponent {
2607
2608
  revealIonPageForSwipeBack(enteringViewItem?.ionPageElement);
2608
2609
  // When the gesture starts, kick off a transition controlled via swipe gesture
2609
2610
  if (enteringViewItem && leavingViewItem) {
2610
- // Without a leaving view there is no progress animation, and core skips
2611
- // swipeHandler.onEnd for an animated swipe without one, so nothing would clear the
2612
- // mark until the next transition.
2611
+ // Without a leaving view there is no progress animation, and core only calls
2612
+ // swipeHandler.onEnd when one exists, so nothing would clear the mark until the
2613
+ // next transition.
2613
2614
  markSwipeRevealed(enteringViewItem);
2614
2615
  this.swipeRevealedViewItem = enteringViewItem;
2615
2616
  await this.transitionPage(routeInfo, enteringViewItem, leavingViewItem, 'back', true);
@@ -3708,6 +3709,18 @@ const IonRouter = ({ children, registerHistoryListener }) => {
3708
3709
  };
3709
3710
  IonRouter.displayName = 'IonRouter';
3710
3711
 
3712
+ /**
3713
+ * Defaults React Router 7's `useTransitions` to `false`, since a transition can defer the
3714
+ * commit past Ionic's page-visible signal. React Router 6 ignores the prop.
3715
+ *
3716
+ * Uses `??` instead of spreading a default first, because an explicit
3717
+ * `useTransitions={undefined}` would override it and React Router reads that as on.
3718
+ */
3719
+ const withTransitionDefaults = (props) => {
3720
+ const { useTransitions } = props;
3721
+ return { ...props, useTransitions: useTransitions ?? false };
3722
+ };
3723
+
3711
3724
  /**
3712
3725
  * `IonReactRouter` facilitates the integration of Ionic's specific
3713
3726
  * navigation and UI management with the standard React Router mechanisms,
@@ -3752,7 +3765,7 @@ const RouterContent$2 = ({ children }) => {
3752
3765
  return React.createElement(IonRouter, { registerHistoryListener: registerHistoryListener }, children);
3753
3766
  };
3754
3767
  const IonReactRouter = ({ children, ...browserRouterProps }) => {
3755
- return (React.createElement(BrowserRouter, { ...browserRouterProps },
3768
+ return (React.createElement(BrowserRouter, { ...withTransitionDefaults(browserRouterProps) },
3756
3769
  React.createElement(RouterContent$2, null, children)));
3757
3770
  };
3758
3771
 
@@ -3762,8 +3775,8 @@ const IonReactRouter = ({ children, ...browserRouterProps }) => {
3762
3775
  * isn't available or desirable.
3763
3776
  */
3764
3777
  const RouterContent$1 = ({ children }) => {
3765
- const location = useLocation$1();
3766
- const navigationType = useNavigationType$1();
3778
+ const location = useLocation();
3779
+ const navigationType = useNavigationType();
3767
3780
  const historyListenHandler = useRef();
3768
3781
  const registerHistoryListener = useCallback((cb) => {
3769
3782
  historyListenHandler.current = cb;
@@ -3791,7 +3804,7 @@ const RouterContent$1 = ({ children }) => {
3791
3804
  return React.createElement(IonRouter, { registerHistoryListener: registerHistoryListener }, children);
3792
3805
  };
3793
3806
  const IonReactMemoryRouter = ({ children, ...routerProps }) => {
3794
- return (React.createElement(MemoryRouter, { ...routerProps },
3807
+ return (React.createElement(MemoryRouter, { ...withTransitionDefaults(routerProps) },
3795
3808
  React.createElement(RouterContent$1, null, children)));
3796
3809
  };
3797
3810
 
@@ -3829,7 +3842,7 @@ const RouterContent = ({ children }) => {
3829
3842
  return React.createElement(IonRouter, { registerHistoryListener: registerHistoryListener }, children);
3830
3843
  };
3831
3844
  const IonReactHashRouter = ({ children, ...routerProps }) => {
3832
- return (React.createElement(HashRouter, { ...routerProps },
3845
+ return (React.createElement(HashRouter, { ...withTransitionDefaults(routerProps) },
3833
3846
  React.createElement(RouterContent, null, children)));
3834
3847
  };
3835
3848