Dropzone (File Upload)
supabase-ui-library/dropzone-react-routerUnverifiedComponent
Displays a control for easier uploading of files directly to Supabase Storage.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/aimultiple-benchmark/supabase-bench-cr-2/main/apps/ui-library/public/r/dropzone-react-router.jsonSource
1'use client'23import { CheckCircle, File, Loader2, Upload, X } from 'lucide-react'4import { createContext, useCallback, useContext, type PropsWithChildren } from 'react'56import { cn } from '@/lib/utils'7import { type UseSupabaseUploadReturn } from '@/registry/default/blocks/dropzone/hooks/use-supabase-upload'8import { Button } from '@/registry/default/components/ui/button'910export const formatBytes = (11 bytes: number,12 decimals = 2,13 size?: 'bytes' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB' | 'EB' | 'ZB' | 'YB'14) => {15 const k = 100016 const dm = decimals < 0 ? 0 : decimals17 const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']1819 if (bytes === 0 || bytes === undefined) return size !== undefined ? `0 ${size}` : '0 bytes'20 const i = size !== undefined ? sizes.indexOf(size) : Math.floor(Math.log(bytes) / Math.log(k))21 return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]22}2324type DropzoneContextType = Omit<UseSupabaseUploadReturn, 'getRootProps' | 'getInputProps'>2526const DropzoneContext = createContext<DropzoneContextType | undefined>(undefined)2728type DropzoneProps = UseSupabaseUploadReturn & {29 className?: string30}3132const Dropzone = ({33 className,34 children,35 getRootProps,36 getInputProps,37 ...restProps38}: PropsWithChildren<DropzoneProps>) => {39 const isSuccess = restProps.isSuccess40 const isActive = restProps.isDragActive41 const isInvalid =42 (restProps.isDragActive && restProps.isDragReject) ||43 (restProps.errors.length > 0 && !restProps.isSuccess) ||44 restProps.files.some((file) => file.errors.length !== 0)4546 return (47 <DropzoneContext.Provider value={{ ...restProps }}>48 <div49 {...getRootProps({50 className: cn(51 'border-2 border-gray-300 rounded-lg p-6 text-center bg-card transition-colors duration-300 text-foreground',52 className,53 isSuccess ? 'border-solid' : 'border-dashed',54 isActive && 'border-primary bg-primary/10',55 isInvalid && 'border-destructive bg-destructive/10'56 ),57 })}58 >59 <input {...getInputProps()} />60 {children}61 </div>62 </DropzoneContext.Provider>63 )64}65const DropzoneContent = ({ className }: { className?: string }) => {66 const {67 files,68 setFiles,69 onUpload,70 loading,71 successes,72 errors,73 maxFileSize,74 maxFiles,75 isSuccess,76 } = useDropzoneContext()7778 const exceedMaxFiles = files.length > maxFiles7980// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Supabase UI Library
All 37 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Current User Avatarcurrent-user-avatar-nextjs | Supabase UI Library | Components | Unverified | 2 deps · 6 files | |
| Current User Avatarcurrent-user-avatar-react | Supabase UI Library | Components | Unverified | 1 dep · 4 files | |
| Current User Avatarcurrent-user-avatar-react-router | Supabase UI Library | Components | Unverified | 2 deps · 5 files | |
| Current User Avatarcurrent-user-avatar-tanstack | Supabase UI Library | Components | Unverified | 2 deps · 5 files | |
| Dropzone (File Upload)dropzone-nextjs | Supabase UI Library | Components | Unverified | 4 deps · 5 files | |
| Dropzone (File Upload)dropzone-react | Supabase UI Library | Components | Unverified | 3 deps · 3 files | |
| Dropzone (File Upload)dropzone-tanstack | Supabase UI Library | Components | Unverified | 4 deps · 4 files | |
| Infinite Query for Vue and Supabaseinfinite-query-composable | Supabase UI Library | Components | Free | 2 deps |
