您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

variable-option.tsx 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { memo } from 'react'
  2. type VariableMenuItemProps = {
  3. title: string
  4. icon?: React.JSX.Element
  5. extraElement?: React.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 h-6 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover
  38. ${isSelected && 'bg-state-base-hover'}
  39. `}
  40. tabIndex={-1}
  41. ref={setRefElement}
  42. onMouseEnter={onMouseEnter}
  43. onMouseDown={(e) => {
  44. e.preventDefault()
  45. e.stopPropagation()
  46. }}
  47. onClick={onClick}>
  48. <div className='mr-2'>
  49. {icon}
  50. </div>
  51. <div className='grow truncate text-[13px] text-text-secondary' title={title}>
  52. {before}
  53. <span className='text-text-accent'>{middle}</span>
  54. {after}
  55. </div>
  56. {extraElement}
  57. </div>
  58. )
  59. })
  60. VariableMenuItem.displayName = 'VariableMenuItem'