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 (
{displayTitle ? (

{displayTitle}

) : (

fountain.fm

)} e.stopPropagation()} > Open on Fountain
) } 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}
) }