import type { ReactNode, RefObject } from 'react'; export type RestrictionFnResult = { code: string; message: string; }; export type RestrictionFn = (value: File) => RestrictionFnResult | undefined; export type FileId = string; export type FileStatus = { /** * Если true, будет отображен progress-бар загрузки файла */ isLoading?: boolean; /** * Флаг состояния ошибки при загрузке файла */ isUploadError?: boolean; /** * Флаг состояния ошибки при проверке файла на условия */ isRestrictionError?: boolean; /** * текст ошибки */ errorMsg?: string; /** * Значение прогресса загрузки файла. Должно быть от 0 до 100. */ progress?: number; }; export type UploadFile = { /** * Идентификатор */ id: FileId; /** * Название файла */ name: string; /** * MIME-тип файла * @example * { id: '1', name: 'file_name.pdf', type: 'application/pdf' } */ type: string; /** * Размер файла в байтах */ size?: number; /** * Объект файла */ file?: File; /** * Ссылка на файле */ url?: string; /** * Состояния файла */ status?: FileStatus; }; /** * Формат данных, ожидаемый в ответе после загрузки файла */ export type UploadedFileData = Omit; /** * Опции для уведомлений */ type NotifyOptions = { /** * Дополнительный текст уведомления */ content?: string; }; export type FileUploaderNotify = { /** * Показать уведомление об успехе * @param title - Заголовок уведомления * @param options - Дополнительные опции уведомления * @returns Идентификатор уведомления */ success: (title: string, options?: NotifyOptions) => number | string; /** * Показать уведомление об ошибке * @param title - Заголовок уведомления * @param options - Дополнительные опции уведомления * @returns Идентификатор уведомления */ error: (title: string, options?: NotifyOptions) => number | string; /** * Показать уведомление с предупреждением * @param title - Заголовок уведомления * @param options - Дополнительные опции уведомления * @returns Идентификатор уведомления */ warning: (title: string, options?: NotifyOptions) => number | string; /** * Показать информационное уведомление * @param title - Заголовок уведомления * @param options - Дополнительные опции уведомления * @returns Идентификатор уведомления */ info: (title: string, options?: NotifyOptions) => number | string; }; type BaseFileUploaderProps = { /** * Название класса, применяется к корневому компоненту */ className?: string; /** * Название поля */ name?: string; /** * Название поля */ label?: string; /** * Массив разрешенных расширений файлов и MIME-типов * * @example * // Используя расширения файлов * accept={['.jpg', '.png', '.pdf']} * * // Используя MIME-типы * accept={['image/jpeg', 'image/png', 'application/pdf']} * * // Комбинируя расширения и MIME-типы * accept={['.jpg', 'image/png', 'application/pdf']} */ accept: string[]; /** * Максимальный размер файла в байтах */ maxFileSize: number; /** * Если true, компонент будет недоступен для взаимодействия */ isDisabled?: boolean; /** * Флаг состояния ошибки */ isError?: boolean; /** * Вспомогательный текст */ helperText?: ReactNode; /** * Массив функций для дополнительной валидации файлов, применяется к каждому файлу */ restrictions?: RestrictionFn[]; /** * Вспомогательный текст */ placeholder?: string; /** * Реф для доступа к input элементу */ inputRef?: RefObject; /** * Объект с методами для отображения уведомлений * @remarks * Используется для показа системных уведомлений при загрузке файлов */ notify: FileUploaderNotify; /** * Функция для генерации ссылки на скачивание/просмотр файла * @param fileId - Идентификатор файла * @param file - Объект файла * @param fileUrl - URL файла, если он уже загружен * @returns Строка с URL для скачивания/просмотра файла * @example * generateDownloadLink: (fileId, file, fileUrl) => { * return fileUrl || `/api/files/${fileId}`; * } */ generateDownloadLink?: (fileId: FileId, file?: File, fileUrl?: string) => string; /** * Функция загрузки файлов на сервер * @param fileId - Идентификатор файла * @param file - Объект файла для загрузки * @param options - Опции для управления загрузкой * @param options.signal - AbortSignal для отмены загрузки файла * @param options.setProgress - Функция для обновления прогресса загрузки * @returns Promise с данными загруженного файла */ onUploadFile?: (fileId: FileId, file: File, options: { signal: AbortSignal; setProgress: (progressFileId: FileId, progressEvent: ProgressEvent) => void; }) => Promise; /** * Обработчик просмотра файла * @param fileId - Идентификатор файла * @param file - Объект файла * @param fileUrl - URL файла, если он уже загружен * @remarks * Если указан generateDownloadLink, то onView не нужен. * Используется если необходимо переопределить стандартное поведение с просмотром в новой вкладке * @example * onView: (fileId, file, fileUrl) => { * openFileInModal({ fileId, file fileUrl }); * } */ onView?: (fileId: FileId, file?: File, fileUrl?: string) => void; /** * Функция, позволяющая задавать кастомный текст ошибки */ getErrorMessage?: (fileId: FileId, error: Error) => string; }; type SingleFileUploaderProps = { value: UploadFile | null | undefined; isMultiple?: false; maxFileCount?: never; /** * Функция, вызываемая при изменении списка файлов (добавление/удаление) * @param value - Объект загруженного файла или null при удалении * @remarks * Вызывается в следующих случаях: * - При добавлении нового файла через диалог выбора или drag-n-drop * - При удалении файла * - При изменении статуса загрузки файла (loading/success/error) * - При обновлении информации о файле после успешной загрузки */ onChange: (value: UploadFile | null) => void; } & BaseFileUploaderProps; type MultipleFileUploaderProps = { value: UploadFile[]; /** * Если true, будет доступна множественная загрузка файлов */ isMultiple: true; /** * Максимальное количество файлов */ maxFileCount: number; /** * Функция, вызываемая при изменении списка файлов (добавление/удаление) * @param value - Массив объектов загруженных файлов * @remarks * Вызывается в следующих случаях: * - При добавлении новых файлов через диалог выбора или drag-n-drop * - При удалении файла из списка * - При изменении статуса загрузки файла (loading/success/error) * - При обновлении информации о файле после успешной загрузки */ onChange: (value: UploadFile[]) => void; } & BaseFileUploaderProps; export type FileUploaderProps = MultipleFileUploaderProps | SingleFileUploaderProps; export type SpecificSelfFileParams = { /** * Экземпляр AbortController для отмены загрузки файла */ controller?: AbortController; }; /** * файл обогащенный AbortController при загрузке файла */ type SelfFile = UploadFile & SpecificSelfFileParams; /** * Механизм для взаимодействия с внутренним поведением файлов */ export type SelfFileApi = { /** * Рекорд по id файла на файлы обогащенные AbortController при загрузке файла */ selfFiles: Record; /** * Метод для установки состояния загрузки файла */ setLoadingStatusFile: (fileId: string, progress?: number | undefined) => void; /** * Метод для установки состояния успешной загрузки файла */ setSuccessStatusFile: (fileId: string) => void; /** * Метод для установки состояния ошибочной загрузки файла */ setErrorStatusFile: (fileId: string, errorMsg: string) => void; /** * Метод для общего обновления по id файла */ updateFileInfo: (fileId: string, data: Partial & SpecificSelfFileParams) => void; }; export {};