12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import { useCallback } from 'react';
- import { useHistory } from 'react-router-dom';
- import { openURL } from 'mastodon/actions/search';
- import { useAppDispatch } from 'mastodon/store';
- const isMentionClick = (element: HTMLAnchorElement) =>
- element.classList.contains('mention');
- const isHashtagClick = (element: HTMLAnchorElement) =>
- element.textContent?.[0] === '#' ||
- element.previousSibling?.textContent?.endsWith('#');
- export const useLinks = () => {
- const history = useHistory();
- const dispatch = useAppDispatch();
- const handleHashtagClick = useCallback(
- (element: HTMLAnchorElement) => {
- const { textContent } = element;
- if (!textContent) return;
- history.push(`/tags/${textContent.replace(/^#/, '')}`);
- },
- [history],
- );
- const handleMentionClick = useCallback(
- (element: HTMLAnchorElement) => {
- dispatch(
- openURL(element.href, history, () => {
- window.location.href = element.href;
- }),
- );
- },
- [dispatch, history],
- );
- const handleClick = useCallback(
- (e: React.MouseEvent) => {
- const target = (e.target as HTMLElement).closest('a');
- if (!target || e.button !== 0 || e.ctrlKey || e.metaKey) {
- return;
- }
- if (isMentionClick(target)) {
- e.preventDefault();
- handleMentionClick(target);
- } else if (isHashtagClick(target)) {
- e.preventDefault();
- handleHashtagClick(target);
- }
- },
- [handleMentionClick, handleHashtagClick],
- );
- return handleClick;
- };
|