Позиция прокрутки в чате и разделитель новых сообщений
Этот документ описывает, как должна вести себя позиция прокрутки в чатах ADAMANT, когда пользователь входит в чат или взаимодействует с ним.
Два состояния прокрутки
Позиция прокрутки хранится отдельно для каждого чата. Чат может находиться в состоянии, при котором позиция не сохранена, либо в состоянии, при котором позиция была сохранена, потому что пользователь вручную прокрутил чат и зафиксировал положение.
Отображение кнопки Прокрутить вниз
Кнопка Прокрутить вниз должна появляться, когда последнее одиночное сообщение скрыто примерно на три четверти экрана.

При нажатии кнопки поведение зависит от наличия новых сообщений. Если новые сообщения есть — о чём свидетельствует счётчик рядом с кнопкой — вид прокручивается к разделителю Новые сообщения. Если новых сообщений нет или пользователь уже находится на уровне разделителя или ниже, вид прокручивается до самого конца.
При прокрутке к разделителю «Новые сообщения» он должен размещаться примерно с тремя строками сообщений над ним. В этом случае звук, вибрация и подсветка сообщений не должны срабатывать.
Разделитель никогда не должен появляться до самого первого сообщения в чате. Например, если пользователь получает десять сообщений от нового контакта, чат прокручивается к первому сообщению, но разделитель не отображается.
Сохранение позиции прокрутки
Позиция прокрутки должна сохраняться только тогда, когда пользователь находится не в самом низу чата. Положение в пределах нескольких пикселей от нижнего края считается «в самом низу» и не должно сохраняться. Как правило, если кнопка Прокрутить вниз видима, позиция должна быть сохранена.



Если длина чата меньше высоты экрана — например, несколько коротких сообщений — он всегда считается находящимся в самом низу: кнопка скрыта, а позиция прокрутки не сохраняется.
Восстановление позиции прокрутки
Существует три события, которые необходимо обработать. Во-первых, пользователь находится внутри чата, когда приходит новое сообщение. Во-вторых, пользователь открывает чат с новыми сообщениями из списка чатов или с другого экрана, например через Перейти в чат из Списка транзакций → Детали транзакции. В-третьих, пользователь открывает чат из уведомления о новом сообщении — как внутри приложения, так и через push-уведомление.
Когда пользователь находится в чате и приходит новое сообщение, поведение зависит от того, сохранена ли позиция прокрутки. Если позиция не сохранена, чат всегда прокручивается до самого низа при каждом входящем или исходящем сообщении, и разделитель не отображается. Если позиция сохранена, входящее сообщение не вызывает прокрутку; вместо этого обновляется счётчик на кнопке, и появляется разделитель, который пользователь может увидеть, нажав кнопку или прокрутив вручную. Исходящее сообщение, однако, всегда прокручивает чат до самого низа, независимо от сохранённой позиции.
Когда пользователь входит в чат с новыми сообщениями из списка чатов или другого экрана, и позиция не сохранена, чат переходит к разделителю Новые сообщения. Если позиция сохранена, чат не прокручивается; обновляется только счётчик на кнопке и отображается разделитель, который пользователь увидит при нажатии кнопки Прокрутить вниз или при ручной прокрутке.
Когда пользователь входит в чат из уведомления о новом сообщении, чат переходит к разделителю Новые сообщения, независимо от того, сохранена ли позиция. Даже если было получено несколько сообщений, вид не должен прыгать к самому последнему.
Эти правила обеспечивают согласованное и предсказуемое поведение прокрутки, разделителей и восстановления позиции при всех способах входа в чат в ADAMANT.