# ✨ Сделать экран загрузки записи и её состояния

- **Тип:** feature
- **Категория:** Очередь — Первое, ради чего приложение открывают; требует каркаса и контракта, оба выше
- **Зачем:** Первое, ради чего приложение открывают: отдать файл и увидеть, что с ним происходит.

Экран принимает файл и заводит запись, а её рубеж обновляется сам, пока запись
не дошла до конечного рубежа `done` либо не встала признаком остановки.

Берётся после `spa-skeleton` и `json-api-for-spa`.

## Затрагивает

- новый экран приложения: выбор файла, отправка, показ рубежа;
- опрос рубежа записи и его остановка;
- показ отказа человекочитаемым текстом из контракта API;
- предел размера записи на стороне приложения: экран берёт его из
  `GET /app/config`, где сервер отдаёт своё же число;
- `docs/database.md` — частота опроса числом.

## Критерии приёмки

- Выбранный файл уходит на сервер и заводит запись; экран сразу показывает её
  рубеж. Оракул — тест экрана на подставном API: после отправки на экране
  идентификатор записи и рубеж `uploaded`.
- Опрос сам прекращается, когда запись дошла до `done` либо встала признаком
  остановки. Оракул — два теста: после ответа с рубежом `done` новых запросов к
  API нет; после ответа с признаком остановки — тоже.
- Остановленная запись показывается человекочитаемым текстом, а не кодом и не
  сырой ошибкой; машинного текста отказа контракт не отдаёт вовсе, поэтому текст
  строится из причины остановки. Оракул — тест на ответе с признаком остановки и
  причиной.
- Файл больше предела отклоняется на экране до отправки, с названным числом, и
  предел экран берёт из `GET /app/config`, а не держит своей константой. Оракул
  — тест на файле сверх предела: запроса на загрузку нет, на экране предел
  числом, и другое число в ответе `config` меняет показанное.

## Рамки

Записи звука в приложении не делаем — файл выбирают в системном диалоге. Список
прошлых записей не делаем, это `records-list-screen`.
