Перейти к основному содержимому

Типы TypeScript

Все экспортируемые типы из Dropup.

Импорт типов

import type {
DropupFile,
DropupState,
DropupActions,
DropupError,
UseDropupOptions,
UseDropupReturn,
FileStatus,
DropupStatus,
ValidationRule,
ValidationError,
UploadConfig,
CustomUploader,
UploadOptions,
UploadResult,
} from '@samithahansaka/dropup';

Основные типы

DropupFile

Представляет файл в очереди загрузки.

interface DropupFile {
/** Уникальный идентификатор */
id: string;

/** Исходный объект File браузера */
file: File;

/** Имя файла */
name: string;

/** Размер файла в байтах */
size: number;

/** MIME тип */
type: string;

/** Текущий статус загрузки */
status: FileStatus;

/** Прогресс загрузки 0-100 */
progress: number;

/** URL превью для изображений (Object URL) */
preview?: string;

/** URL после успешной загрузки */
uploadedUrl?: string;

/** Необработанный ответ сервера */
response?: unknown;

/** Детали ошибки при провале */
error?: DropupError;

/** Пользовательские метаданные */
meta?: Record<string, unknown>;
}

FileStatus

Возможные значения статуса файла.

type FileStatus = 'idle' | 'uploading' | 'complete' | 'error' | 'paused';

DropupState

Текущее состояние зоны сброса.

interface DropupState {
/** Файлы перетаскиваются над */
isDragging: boolean;

/** Перетаскиваемые файлы проходят валидацию */
isDragAccept: boolean;

/** Перетаскиваемые файлы не проходят валидацию */
isDragReject: boolean;

/** Какой-либо файл в данный момент загружается */
isUploading: boolean;

/** Средний прогресс всех файлов (0-100) */
progress: number;

/** Общий статус */
status: DropupStatus;
}

DropupStatus

Общий статус загрузки.

type DropupStatus = 'idle' | 'uploading' | 'complete' | 'error';

DropupActions

Доступные действия для управления загрузчиком.

interface DropupActions {
/** Начать загрузку файлов */
upload: (fileIds?: string[]) => void;

/** Отменить загрузки */
cancel: (fileId?: string) => void;

/** Удалить файл */
remove: (fileId: string) => void;

/** Удалить все файлы и сбросить состояние */
reset: () => void;

/** Повторить проваленные загрузки */
retry: (fileIds?: string[]) => void;

/** Добавить файлы программно */
addFiles: (files: File[] | FileList) => void;

/** Обновить метаданные файла */
updateFileMeta: (fileId: string, meta: Record<string, unknown>) => void;
}

DropupError

Объект ошибки для проваленных загрузок.

interface DropupError {
/** Код ошибки */
code: string;

/** Читаемое сообщение */
message: string;

/** Исходная ошибка, если доступна */
cause?: Error;
}

Типы опций

UseDropupOptions

Параметры конфигурации для хука.

interface UseDropupOptions {
// Валидация
accept?: string | string[];
maxSize?: number;
minSize?: number;
maxFiles?: number;
maxWidth?: number;
maxHeight?: number;
minWidth?: number;
minHeight?: number;
customRules?: ValidationRule[];

// Поведение
multiple?: boolean;
disabled?: boolean;
autoUpload?: boolean;
generatePreviews?: boolean;

// Загрузка
upload?: UploadConfig | CustomUploader;

// Колбэки
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

Конфигурация загрузки на основе URL.

interface UploadConfig {
/** URL конечной точки загрузки */
url: string;

/** HTTP метод */
method?: 'POST' | 'PUT' | 'PATCH';

/** Заголовки запроса */
headers?: Record<string, string>;

/** Имя поля формы для файла */
fieldName?: string;

/** Включить учетные данные/cookies */
withCredentials?: boolean;

/** Таймаут запроса в миллисекундах */
timeout?: number;

/** Дополнительные данные формы */
data?: Record<string, unknown>;
}

CustomUploader

Тип пользовательской функции загрузки.

type CustomUploader = (
file: DropupFile,
options: UploadOptions
) => Promise<UploadResult>;

UploadOptions

Опции, передаваемые пользовательскому загрузчику.

interface UploadOptions {
/** Сигнал отмены для прерывания */
signal: AbortSignal;

/** Колбэк прогресса */
onProgress: (progress: number) => void;
}

UploadResult

Результат, возвращаемый из загрузки.

interface UploadResult {
/** URL загруженного файла */
url?: string;

/** Необработанный ответ сервера */
response?: unknown;
}

Типы валидации

ValidationRule

Пользовательская функция валидации.

type ValidationRule = (file: File) =>
| boolean
| string
| Promise<boolean | string>;

Возвращаемые значения:

