Cómo funciona Dropup
Dropup está construido alrededor del concepto de UI sin cabeza - maneja toda la lógica compleja de carga de archivos mientras te da control total sobre la presentación visual.
Arquitectura
┌─────────────────────────────────────────────────────────────┐
│ Tu componente React │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Zona de │ │ Lista de │ │ Botón de carga │ │
│ │ soltar (UI) │ │ archivos │ │ (tu UI) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Hook useDropup ││
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────┐ ││
│ │ │Motor de │ │ Gestor de │ │ Motor de │ │Adaptador│ ││
│ │ │validación │ │ estado │ │ carga │ │plataform│ ││
│ │ └───────────┘ └───────────┘ └───────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Componentes clave
1. Gestor de estado
Dropup usa useReducer de React para gestión de estado predecible:
- Rastrea todos los archivos y sus estados
- Gestiona el estado de arrastre
- Maneja el progreso de carga
- Proporciona valores calculados
2. Motor de validación
Antes de que se agreguen los archivos, pasan por validación:
const { files } = useDropup({
accept: 'image/*', // Validación de tipo de archivo
maxSize: 5 * 1024 * 1024, // Tamaño máximo de archivo
minSize: 1024, // Tamaño mínimo de archivo
maxFiles: 10, // Número máximo de archivos
maxWidth: 4096, // Ancho máximo de imagen
maxHeight: 4096, // Alto máximo de imagen
customRules: [ // Validación personalizada
(file) => file.name.length < 100 || 'Nombre de archivo muy largo'
],
});
3. Motor de carga
El motor de carga maneja:
- Cargas simples (una solicitud por archivo)
- Cargas fragmentadas (divide archivos grandes)
- Lógica de reintento con retroceso exponencial
- Gestión de cargas concurrentes
- Seguimiento de progreso
4. Adaptador de plataforma
Dropup funciona en todas las plataformas:
- Web - Usa APIs nativas del navegador
- React Native - Usa manejo nativo de archivos
- SSR - Seguro para renderizado del lado del servidor
Flujo de datos
Acción del usuario → Validación → Actualización de estado → Carga → Callbacks
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Seleccionar/ Aceptar/Rechazar files[] XHR/Fetch onComplete
Soltar archivos Actualizado Progreso onError
Principios de diseño
1. Sin cabeza primero
Sin componentes de UI integrados - construyes exactamente lo que necesitas:
// Tú controlas toda la UI
<div {...getDropProps()}>
<TuZonaDeSoltarPersonalizada />
<input {...getInputProps()} />
</div>
2. Seguridad de tipos
Soporte completo de TypeScript con tipos comprehensivos:
import type { DropupFile, UseDropupOptions } from '@samithahansaka/dropup';
const options: UseDropupOptions = {
accept: 'image/*',
onUploadComplete: (file: DropupFile) => {
console.log(file.uploadedUrl);
},
};
3. Divisible en árboles
Importa solo lo que necesitas:
// Solo el núcleo (~10KB)
import { useDropup } from '@samithahansaka/dropup';
// Agrega soporte de nube cuando lo necesites
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';
// Agrega procesamiento de imágenes cuando lo necesites
import { compressImage } from '@samithahansaka/dropup/image';
4. Mejora progresiva
Comienza simple, agrega características según las necesites:
// Uso básico
const { files } = useDropup();
// Agregar validación
const { files } = useDropup({ maxSize: 10_000_000 });
// Agregar carga automática
const { files } = useDropup({
maxSize: 10_000_000,
upload: { url: '/api/upload' },
autoUpload: true,
});
// Agregar almacenamiento en la nube
const { files } = useDropup({
upload: createS3Uploader({ getPresignedUrl }),
});