'use client' import * as React from 'react' import type { AdminMedia } from '@admin/types' import { MediaGalleryDialog } from '@admin/components/shared/media/media-gallery-dialog' import { MediaPreview } from '@admin/components/shared/media/media-preview' import { Button } from '@admin/components/ui/button' import { Card, CardContent, CardFooter } from '@admin/components/ui/card' import { useCopyToClipboard } from '@admin/hooks/use-copy-to-clipboard' import { useMediaById } from '@admin/hooks/use-media' import { createAdminMediaFromUrl } from '@admin/utils/media/create-admin-media-from-url' import { cn } from '@admin/utils/shared/cn' import { Check, Copy, Link2 } from 'lucide-react' import Link from 'next/link' import { MediaFieldEmptyState } from './media-field-empty-state' type MediaFieldValueMode = 'id' | 'url' type MediaFieldFooterMode = 'url' | 'filename' | 'none' interface MediaFieldProps { value?: string onChange: (value: string) => void onBlur?: () => void onRemove?: () => void media?: AdminMedia | null accept?: string disabled?: boolean className?: string isRemovable?: boolean valueMode?: MediaFieldValueMode footerMode?: MediaFieldFooterMode } export function MediaField({ value, onChange, onBlur, onRemove, media: mediaOverride, accept, disabled, className, isRemovable = false, valueMode = 'id', footerMode = 'url' }: MediaFieldProps) { const [open, setOpen] = React.useState(false) const { data: media } = useMediaById( valueMode === 'id' && mediaOverride === undefined ? value : undefined ) const [copyMediaUrl, hasCopiedMediaUrl] = useCopyToClipboard() const selectedMedia = mediaOverride ?? media ?? (valueMode === 'url' && value ? createAdminMediaFromUrl(value, accept) : null) function handleSelect(selected: AdminMedia | AdminMedia[]) { const item = Array.isArray(selected) ? selected[0] : selected if (item) { onChange(valueMode === 'url' ? item.url : item.id) } } function handleRemove(e: React.MouseEvent) { e.preventDefault() e.stopPropagation() if (isRemovable && onRemove) { onRemove() return } onChange('') onBlur?.() } function handleChangeImage(e: React.MouseEvent) { e.preventDefault() e.stopPropagation() setOpen(true) } if (selectedMedia?.url) { return (