UNPKG

react-navplus

Version:

A flexible, performance-optimized navigation link component for React with multi-router support, prefetching, and advanced active state detection

71 lines 2.35 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useMemo } from 'react'; import { matchers } from '../utils/matchers'; import { defaultPrefetchOptions } from '../utils/prefetch'; import { useNavigate, useLocation } from 'react-router-dom'; /** * Context for sharing navigation state across components */ export const NavLinkContext = createContext({ activeMatchers: matchers, prefetchDefaults: defaultPrefetchOptions, routerContext: undefined }); /** * Provider component for NavLinkContext * * @component * @example * // Basic usage * <NavLinkProvider> * <App /> * </NavLinkProvider> * * @example * // With custom prefetch defaults * <NavLinkProvider * prefetchDefaults={{ enabled: true, delay: 100 }} * > * <App /> * </NavLinkProvider> */ export const NavLinkProvider = ({ children, activeMatchers: customMatchers, prefetchDefaults: customPrefetchDefaults, customRouterContext, useReactRouterContext = true }) => { // Try to get React Router context if enabled let reactRouterContext; if (useReactRouterContext) { try { const navigate = useNavigate(); const location = useLocation(); reactRouterContext = { navigate, location }; } catch (error) { // React Router hooks not available if (process.env.NODE_ENV !== 'production') { console.debug('NavLinkProvider: React Router hooks not available'); } } } // Combine context values const contextValue = useMemo(() => ({ activeMatchers: customMatchers || matchers, prefetchDefaults: { ...defaultPrefetchOptions, ...customPrefetchDefaults }, routerContext: customRouterContext || reactRouterContext }), [customMatchers, customPrefetchDefaults, customRouterContext, reactRouterContext]); return (_jsx(NavLinkContext.Provider, { value: contextValue, children: children })); }; /** * Hook to access NavLinkContext * * @returns {NavLinkContextValue} The current NavLink context value * * @example * // Access context in a component * const { routerContext, prefetchDefaults } = useNavLinkContext(); */ export const useNavLinkContext = () => { return useContext(NavLinkContext); }; //# sourceMappingURL=NavContext.js.map