import { useId, useMemo, type ChangeEvent } from "react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { FileUp, FileText, Image as ImageIcon, X } from "lucide-react"; type DocumentUploadFieldProps = { label: string; value?: string | null; onChange?: (value: string | null) => void; required?: boolean; helperText?: string; accept?: string; className?: string; }; function readFileAsDataUrl(file: File) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(String(reader.result ?? "")); reader.onerror = () => reject(reader.error ?? new Error("Gagal membaca file")); reader.readAsDataURL(file); }); } function getPreviewKind(value?: string | null) { if (!value) return "none"; if (value.startsWith("data:application/pdf")) return "pdf"; if (value.startsWith("data:image/")) return "image"; return "file"; } export function DocumentUploadField({ label, value, onChange, required = false, helperText, accept = "image/*,application/pdf", className = "", }: DocumentUploadFieldProps) { const inputId = useId(); const previewKind = useMemo(() => getPreviewKind(value), [value]); const handleSelectFile = async (event: ChangeEvent) => { const file = event.target.files?.[0]; event.target.value = ""; if (!file || !onChange) return; const dataUrl = await readFileAsDataUrl(file); onChange(dataUrl); }; const canEdit = Boolean(onChange); return (
{canEdit && value ? ( ) : null}
{helperText ?

{helperText}

: null}