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
JavaScript
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