  • true - Валидация пройдена
  • false - Валидация провалена (общая ошибка)
  • string - Валидация провалена с пользовательским сообщением

ValidationError

Ошибка валидации для файла.

interface ValidationError {
/** Файл, который не прошел валидацию */
file: File;

/** Массив сообщений об ошибках */
errors: string[];
}

Возвращаемые типы

UseDropupReturn

Полный возвращаемый тип хука.

interface UseDropupReturn {
/** Массив файлов */
files: DropupFile[];

/** Текущее состояние */
state: DropupState;

/** Доступные действия */
actions: DropupActions;

/** Геттер свойств для зоны сброса */
getDropProps: <E extends HTMLElement = HTMLDivElement>(
props?: React.HTMLAttributes<E>
) => DropZoneProps<E>;

/** Геттер свойств для элемента input */
getInputProps: (
props?: React.InputHTMLAttributes<HTMLInputElement>
) => InputProps;

/** Открыть диалог выбора файлов программно */
openFileDialog: () => void;
}

DropZoneProps

Свойства, возвращаемые 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

Свойства, возвращаемые getInputProps.

interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
type: 'file';
accept?: string;
multiple?: boolean;
onChange: React.ChangeEventHandler<HTMLInputElement>;
style: React.CSSProperties;
}

Облачные типы

S3UploaderConfig

Конфигурация для загрузчика S3.

interface S3UploaderConfig {
getPresignedUrl: (file: DropupFile) => Promise<PresignedUrlResponse>;
}

interface PresignedUrlResponse {
url: string;
fields?: Record<string, string>;
}

GCSUploaderConfig

Конфигурация для загрузчика Google Cloud Storage.

interface GCSUploaderConfig {
getSignedUrl: (file: DropupFile) => Promise<SignedUrlResponse>;
}

interface SignedUrlResponse {
url: string;
headers?: Record<string, string>;
}

AzureUploaderConfig

Конфигурация для загрузчика Azure Blob Storage.

interface AzureUploaderConfig {
getSasUrl: (file: DropupFile) => Promise<SasUrlResponse>;
}

interface SasUrlResponse {
url: string;
headers?: Record<string, string>;
}

Типы фрагментированной загрузки

ChunkedUploaderConfig

Конфигурация для фрагментированных загрузок.

interface ChunkedUploaderConfig {
/** URL конечной точки загрузки */
url: string;

/** Размер фрагмента в байтах (по умолчанию: 5МБ) */
chunkSize?: number;

/** Максимум одновременных фрагментов */
concurrency?: number;

/** Заголовки запроса */
headers?: Record<string, string>;
}

Типы обработки изображений

CompressOptions

Опции сжатия изображений.

interface CompressOptions {
/** Максимальная ширина */
maxWidth?: number;

/** Максимальная высота */
maxHeight?: number;

/** Качество 0-1 (по умолчанию: 0.8) */
quality?: number;

/** Выходной формат */
type?: 'image/jpeg' | 'image/png' | 'image/webp';
}

Утилиты типов

Обобщенные типы

// Извлечь статус файла
type IdleFile = DropupFile & { status: 'idle' };
type UploadingFile = DropupFile & { status: 'uploading' };
type CompletedFile = DropupFile & { status: 'complete' };
type FailedFile = DropupFile & { status: 'error' };

// Функции защиты типов
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';
}

Использование с защитниками типов

const { files } = useDropup();

// Фильтрация с безопасностью типов
const uploadingFiles = files.filter(isUploading);
// uploadingFiles это UploadingFile[]

const completedFiles = files.filter(isComplete);
// completedFiles это CompletedFile[]