PartnerManagedResource.tsx99 lines · main
1import { ExternalLink } from 'lucide-react'
2import type { ReactNode } from 'react'
3import { Alert, AlertTitle, Button } from 'ui'
4
5import PartnerIcon from './PartnerIcon'
6import { useAwsRedirectQuery } from '@/data/integrations/aws-redirect-query'
7import { useVercelRedirectQuery } from '@/data/integrations/vercel-redirect-query'
8import { MANAGED_BY, ManagedBy } from '@/lib/constants/infrastructure'
9
10interface PartnerManagedResourceProps {
11 managedBy: ManagedBy
12 resource: string
13 title?: string
14 details?: ReactNode
15 cta?: {
16 installationId?: string
17 organizationSlug?: string
18 overrideUrl?: string
19 path?: string
20 message?: string
21 }
22}
23
24export const PARTNER_TO_NAME = {
25 [MANAGED_BY.VERCEL_MARKETPLACE]: 'Vercel Marketplace',
26 [MANAGED_BY.AWS_MARKETPLACE]: 'AWS Marketplace',
27 [MANAGED_BY.STRIPE_PROJECTS]: 'Stripe Projects',
28 [MANAGED_BY.BRIVEN]: 'Briven',
29} as const
30
31function PartnerManagedResource({
32 managedBy,
33 resource,
34 title,
35 details,
36 cta,
37}: PartnerManagedResourceProps) {
38 const ctaEnabled = cta !== undefined
39 const supportsRedirectCta =
40 managedBy === MANAGED_BY.VERCEL_MARKETPLACE || managedBy === MANAGED_BY.AWS_MARKETPLACE
41
42 // Use appropriate redirect query based on partner
43 const vercelQuery = useVercelRedirectQuery(
44 {
45 installationId: cta?.installationId,
46 },
47 {
48 enabled: ctaEnabled && supportsRedirectCta && managedBy === MANAGED_BY.VERCEL_MARKETPLACE,
49 }
50 )
51
52 const awsQuery = useAwsRedirectQuery(
53 {
54 organizationSlug: cta?.organizationSlug,
55 },
56 {
57 enabled: ctaEnabled && supportsRedirectCta && managedBy === MANAGED_BY.AWS_MARKETPLACE,
58 }
59 )
60
61 if (managedBy === MANAGED_BY.BRIVEN) return null
62
63 const selectedRedirectQuery =
64 managedBy === MANAGED_BY.VERCEL_MARKETPLACE
65 ? vercelQuery
66 : managedBy === MANAGED_BY.AWS_MARKETPLACE
67 ? awsQuery
68 : undefined
69
70 const redirectBaseUrl = selectedRedirectQuery?.data?.url
71 const ctaUrl =
72 cta?.overrideUrl ?? (redirectBaseUrl ? `${redirectBaseUrl}${cta?.path ?? ''}` : undefined)
73 const showCta = ctaEnabled && Boolean(ctaUrl)
74 const partnerHeading =
75 title ??
76 (managedBy === MANAGED_BY.STRIPE_PROJECTS
77 ? `${resource} are connected to Stripe`
78 : `${resource} are managed by ${PARTNER_TO_NAME[managedBy]}`)
79
80 return (
81 <Alert className="flex flex-col items-center gap-y-2 border-0 rounded-none bg-none">
82 <PartnerIcon organization={{ managed_by: managedBy }} showTooltip={false} size="large" />
83
84 <AlertTitle className="text-sm font-normal">{partnerHeading}</AlertTitle>
85
86 {details && <div className="text-sm text-foreground-light text-center">{details}</div>}
87
88 {showCta && (
89 <Button asChild type="default" iconRight={<ExternalLink />}>
90 <a href={ctaUrl} target="_blank" rel="noopener noreferrer">
91 {cta?.message || `View ${resource} on ${PARTNER_TO_NAME[managedBy]}`}
92 </a>
93 </Button>
94 )}
95 </Alert>
96 )
97}
98
99export default PartnerManagedResource