import type { TeactNode } from '../../lib/teact/teact'; import { useRef } from '../../lib/teact/teact'; import type { ApiMessageEntityCustomEmoji } from '../../api/types'; import type { MenuItemContextAction } from './ListItem'; import { MouseButton } from '../../util/browser/windowEnvironment'; import buildClassName from '../../util/buildClassName'; import useContextMenuHandlers from '../../hooks/useContextMenuHandlers'; import { useFastClick } from '../../hooks/useFastClick'; import useFlag from '../../hooks/useFlag'; import useLastCallback from '../../hooks/useLastCallback'; import FolderIcon from '../common/FolderIcon'; import Icon from '../common/icons/Icon'; import Menu from './Menu'; import MenuItem from './MenuItem'; import MenuSeparator from './MenuSeparator'; import styles from './Folder.module.scss'; type OwnProps = { className?: string; title: TeactNode; isActive?: boolean; isBlocked?: boolean; badgeCount?: number; isBadgeActive?: boolean; contextActions?: MenuItemContextAction[]; contextRootElementSelector?: string; icon?: string | ApiMessageEntityCustomEmoji; clickArg?: number; onClick?: (arg: number) => void; }; const Folder = ({ className, title, isActive, isBlocked, badgeCount, isBadgeActive, contextActions, contextRootElementSelector, icon, clickArg, onClick, }: OwnProps) => { const folderRef = useRef(); const [isHovering, markHovering, unmarkHovering] = useFlag(); const { contextMenuAnchor, handleContextMenu, handleBeforeContextMenu, handleContextMenuClose, handleContextMenuHide, isContextMenuOpen, } = useContextMenuHandlers(folderRef, !contextActions); const { handleClick, handleMouseDown } = useFastClick((e: React.MouseEvent) => { if (contextActions && (e.button === MouseButton.Secondary || !onClick)) { handleBeforeContextMenu(e); } if (e.type === 'mousedown' && e.button !== MouseButton.Main) { return; } onClick?.(clickArg!); }); const getTriggerElement = useLastCallback(() => folderRef.current); const getRootElement = useLastCallback( () => (contextRootElementSelector ? folderRef.current!.closest(contextRootElementSelector) : document.body), ); const getMenuElement = useLastCallback( () => document.querySelector(`.${styles.contextMenu} .bubble`), ); const getLayout = useLastCallback(() => ({ withPortal: true })); return (
{Boolean(badgeCount) && ( {badgeCount} )}
{isBlocked && } {title}
{contextActions && contextMenuAnchor !== undefined && ( {contextActions.map((action) => ( ('isSeparator' in action) ? ( ) : ( {action.title} ) ))} )}
); }; export default Folder;