import { ReactEventHandler, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { useRoomNavigate } from './useRoomNavigate'; import { useMatrixClient } from './useMatrixClient'; import { isRoomId, isUserId } from '../utils/matrix'; import { getHomeRoomPath, withSearchParam } from '../pages/pathUtils'; import { _RoomSearchParams } from '../pages/paths'; import { useOpenUserRoomProfile } from '../state/hooks/userRoomProfile'; import { useSpaceOptionally } from './useSpace'; export const useMentionClickHandler = (roomId: string): ReactEventHandler => { const mx = useMatrixClient(); const { navigateRoom, navigateSpace } = useRoomNavigate(); const navigate = useNavigate(); const openProfile = useOpenUserRoomProfile(); const space = useSpaceOptionally(); const handleClick: ReactEventHandler = useCallback( (evt) => { evt.stopPropagation(); evt.preventDefault(); const target = evt.currentTarget; const mentionId = target.getAttribute('data-mention-id'); if (typeof mentionId !== 'string') return; if (isUserId(mentionId)) { openProfile(roomId, space?.roomId, mentionId, target.getBoundingClientRect()); return; } const eventId = target.getAttribute('data-mention-event-id') || undefined; if (isRoomId(mentionId) && mx.getRoom(mentionId)) { if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId); else navigateRoom(mentionId, eventId); return; } const viaServers = target.getAttribute('data-mention-via') || undefined; const path = getHomeRoomPath(mentionId, eventId); navigate(viaServers ? withSearchParam<_RoomSearchParams>(path, { viaServers }) : path); }, [mx, navigate, navigateRoom, navigateSpace, roomId, space, openProfile] ); return handleClick; };