prompt-option.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { memo } from 'react'
  2. import { MenuOption } from '@lexical/react/LexicalTypeaheadMenuPlugin'
  3. export class PromptOption extends MenuOption {
  4. title: string
  5. icon?: JSX.Element
  6. keywords: Array<string>
  7. keyboardShortcut?: string
  8. onSelect: (queryString: string) => void
  9. disabled?: boolean
  10. constructor(
  11. title: string,
  12. options: {
  13. icon?: JSX.Element
  14. keywords?: Array<string>
  15. keyboardShortcut?: string
  16. onSelect: (queryString: string) => void
  17. disabled?: boolean
  18. },
  19. ) {
  20. super(title)
  21. this.title = title
  22. this.keywords = options.keywords || []
  23. this.icon = options.icon
  24. this.keyboardShortcut = options.keyboardShortcut
  25. this.onSelect = options.onSelect.bind(this)
  26. this.disabled = options.disabled
  27. }
  28. }
  29. type PromptMenuItemMenuItemProps = {
  30. startIndex: number
  31. index: number
  32. isSelected: boolean
  33. onClick: (index: number, option: PromptOption) => void
  34. onMouseEnter: (index: number, option: PromptOption) => void
  35. option: PromptOption
  36. }
  37. export const PromptMenuItem = memo(({
  38. startIndex,
  39. index,
  40. isSelected,
  41. onClick,
  42. onMouseEnter,
  43. option,
  44. }: PromptMenuItemMenuItemProps) => {
  45. return (
  46. <div
  47. key={option.key}
  48. className={`
  49. flex items-center px-3 h-6 cursor-pointer hover:bg-gray-50 rounded-md
  50. ${isSelected && !option.disabled && '!bg-gray-50'}
  51. ${option.disabled ? 'cursor-not-allowed opacity-30' : 'hover:bg-gray-50 cursor-pointer'}
  52. `}
  53. tabIndex={-1}
  54. ref={option.setRefElement}
  55. onMouseEnter={() => onMouseEnter(index + startIndex, option)}
  56. onClick={() => onClick(index + startIndex, option)}>
  57. {option.icon}
  58. <div className='ml-1 text-[13px] text-gray-900'>{option.title}</div>
  59. </div>
  60. )
  61. })
  62. PromptMenuItem.displayName = 'PromptMenuItem'