import { Upload, Link, X } from 'lucide-react'; import { Input } from '~/components/ui/input'; import { Label } from '~/components/ui/label'; export type InputMode = 'url' | 'file'; export interface FileOrUrlFieldProps { label: string; required?: boolean; mode: InputMode; onModeChange: (m: InputMode) => void; accept: string; file: File | null; onFileChange: (f: File | null) => void; inputRef: React.RefObject; url: string; onUrlChange: (u: string) => void; urlPlaceholder: string; existingFileName?: string; onClearExistingFile?: () => void; } export function FileOrUrlField({ label, required, mode, onModeChange, accept, file, onFileChange, inputRef, url, onUrlChange, urlPlaceholder, existingFileName, onClearExistingFile, }: FileOrUrlFieldProps) { return (
{/* Label + toggle */}
{mode === 'file' ? (
inputRef.current?.click()} className={`flex cursor-pointer items-center gap-3 rounded-xl border-2 border-dashed px-4 py-4 transition-all duration-200 ${ file || existingFileName ? 'border-orange-500/50 bg-[#161616]' : 'border-neutral-800 hover:border-neutral-700 bg-[#161616]/40 hover:bg-[#161616]/70' }`} > onFileChange(e.target.files?.[0] ?? null)} /> {file ? ( <>
{file.name} {(file.size / 1024 / 1024).toFixed(2)} MB
) : existingFileName ? ( <>
{existingFileName} Existing File (Keep)
) : (
Choose a file ({accept})
)}
) : ( onUrlChange(e.target.value)} /> )}
); }