File Upload with Status Sections
blocks/file-upload-06FreeBlock
A file upload with status sections block.
Install it
npx shadcn@latest add https://blocks.so/r/file-upload-06.jsonSource
1'use client';23import { CheckCircle, FileText, Loader2, Upload, X } from 'lucide-react';4import type React from 'react';5import { useRef, useState } from 'react';6import { Button } from '@/components/ui/button';7import { Card } from '@/components/ui/card';8import { Progress } from '@/components/ui/progress';9import { Separator } from '@/components/ui/separator';1011interface UploadItem {12 id: string;13 name: string;14 progress: number;15 status: 'uploading' | 'completed';16}1718export default function FileUpload06() {19 const [uploads, setUploads] = useState<UploadItem[]>([20 {21 id: 'a1',22 name: 'design-mock-landing.png',23 progress: 62,24 status: 'uploading',25 },26 {27 id: 'b2',28 name: 'team-headshot-2025-01-09.jpg',29 progress: 28,30 status: 'uploading',31 },32 {33 id: 'c3',34 name: 'logo-v3-final.gif',35 progress: 100,36 status: 'completed',37 },38 ]);39 const filePickerRef = useRef<HTMLInputElement>(null);4041 const openFilePicker = () => {42 filePickerRef.current?.click();43 };4445 const onFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {46 const selectedFiles = event.target.files;47 if (selectedFiles) {48 console.log('Files selected:', selectedFiles);49 }50 };5152 const onDragOver = (event: React.DragEvent) => {53 event.preventDefault();54 };5556 const onDropFiles = (event: React.DragEvent) => {57 event.preventDefault();58 const droppedFiles = event.dataTransfer.files;59 if (droppedFiles) {60 console.log('Files dropped:', droppedFiles);61 }62 };6364 const removeUploadById = (id: string) => {65 setUploads(uploads.filter((file) => file.id !== id));66 };6768 const activeUploads = uploads.filter((file) => file.status === 'uploading');69 const completedUploads = uploads.filter(70 (file) => file.status === 'completed'71 );7273 return (74 <div className="mx-auto flex w-full max-w-sm flex-col gap-y-6">75 <Card76 className="group flex max-h-[200px] w-full cursor-pointer flex-col items-center justify-center gap-4 border-dashed py-8 text-sm shadow-none transition-colors hover:bg-muted/50"77 onClick={openFilePicker}78 onDragOver={onDragOver}79 onDrop={onDropFiles}80 >81 <div className="grid space-y-3">82 <div className="flex items-center gap-x-2 text-muted-foreground">83 <Upload className="size-5" />84 <div>85 Drop files here or{' '}86 <Button87// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from blocks
All 76 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| AI Chat with Voice Inputai-01 | blocks | Blocks | Free | 1 dep | |
| AI Chat with Model Selectionai-02 | blocks | Blocks | Free | 1 dep | |
| AI Chat Compact Interfaceai-03 | blocks | Blocks | Free | 1 dep | |
| AI Chat with File Attachmentsai-04 | blocks | Blocks | Free | 1 dep | |
| AI Elements Chatai-05 | blocks | Blocks | Free | 2 deps | |
| Command Menu with Groupscommand-menu-01 | blocks | Blocks | Free | 1 dep | |
| Command Menu with Keyboard Shortcutscommand-menu-02 | blocks | Blocks | Free | 1 dep | |
| Command Menu with Documentation Searchcommand-menu-03 | blocks | Blocks | Free | 1 dep |
