ConnectDropdown.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { Box, Check, ChevronDown } from 'lucide-react'
  2. import { useState } from 'react'
  3. import {
  4. Button,
  5. cn,
  6. Command,
  7. CommandEmpty,
  8. CommandGroup,
  9. CommandInput,
  10. CommandItem,
  11. CommandList,
  12. Popover,
  13. PopoverContent,
  14. PopoverTrigger,
  15. } from 'ui'
  16. import { ConnectionType } from './Connect.constants'
  17. import { ConnectionIcon } from './ConnectionIcon'
  18. interface ConnectDropdownProps {
  19. state: string
  20. updateState: (state: string) => void
  21. label: string
  22. items: ConnectionType[]
  23. iconFolder?: string
  24. supportsDarkMode?: boolean
  25. }
  26. export const ConnectDropdown = ({
  27. state,
  28. updateState,
  29. label,
  30. items,
  31. iconFolder,
  32. supportsDarkMode,
  33. }: ConnectDropdownProps) => {
  34. const [open, setOpen] = useState(false)
  35. function onSelectLib(key: string) {
  36. updateState(key)
  37. setOpen(false)
  38. }
  39. const selectedItem = items.find((item) => item.key === state)
  40. return (
  41. <Popover open={open} onOpenChange={setOpen} modal={false}>
  42. <div className="flex ">
  43. <span className="flex items-center text-foreground-lighter px-3 rounded-lg rounded-r-none text-xs border border-button border-r-0">
  44. {label}
  45. </span>
  46. <PopoverTrigger asChild>
  47. <Button
  48. size="small"
  49. type="default"
  50. className="gap-0 rounded-l-none"
  51. iconRight={<ChevronDown strokeWidth={1.5} />}
  52. >
  53. <div className="flex items-center gap-2">
  54. {selectedItem?.icon ? (
  55. <ConnectionIcon
  56. icon={selectedItem.icon}
  57. iconFolder={iconFolder}
  58. supportsDarkMode={supportsDarkMode}
  59. />
  60. ) : (
  61. <Box size={12} />
  62. )}
  63. {selectedItem?.label}
  64. </div>
  65. </Button>
  66. </PopoverTrigger>
  67. </div>
  68. <PopoverContent className="p-0 max-w-48" side="bottom" align="start">
  69. <Command>
  70. <CommandInput placeholder="Search..." />
  71. <CommandList>
  72. <CommandEmpty>No results found.</CommandEmpty>
  73. <CommandGroup>
  74. {items.map((item) => (
  75. <CommandItem
  76. key={item.key}
  77. value={item.key}
  78. onSelect={() => {
  79. onSelectLib(item.key)
  80. setOpen(false)
  81. }}
  82. className="flex gap-2 items-center"
  83. >
  84. {item.icon ? (
  85. <ConnectionIcon
  86. icon={item.icon}
  87. iconFolder={iconFolder}
  88. supportsDarkMode={supportsDarkMode}
  89. />
  90. ) : (
  91. <Box size={12} />
  92. )}
  93. {item.label}
  94. <Check
  95. size={15}
  96. className={cn('ml-auto ', item.key === state ? 'opacity-100' : 'opacity-0')}
  97. />
  98. </CommandItem>
  99. ))}
  100. </CommandGroup>
  101. </CommandList>
  102. </Command>
  103. </PopoverContent>
  104. </Popover>
  105. )
  106. }