iterative/vscode-dvc

View on GitHub
webview/src/shared/components/messagesMenu/MessagesMenuOption.tsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React from 'react'
import cx from 'classnames'
import { MessageFromWebview } from 'dvc/src/webview/contract'
import { VSCodeDivider } from '@vscode/webview-ui-toolkit/react'
import styles from './styles.module.scss'
import { sendMessage } from '../../vscode'

export interface MessagesMenuOptionProps {
  id: string
  label: string
  message?: MessageFromWebview
  disabled?: boolean
  divider?: boolean
  keyboardShortcut?: string
}

export const MessagesMenuOption: React.FC<
  MessagesMenuOptionProps & { onOptionSelected?: () => void }
> = ({
  label,
  message,
  disabled,
  divider,
  onOptionSelected,
  keyboardShortcut
}) => {
  const sendTheMessage = () => {
    if (disabled) {
      return
    }
    !!message && sendMessage(message)
    onOptionSelected?.()
  }

  const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) =>
    e.key === 'Enter' && sendTheMessage()

  return (
    <>
      {divider && (
        <div className={styles.dividerContainer}>
          <VSCodeDivider />
        </div>
      )}
      <div
        aria-disabled={disabled}
        className={cx(styles.item, disabled && styles.disabledItem)}
        onClick={sendTheMessage}
        onKeyDown={onKeyDown}
        role="menuitem"
        data-testid="messages-menu-option"
        tabIndex={0}
      >
        <div
          className={styles.itemLabel}
          data-testid="messages-menu-option-label"
        >
          {label}
        </div>
        {keyboardShortcut && <div>{keyboardShortcut}</div>}
      </div>
    </>
  )
}