AAGO Android Design

ограниченные посетители

Ограниченные посетители

Список ограничений на посетителей сайта — спам-заглушки и бессрочные блокировки, — с возможностью снять любое действующее. Экран надзора: администратор открывает его, чтобы проверить или отменить, а не следить в реальном времени, поэтому здесь нет автообновления — только ручное обновление после снятия.

⋮Живёт в меню «ещё» списка диалогов, под правом site:configure — не в разделе «Ещё»
GET/visitor-restrictions с пагинацией по ключу (before/nextBeforeId)
POST/{visitorId}/lift — снять; кнопка только у действующих строк и только при block/mark_spam

Меню ⋮ в списке диалогов пока не существует

Сегодня шапка списка диалогов несёт только аватар аккаунта (26-90 убрал старую пару «точка + меню»). Этот срез добавляет меню ⋮ обратно и вешает в него один пункт под правом site:configure. Это не строка в «Ещё».

01

Точка входа — меню ⋮ в списке диалогов

navigation.md: ConvList — «⋮ · site:configure» → Restricted. Меню рисуется только у оператора с правом site:configure — у остальных его нет вовсе (скрыто, а не заблокировано), как более короткое меню в консоли.

9:41
Диалоги
АГ
Мои 4
Ожидают 2
Все
🦊🍕
Лиса Пицца a0f3c99:12
Спасибо, буду ждать звонка
🦉🍔
Сова Бургер 7c4e188:59
А можно перенести на завтра?
Ограниченные посетители
/conversations — меню ⋮ · пункт под site:configure

Один пункт в меню — «Ограниченные посетители». Открывает экран-вкладыш поверх списка (третье состояние ConversationsTabHost: openRestricted), «назад» возвращает в список. Оператор без site:configure не видит саму иконку ⋮.

Позже сюда же встанет «лупа» поиска (navigation.md, ещё не построена) — вторая иконка рядом с этим меню; учтено, чтобы не столкнулись.

02

Список ограничений — вид и снятие

Каждое ограничение — карточка: код посетителя (8 символов моноширинным, как в консоли visitorId.slice(0,8)), метка вида (спам / блок) своим тоном, статус, когда и кем, до какого срока или бессрочно. Кнопка «Снять» — только у действующих строк.

9:41
Ограниченные посетители
b27d05a1 Блокировка Активно
Ограничен 18 апр, 14:32 · кем a0f3c952
До: Бессрочно · из диалога 7c4e18f0
Снять ограничение
d6081bba Спам Активно
Ограничен 18 апр, 11:07 · кем a0f3c952
До: 25 апр, 11:07 · из диалога b27d05a1
Снять ограничение
3f11a0c4 Спам Истекло
Ограничен 10 апр, 16:20 · кем e2b90741
До: 17 апр, 16:20 · из диалога d6081bba
9a44e0b2 Блокировка Снято
Ограничен 2 апр, 09:15 · кем a0f3c952
Снято 5 апр, 10:41 · кем e2b90741
Загрузить ещё · страница по ключу
/conversations/restricted · GET /visitor-restrictions?before=…

Тон несёт вид ограничения: Block — danger, Spam — accent, ровно как KIND_TONE в консоли. Статус («Активно» / «Истекло» / «Снято») считается на клиенте от IClock для показа — порядок же задаёт ключ сервера (id), не часы.

«Загрузить ещё» идёт по nextBeforeId до конца — бессрочная блокировка не потеряется, даже если её строку вытеснили новые.

Кнопка «Снять» — только у действующих строк и только у оператора с правом conversation:block или mark_spam (скрыта, а не заблокирована). После снятия список перечитывается сверху — один источник правды, без оптимистичного переключения.

9:41
Ограниченные посетители
b27d05a1БлокировкаАктивно
Ограничен 18 апр, 14:32 · кем a0f3c952
До: Бессрочно · из диалога 7c4e18f0
Снять ограничение
Снять ограничение?
Посетитель b27d05a1 снова сможет писать в этот сайт. Действие обратимо — при необходимости его можно ограничить снова.
Отмена
Снять
POST /api/v1/visitor-restrictions/{visitorId}/lift → 204

Подтверждение — Material AlertDialog (в консоли это Dialog). Отклоняется системной «назад» раньше самого экрана (клаузула контракта «назад»). Отказ сервера (Conversation.Forbidden — не то право; Visitor.NotRestricted — уже снято/истекло) показывается баннером его же словами.

9:41
Ограниченные посетители

Ограничений нет

Ни один посетитель этого сайта сейчас не ограничен. Ограничения появляются здесь, когда оператор помечает диалог как спам или блокирует посетителя.

пустой ответ — не спиннер

Пустой список — это Loaded(rows = []), отдельное терминальное состояние, а не бесконечная загрузка. Загрузка и ошибка чтения — свои состояния (спиннер / баннер с повтором), как на всех экранах приложения.

Переиспользует существующий порт

Порт VisitorRestrictionApi уже есть (26-145, панель контакта: block / lift / isRestricted). Этот срез переиспользует lift и добавляет один метод чтения list(before, limit) в тот же порт и адаптер — один порт на один ресурс сервера, новых привязок DI не нужно.