Tipos de TypeScript
Todos los tipos exportados de Dropup.
Importar tipos
import type {
DropupFile,
DropupState,
DropupActions,
DropupError,
UseDropupOptions,
UseDropupReturn,
FileStatus,
DropupStatus,
ValidationRule,
ValidationError,
UploadConfig,
CustomUploader,
UploadOptions,
UploadResult,
} from '@samithahansaka/dropup';
Tipos principales
DropupFile
Representa un archivo en la cola de carga.
interface DropupFile {
/** Identificador único */
id: string;
/** Objeto File original del navegador */
file: File;
/** Nombre del archivo */
name: string;
/** Tamaño del archivo en bytes */
size: number;
/** Tipo MIME */
type: string;
/** Estado actual de carga */
status: FileStatus;
/** Progreso de carga 0-100 */
progress: number;
/** URL de vista previa para imágenes (URL de objeto) */
preview?: string;
/** URL después de carga exitosa */
uploadedUrl?: string;
/** Respuesta cruda del servidor */
response?: unknown;
/** Detalles de error si falló */
error?: DropupError;
/** Metadatos personalizados */
meta?: Record<string, unknown>;
}
FileStatus
Valores posibles de estado de archivo.
type FileStatus = 'idle' | 'uploading' | 'complete' | 'error' | 'paused';
DropupState
Estado actual de la zona de soltar.
interface DropupState {
/** Archivos siendo arrastrados encima */
isDragging: boolean;
/** Archivos arrastrados pasan validación */
isDragAccept: boolean;
/** Archivos arrastrados fallan validación */
isDragReject: boolean;
/** Algún archivo actualmente cargando */
isUploading: boolean;
/** Progreso promedio de todos los archivos (0-100) */
progress: number;
/** Estado general */
status: DropupStatus;
}
DropupStatus
Estado general de carga.
type DropupStatus = 'idle' | 'uploading' | 'complete' | 'error';
DropupActions
Acciones disponibles para controlar el cargador.
interface DropupActions {
/** Iniciar carga de archivos */
upload: (fileIds?: string[]) => void;
/** Cancelar cargas */
cancel: (fileId?: string) => void;
/** Eliminar un archivo */
remove: (fileId: string) => void;
/** Eliminar todos los archivos y reiniciar estado */
reset: () => void;
/** Reintentar cargas fallidas */
retry: (fileIds?: string[]) => void;
/** Agregar archivos programáticamente */
addFiles: (files: File[] | FileList) => void;
/** Actualizar metadatos de archivo */
updateFileMeta: (fileId: string, meta: Record<string, unknown>) => void;
}
DropupError
Objeto de error para cargas fallidas.
interface DropupError {
/** Código de error */
code: string;
/** Mensaje legible */
message: string;
/** Error original si está disponible */
cause?: Error;
}
Tipos de opciones
UseDropupOptions
Opciones de configuración para el hook.
interface UseDropupOptions {
// Validación
accept?: string | string[];
maxSize?: number;
minSize?: number;
maxFiles?: number;
maxWidth?: number;
maxHeight?: number;
minWidth?: number;
minHeight?: number;
customRules?: ValidationRule[];
// Comportamiento
multiple?: boolean;
disabled?: boolean;
autoUpload?: boolean;
generatePreviews?: boolean;
// Carga
upload?: UploadConfig | CustomUploader;
// Callbacks
onFilesAdded?: (files: DropupFile[]) => void;
onFileRemoved?: (file: DropupFile) => void;
onValidationError?: (errors: ValidationError[]) => void;
onUploadStart?: (file: DropupFile) => void;
onUploadProgress?: (file: DropupFile, progress: number) => void;
onUploadComplete?: (file: DropupFile, response: unknown) => void;
onUploadError?: (file: DropupFile, error: DropupError) => void;
onAllComplete?: (files: DropupFile[]) => void;
}
UploadConfig
Configuración de carga basada en URL.
interface UploadConfig {
/** URL del endpoint de carga */
url: string;
/** Método HTTP */
method?: 'POST' | 'PUT' | 'PATCH';
/** Headers de la petición */
headers?: Record<string, string>;
/** Nombre del campo del formulario para el archivo */
fieldName?: string;
/** Incluir credenciales/cookies */
withCredentials?: boolean;
/** Timeout de la petición en milisegundos */
timeout?: number;
/** Datos adicionales del formulario */
data?: Record<string, unknown>;
}
CustomUploader
Tipo de función de carga personalizada.
type CustomUploader = (
file: DropupFile,
options: UploadOptions
) => Promise<UploadResult>;
UploadOptions
Opciones pasadas al cargador personalizado.
interface UploadOptions {
/** Señal de abort para cancelación */
signal: AbortSignal;
/** Callback de progreso */
onProgress: (progress: number) => void;
}
UploadResult
Resultado retornado de la carga.
interface UploadResult {
/** URL del archivo cargado */
url?: string;
/** Respuesta cruda del servidor */
response?: unknown;
}
Tipos de validación
ValidationRule
Función de validación personalizada.
type ValidationRule = (file: File) =>
| boolean
| string
| Promise<boolean | string>;
Valores de retorno:
true- Validación pasófalse- Validación falló (error genérico)string- Validación falló con mensaje personalizado
ValidationError
Error de validación para un archivo.
interface ValidationError {
/** El archivo que falló la validación */
file: File;
/** Array de mensajes de error */
errors: string[];
}
Tipos de retorno
UseDropupReturn
Tipo completo de retorno del hook.
interface UseDropupReturn {
/** Array de archivos */
files: DropupFile[];
/** Estado actual */
state: DropupState;
/** Acciones disponibles */
actions: DropupActions;
/** Getter de props para zona de soltar */
getDropProps: <E extends HTMLElement = HTMLDivElement>(
props?: React.HTMLAttributes<E>
) => DropZoneProps<E>;
/** Getter de props para elemento input */
getInputProps: (
props?: React.InputHTMLAttributes<HTMLInputElement>
) => InputProps;
/** Abrir diálogo de archivos programáticamente */
openFileDialog: () => void;
}
DropZoneProps
Props retornadas por getDropProps.
interface DropZoneProps<E extends HTMLElement>
extends React.HTMLAttributes<E> {
onDragEnter: React.DragEventHandler<E>;
onDragOver: React.DragEventHandler<E>;
onDragLeave: React.DragEventHandler<E>;
onDrop: React.DragEventHandler<E>;
onClick: React.MouseEventHandler<E>;
role: string;
tabIndex: number;
}
InputProps
Props retornadas por getInputProps.
interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
type: 'file';
accept?: string;
multiple?: boolean;
onChange: React.ChangeEventHandler<HTMLInputElement>;
style: React.CSSProperties;
}
Tipos de nube
S3UploaderConfig
Configuración para cargador S3.
interface S3UploaderConfig {
getPresignedUrl: (file: DropupFile) => Promise<PresignedUrlResponse>;
}
interface PresignedUrlResponse {
url: string;
fields?: Record<string, string>;
}
GCSUploaderConfig
Configuración para cargador de Google Cloud Storage.
interface GCSUploaderConfig {
getSignedUrl: (file: DropupFile) => Promise<SignedUrlResponse>;
}
interface SignedUrlResponse {
url: string;
headers?: Record<string, string>;
}
AzureUploaderConfig
Configuración para cargador de Azure Blob Storage.
interface AzureUploaderConfig {
getSasUrl: (file: DropupFile) => Promise<SasUrlResponse>;
}
interface SasUrlResponse {
url: string;
headers?: Record<string, string>;
}
Tipos de carga fragmentada
ChunkedUploaderConfig
Configuración para cargas fragmentadas.
interface ChunkedUploaderConfig {
/** URL del endpoint de carga */
url: string;
/** Tamaño de fragmento en bytes (por defecto: 5MB) */
chunkSize?: number;
/** Máximo de fragmentos concurrentes */
concurrency?: number;
/** Headers de la petición */
headers?: Record<string, string>;
}
Tipos de procesamiento de imágenes
CompressOptions
Opciones de compresión de imagen.
interface CompressOptions {
/** Ancho máximo */
maxWidth?: number;
/** Alto máximo */
maxHeight?: number;
/** Calidad 0-1 (por defecto: 0.8) */
quality?: number;
/** Formato de salida */
type?: 'image/jpeg' | 'image/png' | 'image/webp';
}
Utilidades de tipos
Tipos genéricos
// Extraer estado de archivo
type IdleFile = DropupFile & { status: 'idle' };
type UploadingFile = DropupFile & { status: 'uploading' };
type CompletedFile = DropupFile & { status: 'complete' };
type FailedFile = DropupFile & { status: 'error' };
// Funciones de type guard
function isIdle(file: DropupFile): file is IdleFile {
return file.status === 'idle';
}
function isUploading(file: DropupFile): file is UploadingFile {
return file.status === 'uploading';
}
function isComplete(file: DropupFile): file is CompletedFile {
return file.status === 'complete';
}
function isFailed(file: DropupFile): file is FailedFile {
return file.status === 'error';
}
Uso con type guards
const { files } = useDropup();
// Filtrar con seguridad de tipos
const uploadingFiles = files.filter(isUploading);
// uploadingFiles es UploadingFile[]
const completedFiles = files.filter(isComplete);
// completedFiles es CompletedFile[]