Comenzando con Dropup
Dropup es una biblioteca React ligera y sin interfaz para carga de archivos que te da control total sobre tu interfaz mientras maneja toda la lógica compleja de carga.
¿Por qué Dropup?
- 🪶 Ligero - El núcleo es solo ~10KB comprimido
- 🎨 Sin interfaz - Control total sobre tu UI con API basada en hooks
- 📁 Arrastrar y soltar - Soporte integrado para arrastrar y soltar
- 📊 Seguimiento de progreso - Progreso de carga en tiempo real para cada archivo
- 🔄 Cargas fragmentadas - Divide archivos grandes para cargas confiables
- ☁️ Listo para la nube - Helpers preconfigurados para S3, GCS y Azure
- 🖼️ Procesamiento de imágenes - Compresión y generación de vistas previas integradas
- 📱 Multiplataforma - Funciona con React DOM y React Native
- 🔒 TypeScript - Soporte completo de TypeScript
Instalación
Instala Dropup usando tu gestor de paquetes preferido:
npm install @samithahansaka/dropup
Dependencias de pares
Dropup requiere React 16.8 o superior (para soporte de hooks):
npm install react
Inicio rápido
Aquí hay un ejemplo simple para comenzar:
import { useDropup } from '@samithahansaka/dropup';
function FileUploader() {
const {
files,
state,
actions,
getDropProps,
getInputProps
} = useDropup({
accept: 'image/*',
maxSize: 10 * 1024 * 1024, // 10MB
multiple: true,
});
return (
<div>
{/* Zona de soltar */}
<div
{...getDropProps()}
style={{
border: state.isDragging ? '2px dashed blue' : '2px dashed gray',
padding: 40,
textAlign: 'center',
cursor: 'pointer',
}}
>
<input {...getInputProps()} />
<p>Arrastra y suelta archivos aquí, o haz clic para seleccionar</p>
</div>
{/* Lista de archivos */}
<ul>
{files.map((file) => (
<li key={file.id}>
{file.name} - {file.status}
{file.status === 'uploading' && ` (${file.progress}%)`}
<button onClick={() => actions.remove(file.id)}>Eliminar</button>
</li>
))}
</ul>
{/* Botón de carga */}
{files.length > 0 && (
<button onClick={() => actions.upload()}>
Cargar todo
</button>
)}
</div>
);
}
Conceptos principales
1. El hook useDropup
El hook useDropup es el punto de entrada principal. Devuelve todo lo que necesitas para construir tu interfaz de carga de archivos:
const {
files, // Array de archivos con estado, progreso, etc.
state, // Estado general (isDragging, isUploading, progress)
actions, // Métodos para cargar, eliminar, cancelar, reiniciar
getDropProps, // Props para tu elemento de zona de soltar
getInputProps, // Props para el input de archivo oculto
} = useDropup(options);
2. Objetos de archivo
Cada archivo en el array files contiene:
{
id: string; // Identificador único
file: File; // Objeto File original
name: string; // Nombre del archivo
size: number; // Tamaño del archivo en bytes
type: string; // Tipo MIME
preview?: string; // URL de vista previa (para imágenes)
status: 'idle' | 'uploading' | 'complete' | 'error';
progress: number; // Progreso de carga (0-100)
error?: Error; // Objeto de error si la carga falló
uploadedUrl?: string; // URL después de carga exitosa
}
3. Acciones
El objeto actions proporciona métodos para controlar las cargas:
actions.upload(fileIds?) // Iniciar carga (todos o archivos específicos)
actions.cancel(fileId?) // Cancelar carga(s)
actions.remove(fileId) // Eliminar un archivo de la lista
actions.reset() // Limpiar todos los archivos
actions.retry(fileIds?) // Reintentar cargas fallidas
Configurando cargas
Para habilitar cargas reales, proporciona una configuración de carga:
const { files } = useDropup({
upload: {
url: '/api/upload',
method: 'POST',
headers: {
'Authorization': 'Bearer token',
},
},
autoUpload: true, // Cargar automáticamente cuando se agregan archivos
});
Próximos pasos
- Aprende sobre opciones de validación
- Ve más ejemplos
- Explora integraciones de almacenamiento en la nube
- Consulta la referencia completa de la API