| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import { useParams } from 'common'
- import { PropsWithChildren } from 'react'
- import { cn } from 'ui'
- import { useAvailableIntegrations } from '../../Landing/useAvailableIntegrations'
- import { FilesViewer } from './FilesViewer'
- import { MarkdownContent } from './MarkdownContent'
- import { InlineLinkClassName } from '@/components/ui/InlineLink'
- const getSiteUrlLabel = (url: string | undefined | null) => {
- if (!url) return undefined
- try {
- return new URL(url).origin
- } catch (error) {
- return undefined
- }
- }
- const isGithubHost = (url: string | undefined | null) => {
- if (!url) return false
- try {
- const hostname = new URL(url).hostname.toLowerCase()
- return hostname === 'github.com' || hostname.endsWith('.github.com')
- } catch (error) {
- return false
- }
- }
- /**
- * [Joshen] This will serve as the overview tab for remotely fetched integrations
- */
- export const IntegrationOverviewTabV2 = ({ children }: PropsWithChildren) => {
- const { id } = useParams()
- const { data: allIntegrations } = useAvailableIntegrations()
- const integration = allIntegrations.find((i) => i.id === id)
- if (!integration) {
- return <div>Unsupported integration type</div>
- }
- const { type, content, docsUrl, siteUrl, files = [] } = integration
- const docsUrlLabel = docsUrl?.includes('supabase.com/docs')
- ? 'Briven Docs'
- : isGithubHost(docsUrl)
- ? 'GitHub Docs'
- : 'Documentation'
- const siteUrlLabel = getSiteUrlLabel(siteUrl)
- return (
- <div className="grid grid-cols-3 gap-x-8 px-10 py-8">
- <div className="col-span-2 flex flex-col gap-y-8">
- {files.length > 0 && <FilesViewer files={files} />}
- <MarkdownContent integrationId={id} content={content} />
- {children}
- </div>
- <div className="text-sm col-span-1 flex flex-col gap-y-8">
- <div className="flex flex-col gap-y-4">
- <p>Details</p>
- <div className="flex flex-col gap-y-1">
- <p className="font-mono uppercase text-foreground-light">Type</p>
- <p className="capitalize">{type === 'oauth' ? 'OAuth' : type.replaceAll('_', ' ')}</p>
- </div>
- <div className="flex flex-col gap-y-1">
- <p className="font-mono uppercase text-foreground-light">Built by</p>
- <p className={cn(!integration.author.name && 'text-foreground-lighter')}>
- {integration.author.name || 'Unknown Author'}
- </p>
- </div>
- {docsUrl && (
- <div className="flex flex-col gap-y-1">
- <p className="font-mono uppercase text-foreground-light">Docs</p>
- <a target="_blank" rel="noreferrer" href={docsUrl} className={InlineLinkClassName}>
- {docsUrlLabel}
- </a>
- </div>
- )}
- {siteUrl && (
- <div className="flex flex-col gap-y-1">
- <p className="font-mono uppercase text-foreground-light">Website</p>
- <a target="_blank" rel="noreferrer" href={siteUrl} className={InlineLinkClassName}>
- {siteUrlLabel}
- </a>
- </div>
- )}
- </div>
- {/* Subsequent other actions here */}
- </div>
- </div>
- )
- }
|