ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
122 lines • 4.93 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.reactRouterProvider = void 0;
const React = __importStar(require("react"));
const react_1 = require("react");
const react_router_dom_1 = require("react-router-dom");
const routerProviderFuture = { v7_startTransition: false, v7_relativeSplatPath: false };
/**
* Hook to check if navigation blocking is supported.
* In react-router, blocking requires a data router.
*/
const useCanBlock = () => {
const dataRouterContext = (0, react_1.useContext)(react_router_dom_1.UNSAFE_DataRouterContext);
const dataRouterStateContext = (0, react_1.useContext)(react_router_dom_1.UNSAFE_DataRouterStateContext);
return !!(dataRouterContext && dataRouterStateContext);
};
/**
* Wrapper around react-router's useNavigate that returns a stable function reference.
*
* react-router's useNavigate forces rerenders on every navigation, even if we don't use the result.
* @see https://github.com/remix-run/react-router/issues/7634
*
* This wrapper uses a ref to return a stable function reference, avoiding unnecessary rerenders
* in components that use navigate but don't need to rerender on navigation.
*/
const useNavigate = () => {
const navigate = (0, react_router_dom_1.useNavigate)();
const navigateRef = (0, react_1.useRef)(navigate);
(0, react_1.useEffect)(() => {
navigateRef.current = navigate;
}, [navigate]);
// Return a stable function that always calls the latest navigate
return React.useCallback((...args) => {
return navigateRef.current(...args);
}, []);
};
/**
* Internal router component that creates a HashRouter.
* Only used when not already inside a router context.
*/
const InternalRouter = ({ children, basename, }) => {
const router = (0, react_router_dom_1.createHashRouter)([{ path: '*', element: React.createElement(React.Fragment, null, children) }], {
basename,
future: {
v7_fetcherPersist: false,
v7_normalizeFormMethod: false,
v7_partialHydration: false,
v7_relativeSplatPath: false,
v7_skipActionErrorRevalidation: false,
},
});
return (React.createElement(react_router_dom_1.RouterProvider, { router: router, future: routerProviderFuture }));
};
/**
* RouterWrapper component for react-router.
* Creates a HashRouter if not already inside a router context.
*/
const RouterWrapper = ({ basename, children }) => {
const isInRouter = (0, react_router_dom_1.useInRouterContext)();
if (isInRouter) {
return React.createElement(React.Fragment, null, children);
}
return React.createElement(InternalRouter, { basename: basename }, children);
};
/**
* Default router provider using react-router-dom.
* This provider is used by default when no custom routerProvider is provided to <Admin>.
*/
exports.reactRouterProvider = {
// Hooks
useNavigate,
useLocation: react_router_dom_1.useLocation,
useParams: react_router_dom_1.useParams,
useBlocker: react_router_dom_1.useBlocker,
useMatch: react_router_dom_1.useMatch,
useInRouterContext: react_router_dom_1.useInRouterContext,
useCanBlock,
// Components
Link: react_router_dom_1.Link,
Navigate: react_router_dom_1.Navigate,
Route: react_router_dom_1.Route,
Routes: react_router_dom_1.Routes,
Outlet: react_router_dom_1.Outlet,
// Router creation
RouterWrapper,
// Utilities
matchPath: react_router_dom_1.matchPath,
};
//# sourceMappingURL=reactRouterProvider.js.map