import {forwardRef, AnchorHTMLAttributes} from 'react'
import {useHref} from 'react-router'
import {useNavigateWithTransition} from '../../hooks/navigation/useNavigateWithTransition'
/**
* Navigation component that triggers animated page changes based on CSS View Transitions. Use instead of React Router's `Link` or `` tags when you want smooth native feeling navigation within your Mini. Should be wrapped within a `MinisRouter`.
*
* > Caution: In order for the animation transitions to work, you need to enable view transitions in `MinisRouter`
* @publicDocs
*/
export interface TransitionLinkDocProps {
/** The target path to navigate to */
to: string
/** Click handler called before navigation */
onClick?: React.MouseEventHandler
/** Content to render inside the link */
children?: React.ReactNode
}
export interface TransitionLinkProps extends AnchorHTMLAttributes {
to: string
}
const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i
export const TransitionLink = forwardRef<
HTMLAnchorElement,
TransitionLinkProps
>(({onClick, to, children, ...props}, forwardedRef) => {
const transitionNavigate = useNavigateWithTransition()
const isAbsolute = typeof to === 'string' && ABSOLUTE_URL_REGEX.test(to)
if (isAbsolute) {
console.warn(
`TransitionLink: absolute URLs are not supported. Please update to a valid relative path.`
)
}
const href = useHref(to)
const handleClick = (event: React.MouseEvent) => {
if (onClick) onClick(event)
if (!event.defaultPrevented) {
event.preventDefault()
transitionNavigate(to)
}
}
return (
{children}
)
})