iterative/vscode-dvc

View on GitHub
webview/src/shared/components/iconMenu/IconMenuItem.tsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React, { MouseEvent, ReactNode } from 'react'
import cx from 'classnames'
import { TippyProps } from '@tippyjs/react'
import styles from './styles.module.scss'
import { Icon, IconValue } from '../Icon'
import Tooltip from '../tooltip/Tooltip'

export interface IconMenuItemProps {
  icon: IconValue
  onClick?: () => void
  onClickNode?: ReactNode
  tooltip: string
  hidden?: boolean
}

interface IconMenuItemAllProps extends IconMenuItemProps {
  tooltipTarget: TippyProps['singleton']
  menuTarget: TippyProps['singleton']
}

export const IconMenuItem: React.FC<IconMenuItemAllProps> = ({
  icon,
  onClick,
  onClickNode,
  tooltip,
  tooltipTarget,
  menuTarget
}) => {
  const handleOnClick = (e: MouseEvent<HTMLButtonElement>) => {
    e.stopPropagation()
    e.preventDefault()
    onClick?.()
  }
  let button = (
    <Tooltip content={tooltip} singleton={tooltipTarget}>
      <button
        aria-label={tooltip}
        className={cx(styles.item, { [styles.clickable]: !!onClick })}
        onClick={handleOnClick}
        data-testid="icon-menu-item"
      >
        <Icon icon={icon} data-testid="icon-menu-item-icon" width={15} />
      </button>
    </Tooltip>
  )
  if (onClickNode) {
    button = (
      <Tooltip content={onClickNode} singleton={menuTarget}>
        {button}
      </Tooltip>
    )
  }
  return <li>{button}</li>
}