ConnectionParameters.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { Check, Copy } from 'lucide-react'
  2. import { useState } from 'react'
  3. import { cn, copyToClipboard } from 'ui'
  4. interface Parameter {
  5. key: string
  6. value: string
  7. }
  8. interface ConnectionParametersProps {
  9. parameters: Parameter[]
  10. onCopy?: (paramKey: string) => void
  11. }
  12. export const ConnectionParameters = ({ parameters, onCopy }: ConnectionParametersProps) => {
  13. const [copiedMap, setCopiedMap] = useState<Record<string, boolean>>({})
  14. return (
  15. <div className="bg-surface-75 rounded-lg border font-mono text-sm p-4">
  16. {parameters.map((param) => (
  17. <div key={param.key} className="py-0.5 group/param">
  18. <div className="text-xs flex items-center">
  19. <span className="text-foreground-lighter">{param.key}:</span>
  20. <span className="ml-1 text-foreground">{param.value}</span>
  21. <button
  22. onClick={() => {
  23. copyToClipboard(param.value, () => {
  24. setCopiedMap((prev) => ({ ...prev, [param.key]: true }))
  25. onCopy?.(param.key)
  26. setTimeout(() => {
  27. setCopiedMap((prev) => ({ ...prev, [param.key]: false }))
  28. }, 1000)
  29. })
  30. }}
  31. className={cn(
  32. 'text-foreground-lighter',
  33. 'ml-2 opacity-0 group-hover/param:opacity-100',
  34. 'hover:text-foreground rounded-xs p-1',
  35. copiedMap[param.key] && 'opacity-100',
  36. 'transition-all'
  37. )}
  38. >
  39. {copiedMap[param.key] ? (
  40. <Check size={12} strokeWidth={1.5} />
  41. ) : (
  42. <Copy size={12} strokeWidth={1.5} />
  43. )}
  44. </button>
  45. </div>
  46. </div>
  47. ))}
  48. </div>
  49. )
  50. }