Editor Upload
deso-ui/editor-uploadFreeBlock
A component for handling file uploads within the editor.
Install it
npx shadcn@latest add https://ui.deso.com/r/editor-upload.jsonSource
1'use client';23import React, { useState, useCallback } from 'react';4import { useDropzone } from 'react-dropzone';5import { UploadCloud } from 'lucide-react';6import {7 DndContext,8 closestCenter,9 KeyboardSensor,10 PointerSensor,11 useSensor,12 useSensors,13 DragEndEvent,14} from '@dnd-kit/core';15import {16 arrayMove,17 SortableContext,18 sortableKeyboardCoordinates,19 rectSortingStrategy,20 useSortable,21} from '@dnd-kit/sortable';22import { CSS } from '@dnd-kit/utilities';23import { Button } from '../ui/button';24import { X, File, Music, Video } from 'lucide-react';25import { cn } from '@/lib/utils/deso';2627export interface UploadedFile {28 id: string;29 file: File;30 preview: string;31 progress?: number;32}3334export type UploadType = 'image' | 'video' | 'audio';3536interface EditorUploadProps {37 files: UploadedFile[];38 onFilesChange: (files: UploadedFile[]) => void;39 onFileUpload: (files: File[]) => void;40 uploadType: UploadType;41 className?: string;42 mainText?: string;43 subText?: string;44}454647interface UploadAreaProps {48 onFileUpload: (files: File[]) => void;49 accept?: Record<string, string[]>;50 multiple?: boolean;51 className?: string;52 mainText?: string;53 subText?: string;54}5556export function UploadArea({57 onFileUpload,58 accept,59 multiple = true,60 className,61 mainText,62 subText,63}: UploadAreaProps) {64 const [isDragging, setIsDragging] = useState(false);6566 const onDrop = useCallback(67 (acceptedFiles: File[]) => {68 onFileUpload(acceptedFiles);69 setIsDragging(false);70 },71 [onFileUpload]72 );7374 const { getRootProps, getInputProps, isDragActive } = useDropzone({75 onDrop,76 accept,77 multiple,78 onDragOver: () => setIsDragging(true),79 onDragEnter: () => setIsDragging(true),80 onDragLeave: () => setIsDragging(false),81 });8283 return (84 <div85 {...getRootProps()}86 className={cn(87 'border-2 border-dashed border-muted-foreground/30 rounded-lg p-8 text-center cursor-pointer transition-colors',88 isDragActive || isDragging ? 'border-primary bg-primary/10' : 'hover:border-muted-foreground/50 hover:bg-muted/50',89 className90 )}91 >92 <input type="file" {...getInputProps()} />93 <div className="flex flex-col items-center gap-2 text-muted-foreground">94 <UploadCloud className="w-10 h-10" />95 <p className="font-semibold text-foreground">{mainText}</p>96 <p className="text-xs text-muted-foreground">97 {subText}98 </p>99 </div>100 </div>101// … truncated
Files it writes
More from deso-ui
All 47 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Action Menuaction-menu | deso-ui | Blocks | Free | no deps | |
| Confirmation Dialogconfirmation-dialog | deso-ui | Blocks | Free | no deps | |
| Copy Buttoncopy-button | deso-ui | Blocks | Free | no deps | |
| Editoreditor | deso-ui | Blocks | Free | no deps | |
| Editor Emoji Pickereditor-emoji-picker | deso-ui | Blocks | Free | no deps | |
| Editor Markdowneditor-markdown | deso-ui | Blocks | Free | no deps | |
| Feed Listfeed-list | deso-ui | Blocks | Free | no deps | |
| Follow Buttonfollow-button | deso-ui | Blocks | Free | no deps |
