{ "name": "file-upload-form-demo", "type": "registry:example", "dependencies": [ "lucide-react", "@hookform/resolvers/zod", "zod" ], "registryDependencies": [ "button", "file-upload", "form" ], "files": [ { "path": "examples/file-upload-form-demo.tsx", "type": "registry:example", "content": "\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { CloudUpload, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport * as z from \"zod\";\nimport { Button } from \"@/registry/bases/base/ui/button\";\nimport {\n FileUpload,\n FileUploadDropzone,\n FileUploadItem,\n FileUploadItemDelete,\n FileUploadItemMetadata,\n FileUploadItemPreview,\n FileUploadList,\n FileUploadTrigger,\n} from \"@/registry/bases/base/ui/file-upload\";\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"@/registry/bases/base/ui/form\";\n\nconst formSchema = z.object({\n files: z\n .array(z.custom())\n .min(1, \"Please select at least one file\")\n .max(2, \"Please select up to 2 files\")\n .refine((files) => files.every((file) => file.size <= 5 * 1024 * 1024), {\n message: \"File size must be less than 5MB\",\n path: [\"files\"],\n }),\n});\n\ntype FormValues = z.infer;\n\nexport default function FileUploadFormDemo() {\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n files: [],\n },\n });\n\n const onSubmit = React.useCallback((data: FormValues) => {\n toast(\"Submitted values:\", {\n description: (\n
\n          \n            {JSON.stringify(\n              data.files.map((file) =>\n                file.name.length > 25\n                  ? `${file.name.slice(0, 25)}...`\n                  : file.name,\n              ),\n              null,\n              2,\n            )}\n          \n        
\n ),\n });\n }, []);\n\n return (\n
\n \n (\n \n Attachments\n \n {\n form.setError(\"files\", {\n message,\n });\n }}\n multiple\n >\n \n \n Drag and drop or\n (\n \n choose files\n \n )}\n />\n to upload\n \n \n {field.value?.map((file, index) => (\n \n \n \n (\n \n \n Delete\n \n )}\n />\n \n ))}\n \n \n \n \n Upload up to 2 images up to 5MB each.\n \n \n \n )}\n />\n \n \n \n );\n}\n", "target": "" } ] }