{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "single-image-upload-form-demo", "dependencies": [ "react-hook-form", "@hookform/resolvers/zod", "zod" ], "registryDependencies": [ "https://reusables.vercel.app/r/single-image-upload", "https://reusables.vercel.app/r/notify", "button", "input", "textarea", "form", "card" ], "files": [ { "path": "registry/example/single-image-upload-form-demo.tsx", "content": "\"use client\"\n\nimport { toast } from \"@/packages/notify/src\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useForm } from \"react-hook-form\"\nimport { z } from \"zod\"\n\nimport { useFileUpload } from \"@/hooks/use-file-upload\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"@/components/ui/form\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\nimport { SingleImageDropzone } from \"@/components/single-image-upload\"\n\ntype FormValues = z.infer\n\nconst formSchema = z.object({\n image: z.string().min(1, \"Image is required\"),\n name: z.string().min(2).max(50),\n price: z.string().regex(/^\\d+(\\.\\d{1,2})?$/, \"Must be a valid price\"),\n description: z.string(),\n})\n\nexport default function SingleImageUploadFormDemo() {\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n name: \"\",\n price: \"\",\n description: \"\",\n image: \"\",\n },\n })\n\n const fileUpload = useFileUpload({\n onSuccess: (url: string) => {\n form.setValue(\"image\", url, { shouldValidate: true })\n toast.success(\"Image uploaded successfully\")\n },\n onError: (error) => toast.error(error),\n })\n\n async function onSubmit() {\n toast.promise(() => new Promise((resolve) => setTimeout(resolve, 2000)), {\n loading: \"Creating product...\",\n success: () => \"Product created successfully!\",\n error: \"Failed to create product\",\n })\n\n form.reset({\n name: \"\",\n price: \"\",\n description: \"\",\n image: \"\",\n })\n }\n\n return (\n \n \n Add New Product\n \n \n
\n \n
\n (\n \n Name\n \n \n \n \n \n )}\n />\n (\n \n Price\n \n \n \n \n \n )}\n />\n
\n (\n \n Description\n \n \n \n \n \n )}\n />\n (\n \n Product Image\n \n {\n if (file) {\n await fileUpload.handleFileUpload(file)\n } else {\n form.setValue(\"image\", \"\", { shouldValidate: true })\n }\n }}\n />\n \n \n Upload a product image (PNG, JPG, WEBP)\n \n \n \n )}\n />\n \n \n \n
\n
\n )\n}\n", "type": "registry:example", "target": "components/single-image-upload-form-demo.tsx" } ], "type": "registry:example" }