file upload hook
formcn/use-file-uploadFreeHook
state management hook for file upload component
Install it
npx shadcn@latest add https://formcn.dev/r/use-file-upload.jsonSource
1/** biome-ignore-all lint/correctness/useExhaustiveDependencies: <explanation> */2import type React from 'react'34import {5 type ChangeEvent,6 type DragEvent,7 type InputHTMLAttributes,8 useCallback,9 useRef,10 useState,11} from 'react'1213export type FileMetadata = {14 name: string15 size: number16 type: string17 url: string18 id: string19}2021export type FileWithPreview = {22 file: File | FileMetadata23 id: string24 preview?: string25}2627export type FileUploadOptions = {28 maxFiles?: number // Only used when multiple is true, defaults to Infinity29 maxSize?: number // in bytes30 accept?: string31 multiple?: boolean // Defaults to false32 initialFiles?: FileMetadata[]33 onFilesChange?: (files: FileWithPreview[]) => void // Callback when files change34 onFilesAdded?: (addedFiles: FileWithPreview[]) => void // Callback when new files are added35}3637export type FileUploadState = {38 files: FileWithPreview[]39 isDragging: boolean40 errors: string[]41}4243export type FileUploadActions = {44 addFiles: (files: FileList | File[]) => void45 removeFile: (id: string) => void46 clearFiles: () => void47 clearErrors: () => void48 handleDragEnter: (e: DragEvent<HTMLElement>) => void49 handleDragLeave: (e: DragEvent<HTMLElement>) => void50 handleDragOver: (e: DragEvent<HTMLElement>) => void51 handleDrop: (e: DragEvent<HTMLElement>) => void52 handleFileChange: (e: ChangeEvent<HTMLInputElement>) => void53 openFileDialog: () => void54 getInputProps: (55 props?: InputHTMLAttributes<HTMLInputElement>,56 ) => InputHTMLAttributes<HTMLInputElement> & {57 ref: React.Ref<HTMLInputElement>58 }59}6061export const useFileUpload = (62 options: FileUploadOptions = {},63): [FileUploadState, FileUploadActions] => {64 const {65 maxFiles = Infinity,66 maxSize = Infinity,67 accept = '*',68 multiple = false,69 initialFiles = [],70 onFilesChange,71 onFilesAdded,72 } = options7374 const [state, setState] = useState<FileUploadState>({75 files: initialFiles.map((file) => ({76 file,77 id: file.id,78 preview: file.url,79 })),80 isDragging: false,81 errors: [],82 })8384 const inputRef = useRef<HTMLInputElement>(null)8586 const createPreview = useCallback(87 (file: File | FileMetadata): string | undefined => {88 if (file instanceof File) {89 return URL.createObjectURL(file)90 }91 return file.url92 },93 [],94 )9596 const generateUniqueId = useCallback((file: File | FileMetadata): string => {97 if (file instanceof File) {98 return `${file.name}-${crypto.randomUUID()}`99 }100 return file.id101 }, [])102103 const clearFiles = useCallback(() => {104// … truncated
Files it writes
More from formcn
All 9 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Multi-step viewer hookuse-multi-step-viewer | formcn | Hooks | Free | no deps |
