Single Image Dropzone Block
edgestore/single-image-dropzone-blockFreeBlock
A block for uploading a single image with preview and progress indicator.
Live preview
live · rendered by the registry
Rendered by EdgeStore on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://edgestore.dev/r/single-image-dropzone-block.jsonSource
1import { SingleImageDropzone } from '@/components/upload/single-image';2import {3 UploaderProvider,4 useUploader,5 type CompletedFileState,6 type UploadFn,7} from '@/components/upload/uploader-provider';8import * as React from 'react';910export default function SingleImageUploaderBlock() {11 const { edgestore } = useMockEdgeStore();1213 const uploadFn: UploadFn = React.useCallback(14 async ({ file, signal, onProgressChange }) => {15 const res = await edgestore.myPublicImages.upload({16 file,17 signal,18 onProgressChange,19 });20 return { url: res.url };21 },22 [edgestore],23 );2425 return (26 <div className="flex flex-col items-center gap-4 p-4">27 <div className="w-full max-w-md">28 <UploaderProvider uploadFn={uploadFn} autoUpload>29 <SingleImageDropzone30 width={320}31 height={320}32 dropzoneOptions={{ maxSize: 1024 * 1024 * 2 }} // 2MB33 />34 <CompletedImage />35 </UploaderProvider>36 </div>37 </div>38 );39}4041function CompletedImage() {42 const { fileStates } = useUploader();4344 const completedFile = fileStates.find(45 (fs): fs is CompletedFileState => fs.status === 'COMPLETE',46 );4748 if (!completedFile) {49 return null;50 }5152 return (53 <div className="mt-8 w-full">54 <h3 className="mb-2 text-lg font-semibold">Uploaded Image</h3>55 <div className="rounded-md bg-gray-50 p-4 dark:bg-gray-900">56 <div className="flex flex-col items-center">57 <a58 href={completedFile.url}59 target="_blank"60 rel="noopener noreferrer"61 className="underline"62 >63 {completedFile.file.name}64 </a>65 </div>66 </div>67 </div>68 );69}7071// Mock implementation of EdgeStore72function useMockEdgeStore() {73 return {74 edgestore: {75 myPublicImages: {76 upload: async ({77 file,78 onProgressChange,79 }: {80 file: File;81 signal?: AbortSignal;82 onProgressChange?: (progress: number) => void | Promise<void>;83 }) => {84 // Simulate upload progress with a Promise that completes only after reaching 100%85 await new Promise<void>((resolve) => {86 if (onProgressChange) {87 let progress = 0;88 const interval = setInterval(() => {89 const increment = Math.floor(Math.random() * 41) + 10;90// … truncated
What it pulls in
Other registry items
Files it writes
More from EdgeStore
All 12 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Dropzonedropzone | EdgeStore | Blocks | Free | 2 deps | |
| File Uploaderfile-uploader | EdgeStore | Blocks | Free | 2 deps | |
| File Uploader Blockfile-uploader-block | EdgeStore | Blocks | Free | no deps | |
| Image Uploaderimage-uploader | EdgeStore | Blocks | Free | 2 deps | |
| Multi Image Uploader Blockmulti-image-uploader-block | EdgeStore | Blocks | Free | no deps | |
| Progress Bar Blockprogress-bar-block | EdgeStore | Blocks | Free | no deps | |
| Progress Circle Blockprogress-circle-block | EdgeStore | Blocks | Free | no deps |
