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>
 | 
						|
  );
 | 
						|
};
 |