"use client" import { useState } from "react" import Link from "next/link" import { RiCheckboxCircleFill } from "react-icons/ri" import { cn } from "@/lib/utils/cn" import { CollectionInfo } from "@/types/general" import { formatDuration } from "@/lib/formatters/formatDuration" import { formatTimeAgo } from "@/lib/formatters/formatTimeAgo" import { isCertifiedUser } from "@/app/certification" import { transparentImage } from "@/lib/utils/transparentImage" import { DefaultAvatar } from "../default-avatar" import { formatLargeNumber } from "@/lib/formatters/formatLargeNumber" export function CollectionCard({ collection, className = "", layout = "normal", onSelect, index }: { collection: CollectionInfo className?: string layout?: "normal" | "compact" onSelect?: (collection: CollectionInfo) => void index: number }) { const [duration, setDuration] = useState(0) const [channelThumbnail, setChannelThumbnail] = useState(collection.channel.thumbnail) const [collectionThumbnail, setCollectionThumbnail] = useState( `https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/resolve/main/collections/${collection.id}.webp` ) const [collectionThumbnailReady, setCollectionThumbnailReady] = useState(false) const isCompact = layout === "compact" const handleClick = () => { onSelect?.(collection) } const handleBadChannelThumbnail = () => { try { if (channelThumbnail) { setChannelThumbnail("") } } catch (err) { } } return (
{/* VIDEO BLOCK */}
{ setCollectionThumbnailReady(true) }} onError={() => { setCollectionThumbnail(transparentImage) setCollectionThumbnailReady(false) }} />
0 ? 'opacity-100' : 'opacity-0' )} >{formatDuration(duration)}
{/* TEXT BLOCK */}
{ isCompact ? null : channelThumbnail ?
: }

{collection.label}

{collection.channel.label}
{isCertifiedUser(collection.channel.datasetUser) ?
: null}
{formatLargeNumber(collection.numberOfViews)} views
ยท
{formatTimeAgo(collection.updatedAt)}
) }