ConnectionParameters.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { Check, ChevronRight, Copy } from 'lucide-react'
  2. import { useState } from 'react'
  3. import {
  4. Button,
  5. cn,
  6. Collapsible,
  7. CollapsibleContent,
  8. CollapsibleTrigger,
  9. copyToClipboard,
  10. Separator,
  11. } from 'ui'
  12. interface Parameter {
  13. key: string
  14. value: string
  15. }
  16. interface ConnectionParametersProps {
  17. parameters: Parameter[]
  18. }
  19. export const ConnectionParameters = ({ parameters }: ConnectionParametersProps) => {
  20. const [isOpen, setIsOpen] = useState(false)
  21. const [copiedMap, setCopiedMap] = useState<Record<string, boolean>>({})
  22. return (
  23. <Collapsible open={isOpen} onOpenChange={setIsOpen} className="group -space-y-px">
  24. <CollapsibleTrigger
  25. asChild
  26. className="w-full justify-start rounded-t-none !last:rounded-b group-data-open:rounded-b-none px-3"
  27. >
  28. <Button
  29. type="default"
  30. size="tiny"
  31. className="text-foreground-lighter bg-dash-sidebar!"
  32. icon={
  33. <ChevronRight
  34. className={cn(
  35. 'text-foreground-muted transition-transform',
  36. isOpen ? 'rotate-90' : ''
  37. )}
  38. />
  39. }
  40. >
  41. View parameters
  42. </Button>
  43. </CollapsibleTrigger>
  44. <CollapsibleContent className="bg-dash-sidebar rounded-b border font-mono text-sm">
  45. <div className="px-4 py-2">
  46. {parameters.map((param) => (
  47. <div key={param.key} className="py-0.5 group/param">
  48. <div className="text-xs flex items-center">
  49. <span className="text-foreground-lighter">{param.key}: </span>
  50. <span className="ml-1 text-foreground">{param.value}</span>
  51. <button
  52. onClick={() => {
  53. copyToClipboard(param.value, () => {
  54. setCopiedMap((prev) => ({ ...prev, [param.key]: true }))
  55. setTimeout(() => {
  56. setCopiedMap((prev) => ({ ...prev, [param.key]: false }))
  57. }, 1000)
  58. })
  59. }}
  60. className={cn(
  61. 'text-foreground-lighter',
  62. 'ml-2 opacity-0 group-hover/param:opacity-100',
  63. 'hover:text-foreground rounded-xs p-1',
  64. copiedMap[param.key] && 'opacity-100',
  65. 'transition-all'
  66. )}
  67. >
  68. {copiedMap[param.key] ? (
  69. <Check size={12} strokeWidth={1.5} />
  70. ) : (
  71. <Copy size={12} strokeWidth={1.5} />
  72. )}
  73. </button>
  74. </div>
  75. </div>
  76. ))}
  77. </div>
  78. <Separator />
  79. <div className="text-foreground-muted text-xs px-4 py-1 font-sans">
  80. For security reasons, your database password is never shown.
  81. </div>
  82. </CollapsibleContent>
  83. </Collapsible>
  84. )
  85. }