42 lines
966 B
TypeScript
42 lines
966 B
TypeScript
|
import { useCallback } from 'react';
|
||
|
|
||
|
import { useAppHistory } from './router';
|
||
|
|
||
|
interface Props extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
||
|
to: string;
|
||
|
}
|
||
|
|
||
|
export const Permalink: React.FC<Props> = ({
|
||
|
className,
|
||
|
href,
|
||
|
to,
|
||
|
children,
|
||
|
...props
|
||
|
}) => {
|
||
|
const history = useAppHistory();
|
||
|
|
||
|
const handleClick = useCallback<React.MouseEventHandler<HTMLAnchorElement>>(
|
||
|
(e) => {
|
||
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- history can actually be undefined as the component can be mounted outside a router context
|
||
|
if (e.button === 0 && !(e.ctrlKey || e.metaKey) && history) {
|
||
|
e.preventDefault();
|
||
|
history.push(to);
|
||
|
}
|
||
|
},
|
||
|
[history, to],
|
||
|
);
|
||
|
|
||
|
return (
|
||
|
<a
|
||
|
target='_blank'
|
||
|
rel='noreferrer'
|
||
|
href={href}
|
||
|
onClick={handleClick}
|
||
|
className={`permalink${className ? ' ' + className : ''}`}
|
||
|
{...props}
|
||
|
>
|
||
|
{children}
|
||
|
</a>
|
||
|
);
|
||
|
};
|