variable-option.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { memo } from 'react'
  2. type VariableMenuItemProps = {
  3. title: string
  4. icon?: JSX.Element
  5. extraElement?: JSX.Element
  6. isSelected: boolean
  7. queryString: string | null
  8. onClick: () => void
  9. onMouseEnter: () => void
  10. setRefElement?: (element: HTMLDivElement) => void
  11. }
  12. export const VariableMenuItem = memo(({
  13. title,
  14. icon,
  15. extraElement,
  16. isSelected,
  17. queryString,
  18. onClick,
  19. onMouseEnter,
  20. setRefElement,
  21. }: VariableMenuItemProps) => {
  22. let before = title
  23. let middle = ''
  24. let after = ''
  25. if (queryString) {
  26. const regex = new RegExp(queryString, 'i')
  27. const match = regex.exec(title)
  28. if (match) {
  29. before = title.substring(0, match.index)
  30. middle = match[0]
  31. after = title.substring(match.index + match[0].length)
  32. }
  33. }
  34. return (
  35. <div
  36. className={`
  37. flex items-center px-3 h-6 rounded-md hover:bg-primary-50 cursor-pointer
  38. ${isSelected && 'bg-primary-50'}
  39. `}
  40. tabIndex={-1}
  41. ref={setRefElement}
  42. onMouseEnter={onMouseEnter}
  43. onClick={onClick}>
  44. <div className='mr-2'>
  45. {icon}
  46. </div>
  47. <div className='grow text-[13px] text-gray-900 truncate' title={title}>
  48. {before}
  49. <span className='text-[#2970FF]'>{middle}</span>
  50. {after}
  51. </div>
  52. {extraElement}
  53. </div>
  54. )
  55. })
  56. VariableMenuItem.displayName = 'VariableMenuItem'