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 { useAtomValue } from 'jotai'; import FocusTrap from 'focus-trap-react'; import { useOrphanRooms } from '../../../state/hooks/roomList'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { mDirectAtom } from '../../../state/mDirectList'; import { roomToParentsAtom } from '../../../state/room/roomToParents'; import { allRoomsAtom } from '../../../state/room-list/roomList'; import { roomToUnreadAtom } from '../../../state/room/roomToUnread'; import { getHomePath, joinPathComponent } from '../../pathUtils'; import { useRoomsUnread } from '../../../state/hooks/unread'; import { SidebarAvatar, SidebarItem, SidebarItemBadge, SidebarItemTooltip, } from '../../../components/sidebar'; import { useHomeSelected } from '../../../hooks/router/useHomeSelected'; import { UnreadBadge } from '../../../components/unread-badge'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { useNavToActivePathAtom } from '../../../state/hooks/navToActivePath'; import { useHomeRooms } from '../home/useHomeRooms'; import { markAsRead } from '../../../../client/action/notifications'; import { stopPropagation } from '../../../utils/keyboard'; import { useSetting } from '../../../state/hooks/settings'; import { settingsAtom } from '../../../state/settings'; type HomeMenuProps = { requestClose: () => void; }; const HomeMenu = forwardRef(({ requestClose }, ref) => { const orphanRooms = useHomeRooms(); const [hideActivity] = useSetting(settingsAtom, 'hideActivity'); const unread = useRoomsUnread(orphanRooms, roomToUnreadAtom); const mx = useMatrixClient(); const handleMarkAsRead = () => { if (!unread) return; orphanRooms.forEach((rId) => markAsRead(mx, rId, hideActivity)); requestClose(); }; return ( } radii="300" aria-disabled={!unread} > Mark as Read ); }); export function HomeTab() { const navigate = useNavigate(); const mx = useMatrixClient(); const screenSize = useScreenSizeContext(); const navToActivePath = useAtomValue(useNavToActivePathAtom()); const mDirects = useAtomValue(mDirectAtom); const roomToParents = useAtomValue(roomToParentsAtom); const orphanRooms = useOrphanRooms(mx, allRoomsAtom, mDirects, roomToParents); const homeUnread = useRoomsUnread(orphanRooms, roomToUnreadAtom); const homeSelected = useHomeSelected(); const [menuAnchor, setMenuAnchor] = useState(); const handleHomeClick = () => { const activePath = navToActivePath.get('home'); if (activePath && screenSize !== ScreenSize.Mobile) { navigate(joinPathComponent(activePath)); return; } navigate(getHomePath()); }; const handleContextMenu: MouseEventHandler = (evt) => { evt.preventDefault(); const cords = evt.currentTarget.getBoundingClientRect(); setMenuAnchor((currentState) => { if (currentState) return undefined; return cords; }); }; return ( {(triggerRef) => ( )} {homeUnread && ( 0}> 0} count={homeUnread.total} /> )} {menuAnchor && ( setMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', escapeDeactivates: stopPropagation, }} > setMenuAnchor(undefined)} /> } /> )} ); }