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 { 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 { markAsRead } from '../../../../client/action/notifications'; type DirectMenuProps = { requestClose: () => void; }; const DirectMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useDirectRooms(); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); const handleMarkAsRead = () => { if (!unread) return; orphanRooms.forEach((rId) => markAsRead(rId)); 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) => ( )} {directUnread && ( 0}> 0} count={directUnread.total} /> )} {menuAnchor && ( setMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', }} > setMenuAnchor(undefined)} /> } /> )} ); }