MarketplaceCard.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useParams } from 'common'
  2. import Link from 'next/link'
  3. import { Badge, Card } from 'ui'
  4. import { IntegrationLogo } from '../Integration/IntegrationLogo'
  5. import { getMarketplaceSource, MarketplaceSourceBadge } from './Marketplace.constants'
  6. import type { IntegrationDefinition } from '@/components/interfaces/Integrations/Landing/Integrations.constants'
  7. interface MarketplaceCardProps {
  8. integration: IntegrationDefinition
  9. isInstalled: boolean
  10. }
  11. export const MarketplaceCard = ({ integration, isInstalled }: MarketplaceCardProps) => {
  12. const { ref } = useParams()
  13. const source = getMarketplaceSource(integration)
  14. return (
  15. <Link
  16. href={`/project/${ref}/integrations/${integration.id}/overview`}
  17. className="rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground-lighter focus-visible:ring-offset-1 focus-visible:ring-offset-background"
  18. >
  19. <Card className="flex min-h-[168px] h-full flex-col gap-2.5 hover:border-stronger p-4">
  20. <div className="flex items-start justify-between">
  21. <IntegrationLogo integration={integration} size="h-9 w-9" />
  22. {isInstalled && <Badge variant="success">Installed</Badge>}
  23. </div>
  24. <div>
  25. <div className="mb-1 text-sm font-medium">{integration.name}</div>
  26. {integration.description && (
  27. <p className="line-clamp-2 text-xs leading-snug text-foreground-light">
  28. {integration.description}
  29. </p>
  30. )}
  31. </div>
  32. <div className="flex-1" />
  33. <div className="flex items-center justify-between gap-2 pt-2.5">
  34. <div className="flex flex-wrap items-center gap-1">
  35. <MarketplaceSourceBadge source={source} />
  36. {integration.status && (
  37. <Badge variant="warning" className="capitalize">
  38. {integration.status}
  39. </Badge>
  40. )}
  41. </div>
  42. <div className="text-xs flex items-center gap-1 text-foreground-lighter">
  43. <span>Built by</span>
  44. <span>{integration.author?.name}</span>
  45. </div>
  46. </div>
  47. </Card>
  48. </Link>
  49. )
  50. }