"use client" import { useEffect, useState } from "react" import type { AssetResponse } from "@/lib/types" import { Badge } from "@/components/ui/badge" import { Skeleton } from "@/components/ui/skeleton" import { Checkbox } from "@/components/ui/checkbox" import { getTokens } from "@/lib/auth" import { ImageIcon } from "lucide-react" interface PhotoCardProps { asset: AssetResponse selected?: boolean selectable?: boolean onClick?: () => void onSelect?: (selected: boolean) => void } export function PhotoCard({ asset, selected, selectable, onClick, onSelect, }: PhotoCardProps) { const [src, setSrc] = useState(null) const [failed, setFailed] = useState(false) useEffect(() => { let revoke: string | null = null setFailed(false) const { access } = getTokens() const headers: HeadersInit = access ? { Authorization: `Bearer ${access}` } : {} fetch(`/api/v1/assets/${asset.id}/derivatives/thumbnail_square`, { headers, }) .then((r) => (r.ok ? r.blob() : Promise.reject())) .then((blob) => { revoke = URL.createObjectURL(blob) setSrc(revoke) }) .catch(() => setFailed(true)) return () => { if (revoke) URL.revokeObjectURL(revoke) } }, [asset.id]) return (
onSelect?.(!selected) : onClick} > {src ? ( ) : failed ? (
) : ( )}
{selectable && (
onSelect?.(c === true)} onClick={(e) => e.stopPropagation()} className="border-white bg-black/30" />
)}
{asset.asset_type}
) }