mirror of
https://github.com/supabase/supabase.git
synced 2026-06-14 23:25:16 +08:00
## Context Enforce `noUnusedLocals` and `noUnusedParameters` in tsconfig.json + fix all related issues
100 lines
3.1 KiB
TypeScript
100 lines
3.1 KiB
TypeScript
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')
|
|
? 'Supabase 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>
|
|
)
|
|
}
|