FileUpload
FileUpload — составной загрузчик файлов на Ark FileUpload. FileUpload.Root держит набор выбранных и отклонённых файлов, скрытый инпут формы добавляет сам. Файлы попадают в него тремя путями: через кнопку (FileUpload.Trigger), перетаскиванием (FileUpload.Dropzone) и вставкой из буфера — Ctrl+V, пока фокус внутри Root.
Готового вида у выбранных файлов нет — он собирается из частей. FileUpload.ItemGroup рендерит список, внутри FileUpload.Item свободно комбинируются превью, имя, размер, кнопка удаления, прогресс и ошибка. Где стоит список — над зоной, под ней или вместо неё — решает порядок частей в Root, а строками или плитками показывать файлы — layout группы.
Компонент только выбирает файлы: наружу он отдаёт File[] (onFileChange, onFileAccept), а отправку на сервер ведёт потребитель и возвращает её ход пропсами status и progress у FileUpload.Item. По умолчанию выбирается один файл — множественный выбор включает maxFiles.
Использует: ButtonIcon
Анатомия
Примеры
Через кнопку
FileUpload.Trigger превращает переданную кнопку в триггер диалога выбора — зона для перетаскивания при этом не обязательна. Внутрь кладётся Button.Root или ButtonIcon с любыми визуальными пропсами. Вставка из буфера работает и здесь: достаточно, чтобы фокус стоял на кнопке.
Плитки над зоной
layout="cards" показывает файлы плитками с превью: кнопка удаления ложится в угол миниатюры, имя — под ней. Список стоит над зоной просто потому, что FileUpload.ItemGroup записан в Root первым.
Превью вместо зоны
Одиночная картинка (обложка, аватар): после выбора зона уступает место превью. FileUpload.Context отдаёт состояние загрузчика рендер-функции — по acceptedFiles решается, показывать ли зону. Габариты плитки и превью меняются обычными className / style на FileUpload.Item и FileUpload.ItemPreview.
Вставка из соседнего поля
Внутри Root вставка из буфера работает сама — в том числе из вложенного поля ввода: текст вставляется в поле, файлы уходят в загрузчик. Если поле стоит снаружи, состояние поднимается хуком useFileUpload и передаётся в FileUpload.RootProvider вместо Root, а поле в своём onPaste зовёт setClipboardFiles: метод возвращает true, когда в буфере были файлы.
Статус отправки
Загрузчик сам ничего не отправляет: потребитель начинает отправку в onFileAccept и возвращает её ход в FileUpload.Item — status (uploading / success / error) и progress в процентах. FileUpload.ItemProgress рисует полосу, пока файл отправляется (без progress — бегущую), FileUpload.ItemStatus — значок статуса, FileUpload.ItemError с текстом — причину неудачи.
Ограничения и отклонённые файлы
accept, maxFiles, maxFileSize / minFileSize и validate отсеивают файлы при выборе. Не прошедшие проверку в набор не попадают — их показывает отдельная группа type="rejected", а FileUpload.ItemError без текста сам подставляет причину: тип, размер, лимит или повтор. Список отклонённых живёт до следующего выбора.
Ошибка и отключённый
invalid красит рамку зоны — сам текст ошибки поля выводит потребитель. disabled отключает загрузчик целиком: выбор, перетаскивание, вставка и удаление не работают.
API
| Prop | Type | Default |
|---|---|---|
children*Части загрузчика в любом порядке и наборе: Label, Dropzone, Trigger, ItemGroup, Context | ReactNode | - |
className | string | - |
style | CSSProperties | - |
nameИмя скрытого | string | - |
acceptДопустимые типы файлов: MIME-тип ( | ArkFileUploadProps["accept"] | - |
maxFilesСколько файлов можно выбрать. Больше одного — выбор становится множественным, новые файлы добавляются к уже выбранным | number | 1 |
maxFileSizeМаксимальный размер файла в байтах | number | - |
minFileSizeМинимальный размер файла в байтах | number | - |
validateСвоя проверка файла: возвращает коды или тексты ошибок (файл уходит в отклонённые, текст показывает FileUpload.ItemError) либо null | ( file: File, details: FileUploadFileValidateDetails, ) => FileUploadFileError[] | null | - |
acceptedFilesВыбранные файлы — контролируемый режим. Пара с onFileChange | File[] | - |
defaultAcceptedFilesНачальный набор файлов для неконтролируемого режима | File[] | - |
onFileChangeЛюбое изменение набора: получает | (details: FileUploadFileChangeDetails) => void | - |
onFileAcceptНабор принятых файлов изменился: получает | (details: FileUploadFileAcceptDetails) => void | - |
onFileRejectФайлы отклонены: получает | (details: FileUploadFileRejectDetails) => void | - |
disabledОтключает загрузчик: выбор, перетаскивание, вставка и удаление не работают | boolean | - |
invalidСостояние ошибки — дроп-зона получает красную рамку | boolean | - |
requiredОбязательное поле формы | boolean | - |
FileUpload.RootProvider
Тот же Root, но состояние приходит снаружи — из хука useFileUpload (он принимает те же пропсы, что Root). Нужен, когда с файлами работают соседи загрузчика: поле вне Root добавляет вставленные файлы, кнопка формы читает acceptedFiles.
| Prop | Type | Default |
|---|---|---|
value*Состояние загрузчика из хука useFileUpload | UseFileUploadReturn | - |
children*Части загрузчика — те же, что у FileUpload.Root | ReactNode | - |
className | string | - |
style | CSSProperties | - |
FileUpload.Label
Подпись загрузчика в стиле Field.Label.
| Prop | Type | Default |
|---|---|---|
children*Подпись загрузчика — привязана к скрытому инпуту | ReactNode | - |
FileUpload.Dropzone
Область для перетаскивания. По клику и Enter открывает диалог выбора, пока файл несут над ней — подсвечивается.
| Prop | Type | Default |
|---|---|---|
children*Содержимое зоны: иконка, подсказка, FileUpload.Trigger | ReactNode | - |
disableClickЗона только принимает перетаскивание: клик и Enter диалог выбора не открывают. Для зоны-обёртки вокруг другого содержимого (поле комментария, уже выбранное фото) | boolean | - |
className | string | - |
style | CSSProperties | - |
FileUpload.Trigger
Делает переданную кнопку триггером диалога выбора. Работает и отдельно, и внутри FileUpload.Dropzone.
| Prop | Type | Default |
|---|---|---|
children*Кнопка, открывающая диалог выбора файлов, — Button.Root или ButtonIcon (элемент должен принимать проброшенные пропсы и ref) | ReactElement | - |
FileUpload.Context
Рендер-функция от состояния загрузчика — когда разметка зависит от выбранных файлов.
| Prop | Type | Default |
|---|---|---|
children*Рендер-функция от состояния загрузчика: | (fileUpload: UseFileUploadReturn) => ReactNode | - |
FileUpload.ItemGroup
Список файлов — принятых или отклонённых. Пока файлов нет, не рендерится вовсе.
| Prop | Type | Default |
|---|---|---|
children*Рендер одного файла — возвращает FileUpload.Item с нужным набором частей | (file: File) => ReactNode | - |
typeКакие файлы показывает группа: принятые или отклонённые (не тот тип, размер, сверх лимита) | "accepted" | "rejected" | "accepted" |
layoutРаскладка файлов: | "list" | "cards" | "list" |
className | string | - |
style | CSSProperties | - |
FileUpload.Item
Один файл списка. Набор частей внутри свободный; сюда же приходит статус отправки.
| Prop | Type | Default |
|---|---|---|
file*Файл, который показывает элемент, — аргумент рендер-функции ItemGroup | File | - |
children*Части элемента в любом наборе: ItemPreview, ItemName, ItemSize, ItemStatus, ItemDelete, ItemProgress, ItemError | ReactNode | - |
statusСтатус отправки файла на сервер. Загрузчик сам ничего не отправляет —
статус ведёт потребитель: | FileUploadStatus | - |
progressПрогресс отправки в процентах (0–100) для ItemProgress. Без значения полоса бежит без конца — когда прогресс неизвестен | number | - |
className | string | - |
style | CSSProperties | - |
FileUpload.ItemPreview
Превью файла: у изображения — миниатюра из самого файла, у остальных — иконка.
| Prop | Type | Default |
|---|---|---|
childrenИконка для файла без превью (не изображение). По умолчанию — значок файла | ReactNode | - |
className | string | - |
style | CSSProperties | - |
FileUpload.ItemName
Имя файла в одну строку, длинное обрезается многоточием.
Компонент не принимает пропсов.
FileUpload.ItemSize
Размер файла в читаемом виде — «340 КБ», «1,2 МБ».
Компонент не принимает пропсов.
FileUpload.ItemDelete
Кнопка-крестик: убирает файл из набора. Об удалении потребитель узнаёт из onFileChange.
Компонент не принимает пропсов.
FileUpload.ItemProgress
Полоса прогресса. Видна, только пока у Item status="uploading"; заполнение берёт из его progress.
Компонент не принимает пропсов.
FileUpload.ItemStatus
Значок статуса отправки: индикатор, галочка или знак ошибки. Без статуса не рендерится.
Компонент не принимает пропсов.
FileUpload.ItemError
Текст ошибки файла: свой (children) или причины отклонения. Не рендерится, когда показывать нечего.
| Prop | Type | Default |
|---|---|---|
childrenСвой текст ошибки — обычно причина неудачной отправки. Без него у отклонённого файла показываются причины отклонения (тип, размер, лимит) | ReactNode | - |