import React, { useEffect, useState, type ReactElement } from 'react'; import type { LinkProps } from 'next/link'; import Link from 'next/link'; import { useRouter } from 'next/router'; export interface NextNavLinkProps extends LinkProps { children: ReactElement | ((o: { isActive: boolean }) => ReactElement); className?: string | ((o: { isActive: boolean }) => string); ref?: any; } export const NextNavLink = ({ children, className, ref, ...props }: NextNavLinkProps) => { const { asPath, isReady } = useRouter(); const [isActive, setActive] = useState(false); useEffect(() => { if (isReady) { const linkPathname = new URL((props.as || props.href) as string, location.href).pathname; const activePathname = new URL(asPath, location.href).pathname; setActive(linkPathname === activePathname); } }, [asPath, isReady, props.as, props.href]); return ( {typeof children === 'function' ? children({ isActive }) : children} ); };