{ "name": "file-upload-uploadthing-demo", "type": "registry:example", "dependencies": [ "lucide-react", "uploadthing", "@uploadthing/react" ], "registryDependencies": [ "button", "file-upload" ], "files": [ { "path": "examples/file-upload-uploadthing-demo.tsx", "type": "registry:example", "content": "\"use client\";\n\nimport { Upload, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { UploadThingError } from \"uploadthing/server\";\nimport { uploadFiles } from \"@/lib/uploadthing\";\nimport { Button } from \"@/registry/bases/base/ui/button\";\nimport {\n FileUpload,\n FileUploadDropzone,\n FileUploadItem,\n FileUploadItemDelete,\n FileUploadItemMetadata,\n FileUploadItemPreview,\n FileUploadItemProgress,\n FileUploadList,\n type FileUploadProps,\n FileUploadTrigger,\n} from \"@/registry/bases/base/ui/file-upload\";\n\nexport default function FileUploadUploadThingDemo() {\n const [isUploading, setIsUploading] = React.useState(false);\n const [files, setFiles] = React.useState([]);\n\n const onUpload: NonNullable = React.useCallback(\n async (files, { onProgress }) => {\n try {\n setIsUploading(true);\n const res = await uploadFiles(\"imageUploader\", {\n files,\n onUploadProgress: ({ file, progress }) => {\n onProgress(file, progress);\n },\n });\n\n toast.success(\"Uploaded files:\", {\n description: (\n
\n              \n                {JSON.stringify(\n                  res.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 } catch (error) {\n setIsUploading(false);\n\n if (error instanceof UploadThingError) {\n const errorMessage =\n error.data && \"error\" in error.data\n ? error.data.error\n : \"Upload failed\";\n toast.error(errorMessage);\n return;\n }\n\n toast.error(\n error instanceof Error ? error.message : \"An unknown error occurred\",\n );\n } finally {\n setIsUploading(false);\n }\n },\n [],\n );\n\n const onFileReject = React.useCallback((file: File, message: string) => {\n toast(message, {\n description: `\"${file.name.length > 20 ? `${file.name.slice(0, 20)}...` : file.name}\" has been rejected`,\n });\n }, []);\n\n return (\n setFiles(files)}\n onUpload={onUpload}\n onFileReject={onFileReject}\n multiple\n disabled={isUploading}\n >\n \n
\n
\n \n
\n

Drag & drop images here

\n

\n Or click to browse (max 2 files, up to 4MB each)\n

\n
\n (\n \n Browse files\n \n )}\n />\n
\n \n {files.map((file, index) => (\n \n
\n \n \n (\n \n \n \n )}\n />\n
\n \n
\n ))}\n
\n \n );\n}\n", "target": "" } ] }