Condition - Динамические условия для срабатывания сообщения 
Данный документ описывает все доступные поля, которые можно использовать в условиях для отображения сообщений с использованием JsonLogic.
JsonLogic 
JsonLogic — это язык для создания переносимых, сериализуемых правил, которые можно выполнять в различных языках программирования. В контексте условий показа сообщений, JsonLogic позволяет создавать сложные условия, которые можно легко передавать между клиентом и сервером в формате JSON.
Основные особенности JsonLogic:
- Правила представлены в виде JSON объектов
 - Поддерживает логические операторы (
and,or,not), операторы сравнения (>,>=,<,<=,==,!=), арифметические операции и другие функции - Позволяет обращаться к данным через оператор 
var - Поддерживает вложенные правила для создания сложных условий
 
Для доступа к данным в контексте используется оператор var. Например, {"var": "app.version"} извлекает значение версии приложения из контекста условия.
Более подробную информацию о синтаксисе и возможностях JsonLogic можно найти на официальном сайте: http://jsonlogic.com
Содержание 
- Condition - Динамические условия для срабатывания сообщения
- JsonLogic
 - Содержание
 - Обзор
 - Структура контекста условий
 - Event Properties
 - Context Properties
 - Interactions
 - Примеры использования JsonLogic
- Пример 1: Показать сообщение только подписчикам на iOS
 - Пример 2: Показать сообщение только в темной теме с достаточной шириной экрана
 - Пример 3: Показать сообщение только если разрешение на камеру предоставлено
 - Пример 4: Показать сообщение только если пользователь не видел сообщение сегодня и уведомления отключены
 - Пример 5: Сложное условие с версией приложения и событиями (из примера)
 
 
 
