Подготовь бизнес-требования для создания новой функциональности приложения - уведомлений. Я обновил макет в фигма. Там следующие существенные изменения: 1) На главном экране под окном чата размещается не одна кнопка, а две - вход в чат и звонок оператору. 2) В верхнем меню ссылка на историю чата заменена на Центр уведомлений. ## Уведомления - Это новая бизнес сущность. Для гостевого режима перечень уведомлений одинаковый для всех посетителей. Для авторизованного режима перечень уведомлений персоналирован под каждого пользователя. Уведомления могут быть разных видов (каждый label - это отдельный вид уведомления с различными сценариями поведения при нажатии, с различной цветовой гаммой и различными иконками): [ { "type": "authorize" "label": "Гостевой режим", "header": "Вы в гостевом режиме", "text": "Авторизуйтесь для получения полноценного доступа к функционалу приложения", "CTA": 'Войти →' "action": Переход к сценарию авторизации (/auth/consent → /auth/phone) "countable": no }, { "type": "install_Android" "label": "Приложение", "header": "Установите приложение", "text": "Установите приложение, чтобы быть всегда на связи", "CTA": ' Установить →' "action": запустить скрипт установки PWA приложения "countable": no }, { "type": "install_IOS-HarmonyOS" "label": "Приложение", "header": "Установите приложение", "text": "Установите приложение, чтобы быть всегда на связи", "CTA": ' Как установить →' "action": Переход на страницу детального просмотра уведомления "countable": no }, { "type": "emergency" "label": "Срочно", "header": String, "text": String, "CTA": 'Подробнее →' "action": Переход на страницу детального просмотра уведомления "source": notification-service "countable": yes }, { "type": "memo" "label": "Напоминание", "header": String, "text": String, "CTA": 'Подробнее →' "action": Переход на страницу детального просмотра уведомления "source": notification-service "countable": yes }, { "type": "news" "label": "Новость", "header": String, "text": String, "CTA": 'Подробнее →' "action": Переход на страницу детального просмотра уведомления "source": notification-service "countable": yes }, { "type": "new_message" "label": "Сообщение", "header": String, "text": String, "CTA": ' Открыть чат →' "action": "Переход в чат с консультантом" "source": han-app "countable": yes }, { "type": "ads" "label": "Предложение", "header": String, "text": String, "action": Переход на страницу детального просмотра уведомления "price": INT "₽" "old price": INT "₽" "CTA": 'Узнать подробнее →' "source": notification-service "countable": yes }, { "type": "promo" "label": "Акция", "header": String, "text": String, "action": Переход на страницу детального просмотра уведомления "price": INT "₽" "old price": INT "₽" "CTA": 'Узнать подробнее →' "source": ??? (public api) "countable": yes } ] Уведомления могут создаваться различными сервисами. На текущий момент создание уведомлений выглядит следующим образом (жесткую привязку не нужно делать сервисов и видов уведомлений, это то что нужно реализовать сейчас): 1. В неавторизованной зоне: 1.1. Фронтенд самостоятельно создает уведомления для неавторизованных пользователей. Это уведомления, призывающие пользователя авторизоваться, скачать приложение: 1.1.1. authorize 1.1.2. install_Android (пользователь зашел с мобильного телефона на ОС Андроид, и у него не установлено приложение); 1.1.3. install_IOS-HarmonyOS (пользователь зашел с мобильного телефона на iOS или HarmonyOS, и у него не установлено приложение); 1.2. Уведомления, которые фронтенд получает по публичному API (это могут быть рекламные или информационные сообщения) 1.2.1. ads 1.2.2. promo 2. В авторизованной зоне: 2.1. han-app создает автоматизированные уведомления: 2.1.1. new_message - в ситуации, когда пользователю было отправлено сообщение оператором bitrix24, а пользователь его не прочитал в течение 1 минуты. 2.2. han-app получает по API из приватной сети от сервисов, расположенных на других ВМ (не внутри контейнеров): 2.2.1. emergency 2.2.2. memo 2.2.3. news 2.2.4. ads 2.2.5. promo Само уведомление состоит из двух частей: 1. Для вывода на баннере на главном экране или в центре уведомлений 2. Для вывода на отдельной странице уведомления (только для тех, у которых есть опция перехода на страницу детального просмотра уведомления) Уведомление отправляет запрос по api в han-app, в котором указывает следующие поля "client_id" not-nullable, "notification_type_id" not-nullable integer, "date_expired" nullable date, "header": not-nullable string, "text": nullable string, "price": nullable number(10,2), "old price": nullable number(10,2), "details": nullable object (не присылается, если нет перехода на детальный просмотр) "deadline" nullable (может не быть срока.. если есть - визуализация на карточке "Срочно" "details_header" nullable string, "details_text" nullable string, "todo_header" nullable string, "todo_plan": nullable object (если присылается, то должна быть как минимум одна пара значений: номер пункта плана и текст) "todo_NN" not-nullable integer "todo_text" not-nullable string "button_done" boolean Если button_done = true, пользователю отображается кнопка "Выполнено". Нажатие на кнопку переводит уведомление в статус N с причиной "user_done" Han-app должен предоставлять API методы: - добавление уведомления пользователю - смена статуса уведомления пользователю на N API методы недоступны из интернета, только внутри приватной сети внутри ВМ. Каждое персонализированное уведомление имеет следующие атрибуты (это бизнес-атрибуты): 1. Статус - A(актуальное)\N(неактуальное). Если уведомление актуальное - оно отображается в ЛК клиента. Если неактуальное - не отображается. 2. Видимость - скрыто\нескрыто. Как работает: у пользователя на главном экране есть возможность скрыть уведомление, нажав на "крестик" на карточке уведомления. При нажатии на "крестик" уведомление скрывается из главного экрана (приложение должно сообщить об этом бэкенду, чтобы повторно не отображать на главном экране), но уведомление остается в центре уведомлений. Это применимо только для уведомлений авторизованных пользователей. В неавторизованной зоне пользователь не может закрыть уведомление (крестик не должен отображаться). 3. Прочтение - прочитано или нет. Уведомление прочитано - если пользователь переходил на страницу детального просмотра уведомления. Применяется только для уведомлений, у которых "countable": yes 4. Причина закрытия статуса (может быть "user_done" - если пользователь в приложении нажан на кнопку "Выполнено"; "expired" - если у уведомления была назначена date_expired; "cancelled" - если по АПИ пришел запрос на отмену уведомления) 5. Большинство смысловых уведомлений ## Центр уведомлений: На экране на колокольчике красным цветом выделяется счетчик непрочитанных сообщений (из числа "countable": yes) В центре уведомлений непрочитанные уведомления отмечаются красной точкой. Сортировка уведомлений осуществляется по принципу: countable: yes вверху, далее непрочитанные вверху\прочитанные внизу, далее по дате уведомления от новых к старым.