Multi Image Uploader Block
edgestore/multi-image-uploader-blockFreeBlock
A block for uploading multiple images with preview grid and progress indicators.
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/multi-image-uploader-block.jsonSource
1import { ImageUploader } from '@/components/upload/multi-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 MultiImageUploaderBlock() {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 <ImageUploader30 maxFiles={6}31 maxSize={1024 * 1024 * 2} // 2MB32 />33 <CompletedImages />34 </UploaderProvider>35 </div>36 </div>37 );38}3940function CompletedImages() {41 const { fileStates } = useUploader();4243 const completedFiles = fileStates.filter(44 (fs): fs is CompletedFileState => fs.status === 'COMPLETE',45 );4647 if (completedFiles.length === 0) {48 return null;49 }5051 return (52 <div className="mt-8 w-full">53 <h3 className="mb-2 text-lg font-semibold">Uploaded Files</h3>54 <div className="rounded-md bg-gray-50 p-4 dark:bg-gray-900">55 {completedFiles.map((res) => (56 <a57 key={res.url}58 className="mb-1 block underline"59 href={res.url}60 target="_blank"61 rel="noopener noreferrer"62 >63 {res.file.name}64 </a>65 ))}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 progress = Math.min(progress + increment, 100);91// … 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 | |
| Progress Bar Blockprogress-bar-block | EdgeStore | Blocks | Free | no deps | |
| Progress Circle Blockprogress-circle-block | EdgeStore | Blocks | Free | no deps | |
| Single Image Dropzone Blocksingle-image-dropzone-block | EdgeStore | Blocks | Free | no deps |