Обзор 
Контекст условий предоставляет богатый набор данных, которые можно использовать для создания условной логики отображения сообщений. Он содержит информацию о текущем событии, состоянии приложения, профиле пользователя, настройках устройства и предыдущих взаимодействиях.
Структура контекста условий 
{
  'event': {
    ...properties,
    'event_name': event,
  },
  'palette': palette.convert().toJson(),
  'app': application.toJson(),
  'user': user.toJson(),
  'subscription': subscription.toJson(),
  'permissions': permissions.toJson(),
  'media': media.toJson(),
  'feature_flags': featureFlags,
  'config': config,
  'theme': theme.convert().toJson(),
  'interactions': {
    'last_seen': context.interactions.seenEntries.lastOrNull?.toJson(),
    'seen_entries': context.interactions.seenEntries.map((e) => e.toJson()).toList(),
  }
};Event Properties 
Объект event содержит информацию о событии, которое привело к оценке условия:
| Поле | Тип | Описание | 
|---|---|---|
event_name | String | Название выполненного события | 
properties | Object | Дополнительные свойства, переданные вместе с событием | 
Context Properties 
Palette 
Объект palette содержит переменные цветов для разных тем:
| Поле | Тип | Описание | 
|---|---|---|
brand | Object | Цветовые переменные бренда | 
light | Object | Цветовые переменные светлой темы | 
dark | Object | Цветовые переменные темной темы | 
App 
Объект app предоставляет информацию о приложении:
| Поле | Тип | Описание | 
|---|---|---|
theme | String | Текущая тема приложения | 
language | String | Текущий язык приложения | 
version | String | Версия приложения | 
platform | String | Платформа, на которой работает приложение | 
divkit_version | String | Текущая версия DivKit | 
widgets_version | String | Текущая версия Widgets | 
build_type | String | Тип сборки (Production, ReleaseCandidate и т.д.) | 
build_mode | String | Режим сборки (release, profile или debug) | 
api_base_url | String | Базовый URL для API-запросов | 
has_connection | Boolean | Указывает, имеет ли приложение активное интернет-соединение | 
User 
Объект user содержит информацию о профиле пользователя:
| Поле | Тип | Описание | 
|---|---|---|
is_logged_in | Boolean | Указывает, авторизован ли пользователь | 
id | String | ID пользователя (null, если не авторизован) | 
name | String | Имя пользователя (null, если не задано) | 
avatar | String | URL аватара пользователя (null, если не задан) | 
birthday | DateTime | Дата рождения пользователя (null, если не задана) | 
is_adult | Boolean | Указывает, является ли пользователь совершеннолетним (null, если неизвестно) | 
has_referral_id | Boolean | Указывает, имеет ли пользователь реферальный ID (null, если неизвестно) | 
contacts | Object | Карта контактов пользователя (пары ключ-значение) | 
Subscription 
Объект subscription предоставляет информацию о статусе подписки пользователя:
| Поле | Тип | Описание | 
|---|---|---|
is_active | Boolean | Указывает, имеет ли пользователь активную подписку | 
has_been_subscribed | Boolean | Указывает, была ли у пользователя подписка в прошлом | 
is_external | Boolean | Указывает, управляется ли подписка извне (null, если не применимо) | 
tariff | Object | Информация о тарифе подписки (null, если нет подписки) | 
Permissions 
Объект permissions содержит статус различных разрешений устройства:
| Поле | Тип | Описание | 
|---|---|---|
calendar | String | доступ к календарю | 
camera | String | доступ к камере | 
contacts | String | доступ к контактам | 
media_library | String | доступ к медиабиблиотеке | 
microphone | String | доступ к микрофону | 
photos | String | доступ к фотографиям | 
photos_add_only | String | разрешение только на добавление фотографий | 
reminders | String | доступ к напоминаниям | 
sensors | String | доступ к сенсорам | 
sms | String | доступ к SMS | 
speech | String | распознавание речи | 
storage | String | доступ к хранилищу | 
ignore_battery_optimizations | String | игнорирование оптимизации батареи | 
notification | String | уведомления | 
access_media_location | String | доступ к местоположению медиафайлов | 
activity_recognition | String | распознавание активности | 
manage_external_storage | String | управление внешним хранилищем | 
system_alert_window | String | системные всплывающие окна | 
request_install_packages | String | установку пакетов | 
app_tracking_transparency | String | прозрачность отслеживания приложений | 
critical_alerts | String | критические оповещения | 
access_notification_policy | String | доступ к политике уведомлений | 
bluetooth_scan | String | Bluetooth-сканирование | 
bluetooth_advertise | String | рекламу Bluetooth | 
bluetooth_connect | String | подключение Bluetooth | 
nearby_wifi_devices | String | доступ к ближайшим Wi-Fi устройствам | 
videos | String | доступ к видео | 
audio | String | доступ к аудио | 
schedule_exact_alarm | String | планирование точных будильников | 
sensors_always | String | постоянный доступ к сенсорам | 
calendar_write_only | String | запись в календарь | 
calendar_full_access | String | полный доступ к календарю | 
assistant | String | доступ к помощнику | 
background_refresh | String | фоновое обновление | 
Все значения разрешений по умолчанию установлены как "undefined" и обычно могут быть одним из:
"granted"- Разрешение предоставлено"denied"- Разрешение не предоставлено, нужно запросить"permanently_denied"- Разрешение явно отклонено, разрешение предоставляется только через настройки системы"restricted"- Разрешение ограничено на уровне системы"limited"- Разрешение предоставлено с ограничениями"undefined"- Статус разрешения неизвестен, это статус разрешения за которыми не следит приложение
Media 
Объект media предоставляет информацию о дисплее устройства и макете:
| Поле | Тип | Описание | 
|---|---|---|
breakpoint | String | Текущая контрольная точка для адаптивного макета | 
orientation | String | Ориентация устройства (например, "portrait", "landscape") | 
container_width | Number | Ширина контейнера в логических пикселях | 
padding | Object | Значения отступов контейнера | 
view_padding | Object | Значения отступов вида (учитывает элементы системного интерфейса) | 
density | String | Плотность экрана в виде строкового значения целого числа | 
Feature Flags 
feature_flags — это карта флагов функций, которые управляют поведением приложения:
{
  "feature_name": true,
  "another_feature": false,
  // Дополнительные флаги функций
}Где value может быть только типа boolean (true/false), что позволяет включать или отключать определенные функции приложения.
Config 
config — это карта настроек конфигурации для приложения:
{
  "config_key": value,
  // Дополнительные настройки конфигурации
}Где value может быть любого типа (boolean, string, number, object) в зависимости от реализации конфигурации.
Все ключи в объекте config соответствуют значениям из Remote Config с префиксом widgets_config__ (при этом сам префикс в ключах объекта config отсутствует). Для просмотра полного списка доступных ключей и их значений необходимо обратиться к настройкам Remote Config в Firebase консоли.
Theme 
Объект theme содержит цветовые переменные, связанные с темой:
| Поле | Тип | Описание | 
|---|---|---|
colors | Object | Цветовые переменные, организованные по темам | 
colors.brand | Object | Цветовые переменные бренда | 
colors.light | Object | Цветовые переменные светлой темы | 
colors.dark | Object | Цветовые переменные темной темы | 
Interactions 
Объект interactions предоставляет данные о взаимодействии пользователя с сообщениями:
| Поле | Тип | Описание | 
|---|---|---|
last_seen | Object | Информация о последнем просмотренном сообщении (null, если нет) | 
seen_entries | Array | Список всех просмотренных сообщений | 
Каждая запись просмотра содержит информацию о том, когда и как пользователь взаимодействовал с предыдущим сообщением.
Примеры использования JsonLogic 
JsonLogic позволяет создавать сложные условия для отображения сообщений. Вот несколько примеров:
Пример 1: Показать сообщение только подписчикам на iOS 
{
  "and": [
    {
      "==": [
        { "var": "subscription.is_active" },
        true
      ]
    },
    {
      "==": [
        { "var": "app.platform" },
        "ios"
      ]
    }
  ]
}Пример 2: Показать сообщение только в темной теме с достаточной шириной экрана 
{
  "and": [
    {
      "==": [
        { "var": "app.theme" },
        "dark"
      ]
    },
    {
      ">": [
        { "var": "media.container_width" },
        375
      ]
    }
  ]
}Пример 3: Показать сообщение только если разрешение на камеру предоставлено 
{
  "==": [
    { "var": "permissions.camera" },
    "granted"
  ]
}Пример 4: Показать сообщение только если пользователь не видел сообщение сегодня и уведомления отключены 
{
  "and": [
    {
      "or": [
        {
          "==": [
            { "var": "interactions.last_seen" },
            null
          ]
        },
        {
          "<": [
            {
              "date.truncate": [
                { "var": "interactions.last_seen.date" },
                "days"
              ]
            },
            {
              "date.truncate": [
                { "now": [] },
                "days"
              ]
            }
          ]
        }
      ]
    },
    {
      "==": [
        { "var": "permissions.notification" },
        "denied"
      ]
    }
  ]
}Это условие показывает сообщение только если:
- Пользователь либо никогда не видел сообщение (interactions.last_seen равен null), ИЛИ видел его в предыдущие дни (не сегодня) - используется функция 
date.truncateдля сравнения даты последнего просмотра с текущей датой, обрезанных до дней - И при этом разрешение на уведомления находится в статусе "denied" (пользователь отключил уведомления)
 
Данный пример соответствует реальному использованию в приложении для напоминания пользователям о важности включения уведомлений после определенных действий (например, отправки отзыва или закрытия достижений), показывая всплывающее окно не чаще одного раза в день.
Пример 5: Сложное условие с версией приложения и событиями (из примера) 
{
  "and": [
    {
      ">=": [
        { "var": "app.version" },
        "5.23.0"
      ]
    },
    {
      "or": [
        {
          "!=": [
            { "var": "event.event_name" },
            "first_feedback_sent"
          ]
        },
        {
          "!=": [
            { "var": "permissions.notification" },
            "denied"
          ]
        }
      ]
    }
  ]
}Это условие показывает сообщение только если:
- Версия приложения не ниже 5.23.0, И
 - Либо событие не является "first_feedback_sent", либо разрешение на уведомления не в статусе "denied"