import { useId, type ChangeEvent, type ReactNode } from "react"; import { Icon } from "./Icon.js"; export type MediaSource = "file" | "url"; export type MediaPreviewKind = "image" | "gif" | "video"; export interface MediaSourceFieldProps { label: string; kindLabel?: string; source: MediaSource; url: string; fileName?: string | null; uploading?: boolean; previewSrc?: string | null; previewKind?: MediaPreviewKind | null; accept?: string; fileButtonLabel?: string; emptyFileLabel?: string; path?: ReactNode; hint?: ReactNode; error?: ReactNode; onSourceChange: (source: MediaSource) => void; onUrlChange: (url: string) => void; onFileChange: (file?: File) => void | Promise; } function inferredPreviewKind(src: string): MediaPreviewKind { if (/\.(mp4|webm|mov|m4v|avi|mkv)(\?.*)?$/i.test(src)) return "video"; if (/\.gif(\?.*)?$/i.test(src)) return "gif"; return "image"; } function MediaPreview({ src, kind }: { src: string; kind?: MediaPreviewKind | null }) { const resolvedKind = kind ?? inferredPreviewKind(src); if (resolvedKind === "video") return