Dropdown.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { MenuProps } from '@szhsin/react-menu';
  2. import React, { PropsWithChildren, useRef } from 'react';
  3. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  4. import useModal from 'lib/hooks/useModal';
  5. import * as S from './Dropdown.styled';
  6. interface DropdownProps extends PropsWithChildren<Partial<MenuProps>> {
  7. label?: React.ReactNode;
  8. }
  9. const Dropdown: React.FC<DropdownProps> = ({ label, children }) => {
  10. const ref = useRef(null);
  11. const { isOpen, setClose, setOpen } = useModal(false);
  12. const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {
  13. e.preventDefault();
  14. e.stopPropagation();
  15. setOpen();
  16. };
  17. return (
  18. <>
  19. <S.DropdownButton
  20. onClick={handleClick}
  21. ref={ref}
  22. aria-label="Dropdown Toggle"
  23. >
  24. {label || <VerticalElipsisIcon />}
  25. </S.DropdownButton>
  26. <S.Dropdown
  27. anchorRef={ref}
  28. state={isOpen ? 'open' : 'closed'}
  29. onMouseLeave={setClose}
  30. onClose={setClose}
  31. align="end"
  32. direction="bottom"
  33. offsetY={10}
  34. viewScroll="auto"
  35. >
  36. {children}
  37. </S.Dropdown>
  38. </>
  39. );
  40. };
  41. export default Dropdown;