contextMenu.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import {MouseEvent} from 'react';
  2. import styled from '@emotion/styled';
  3. import classNames from 'classnames';
  4. import DropdownMenu from 'app/components/dropdownMenu';
  5. import {IconEllipsis} from 'app/icons';
  6. const ContextMenu = ({children}) => (
  7. <DropdownMenu>
  8. {({isOpen, getRootProps, getActorProps, getMenuProps}) => {
  9. const topLevelCx = classNames('dropdown', {
  10. 'anchor-right': true,
  11. open: isOpen,
  12. });
  13. return (
  14. <MoreOptions
  15. {...getRootProps({
  16. className: topLevelCx,
  17. })}
  18. >
  19. <DropdownTarget
  20. {...getActorProps<HTMLDivElement>({
  21. onClick: (event: MouseEvent) => {
  22. event.stopPropagation();
  23. event.preventDefault();
  24. },
  25. })}
  26. >
  27. <IconEllipsis data-test-id="context-menu" size="md" />
  28. </DropdownTarget>
  29. {isOpen && (
  30. <ul {...getMenuProps({})} className={classNames('dropdown-menu')}>
  31. {children}
  32. </ul>
  33. )}
  34. </MoreOptions>
  35. );
  36. }}
  37. </DropdownMenu>
  38. );
  39. const MoreOptions = styled('span')`
  40. display: flex;
  41. color: ${p => p.theme.textColor};
  42. `;
  43. const DropdownTarget = styled('div')`
  44. display: flex;
  45. cursor: pointer;
  46. padding: 0 5px;
  47. `;
  48. export default ContextMenu;