import { forwardRef } from 'preact/compat'; import { useLocation } from 'react-router-dom'; import states from '../utils/states'; /* NOTES ===== Initially this uses <NavLink> from react-router-dom, but it doesn't work: 1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a> 2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux "location" to make the modals work and prevent unmounting 3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead. */ const Link = forwardRef((props, ref) => { let routerLocation; try { routerLocation = useLocation(); } catch (e) {} let hash = (location.hash || '').replace(/^#/, '').trim(); if (hash === '') hash = '/'; const { to, ...restProps } = props; // Handle encodeURIComponent of searchParams values if (!!hash && hash !== '/' && hash.includes('?')) { const parsedHash = URL.parse(hash, location.origin); // Fake base URL if (parsedHash?.searchParams?.size) { const searchParamsStr = Array.from(parsedHash.searchParams.entries()) .map(([key, value]) => `${key}=${encodeURIComponent(value)}`) .join('&'); hash = parsedHash.pathname + '?' + searchParamsStr; } } const isActive = hash === to || decodeURIComponent(hash) === to; return ( <a ref={ref} href={`#${to}`} {...restProps} class={`${props.class || ''} ${isActive ? 'is-active' : ''}`} onClick={(e) => { if (e.currentTarget?.parentNode?.closest('a')) { // If this <a> is nested inside another <a> e.stopPropagation(); } if (routerLocation) states.prevLocation = routerLocation; props.onClick?.(e); }} /> ); }); export default Link;