import ExternalLink from '../ExternalLink'
import MediaPlayer from '../MediaPlayer'
import { useFetchWebMetadata } from '@/hooks/useFetchWebMetadata'
import {
fountainDisplayTitleFromOgTitle,
fountainEmbedMinHeight,
isFountainOpenUrl
} from '@/lib/fountain-url'
import { cleanUrl } from '@/lib/url'
import { cn } from '@/lib/utils'
import { useContentPolicyOptional } from '@/providers/ContentPolicyProvider'
import { Skeleton } from '@/components/ui/skeleton'
import { useLayoutEffect, useMemo, useState } from 'react'
import LazyMediaTapPlaceholder from '../MediaPlayer/LazyMediaTapPlaceholder'
import { ExternalLink as ExternalLinkIcon } from 'lucide-react'
function FountainCover({ url, className }: { url: string; className?: string }) {
return (
)
}
function FountainMeta({
displayTitle,
cleanedUrl,
compact = false
}: {
displayTitle?: string | null
cleanedUrl: string
compact?: boolean
}) {
return (
)
}
const cardShell = (className?: string) =>
cn(
'not-prose w-full max-w-[400px] overflow-hidden rounded-lg border border-border bg-muted/30 shadow-sm',
className
)
export default function FountainEmbeddedPlayer({
url,
className,
mustLoad = false
}: {
url: string
className?: string
mustLoad?: boolean
}) {
const contentPolicy = useContentPolicyOptional()
const autoLoadMedia = contentPolicy?.autoLoadMedia ?? true
const [userClickedLoad, setUserClickedLoad] = useState(false)
const cleanedUrl = useMemo(() => cleanUrl(url) || url, [url])
const minHeight = useMemo(() => fountainEmbedMinHeight(cleanedUrl), [cleanedUrl])
const minHeightClass = minHeight === 200 ? 'min-h-[120px]' : 'min-h-[88px]'
const showPlayer = mustLoad || autoLoadMedia || userClickedLoad
const { title, image, audio, ogLoading } = useFetchWebMetadata(cleanedUrl, {
fetchEnabled: showPlayer
})
const displayTitle = useMemo(() => fountainDisplayTitleFromOgTitle(title) ?? title, [title])
useLayoutEffect(() => {
if (!autoLoadMedia) setUserClickedLoad(false)
}, [autoLoadMedia])
if (!isFountainOpenUrl(cleanedUrl)) {
return
}
if (!showPlayer) {
return (
setUserClickedLoad(true)}
className={cn('w-full max-w-[400px]', minHeightClass, className)}
/>
)
}
if (ogLoading) {
return (
)
}
if (!audio) {
return (
{image ? : null}
)
}
return (
{image ? : null}
)
}