import React, { MouseEventHandler, forwardRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useAtomValue } from 'jotai'; import PaarrotSVG from '../../../../../public/res/svg/paarrot.svg'; import PaarrotUnreadSVG from '../../../../../public/res/svg/paarrot-unread.svg'; import PaarrotHighlightSVG from '../../../../../public/res/svg/paarrot-highlight.svg'; import { useDirects } from '../../../state/hooks/roomList'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { mDirectAtom } from '../../../state/mDirectList'; import { allRoomsAtom } from '../../../state/room-list/roomList'; import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; import { getDirectPath, joinPathComponent } from '../../pathUtils'; import { useRoomsUnread } from '../../../state/hooks/unread'; import { SidebarAvatar, SidebarItem, SidebarItemBadge, SidebarItemTooltip, } from '../../../components/sidebar'; import { useDirectSelected } from '../../../hooks/router/useDirectSelected'; import { UnreadBadge } from '../../../components/unread-badge'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; import { useDirectRooms } from '../direct/useDirectRooms'; import { useMarkRoomsAsRead } from '../../../hooks/useMarkAsRead'; import { stopPropagation } from '../../../utils/keyboard'; import { settingsAtom } from '../../../state/settings'; import { useSetting } from '../../../state/hooks/settings'; type DirectMenuProps = { requestClose: () => void; }; const DirectMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useDirectRooms(); const [hideActivity] = useSetting(settingsAtom, 'hideActivity'); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); const mx = useMatrixClient(); const markRoomsAsRead = useMarkRoomsAsRead(mx); const handleMarkAsRead = () => { if (!unread) return; markRoomsAsRead(orphanRooms, hideActivity); requestClose(); }; return ( } radii="300" aria-disabled={!unread} > Mark as Read ); }); export function DirectTab() { const navigate = useNavigate(); const mx = useMatrixClient(); const screenSize = useScreenSizeContext(); const navToActivePath = useAtomValue(useNavToActivePathAtom()); const mDirects = useAtomValue(mDirectAtom); const directs = useDirects(mx, allRoomsAtom, mDirects); const directUnread = useRoomsUnread(directs, roomToUnreadAtom); const [menuAnchor, setMenuAnchor] = useState(); const directSelected = useDirectSelected(); const handleDirectClick = () => { const activePath = navToActivePath.get('direct'); if (activePath && screenSize !== ScreenSize.Mobile) { navigate(joinPathComponent(activePath)); return; } navigate(getDirectPath()); }; const handleContextMenu: MouseEventHandler = (evt) => { evt.preventDefault(); const cords = evt.currentTarget.getBoundingClientRect(); setMenuAnchor((currentState) => { if (currentState) return undefined; return cords; }); }; return ( {(triggerRef) => ( Direct Messages )} {directUnread && directUnread.total > 0 && (
0} count={directUnread.total} />
)} {menuAnchor && ( setMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> } /> )}
); }