# Вложения в TEXT-сообщениях (`SHiNE:attach v=1`) Документ фиксирует текущий формат вложений в текстовых блоках SHiNE. ## Область применения Формат применяется к UTF-8 полю `text` в TEXT-блоках: - `TEXT_POST` - `TEXT_REPLY` - `TEXT_EDIT_POST` - `TEXT_EDIT_REPLY` Бинарный формат `TextBody` не меняется. Вложения являются техническим префиксом внутри обычного текста. ## Общий вид Один attach-блок: ```text ``` Несколько вложений идут подряд в самом начале текста: ```text Текст сообщения ``` После последнего attach-блока идёт обычный пользовательский текст. Пользовательский текст может быть пустым, если есть хотя бы одно валидное вложение. Клиент SHiNE ограничивает одно сообщение максимум 10 вложениями и сохраняет порядок attach-блоков в том порядке, в котором пользователь прикрепил файлы. ## Поля Обязательные поля: - `v=1` - версия формата attach-блока; - `name` - имя файла, закодированное через `encodeURIComponent`; - `size` - размер файла в байтах; - `sha256` - SHA-256 исходного файла в hex, 64 символа; - `ar` - короткий Arweave Transaction ID, 43 символа, без gateway URL. ## Хранение файла Файл хранится вне блокчейна в Arweave. В блокчейне хранится только метаинформация, достаточная для отображения и проверки: - имя файла; - размер; - SHA-256; - Arweave `txId`. ## Создание вложения в UI UI поддерживает три сценария: - загрузить новый файл в Arweave выбранным Arweave-кошельком; - ввести существующий `txId`, скачать файл через Arweave gateway и локально посчитать `size/sha256`; - выбрать файл из журнала файлов, загруженных в текущей браузерной сессии. Журнал хранится только в `sessionStorage` текущего браузера и не является частью блокчейна. В настройках клиента есть отдельный экран `Загрузка файлов`: пользователь может заранее загрузить файл в Arweave без создания сообщения, увидеть компактную плитку с именем, размером, временем загрузки, `txId` и статусом доступности через gateway, а затем выбрать этот файл из истории при создании сообщения. Если файл загружен заранее, но ещё не был отправлен ни в одном сообщении SHiNE, клиент показывает локальный флаг `Не добавлен в SHiNE`. Флаг снимается после успешной отправки сообщения с этим вложением. Если история очищена, уже созданные сообщения не меняются: в блокчейне остаются attach-блоки с `txId`. ## Отображение Новый клиент при чтении сообщения: 1. читает валидные attach-блоки только из начала текста; 2. скрывает технические attach-строки; 3. отображает вложения над пользовательским текстом; 4. показывает вложения горизонтальной каруселью: одно вложение на экране, переключение свайпом или стрелками, счётчик вида `1 из 3`; 5. определяет тип вложения по расширению имени файла: - изображение показывает как ограниченное по размеру превью; - видео показывает как превью с кнопкой воспроизведения и открывает большой HTML5-плеер по нажатию; - обычный файл показывает как карточку с именем, расширением, размером и скачиванием; 6. при перелистывании останавливает воспроизводящееся видео; 7. если attach-блок битый, игнорирует только этот блок и продолжает отображать сообщение. Если файл по ссылке Arweave gateway недоступен, клиент показывает диагностический блок: - если сообщение создано менее 20 минут назад: файл, скорее всего, ещё не распространился в Arweave, нужно повторить через несколько минут; - если сообщение старше 20 минут: файл считается недоступным. Старые клиенты без поддержки формата могут показывать attach-блоки как обычный текст. ## Редактирование При редактировании сообщения UI сохраняет существующие attach-блоки и меняет только пользовательский текст. Удаление сообщения по-прежнему выполняется через edit-блок с пустым текстом, как описано в `11_TEXT_Blocks.md`. ## Ограничения v1 - `ar` допускает только короткий Arweave `txId`, полный URL не используется; - MIME type не записывается, поэтому UI определяет image/video/file по расширению имени файла; - MIME type, width, height, duration и thumbnail не записываются в блокчейн; - проверка существующего `txId` скачивает файл локально через gateway, поэтому UI ограничивает максимальный размер такой проверки.