enВойти в Senler

Динамические сообщения

Выбирайте сообщения из автоматизаций по условиям сайта: например, разное приветствие для нового и постоянного посетителя.

Основной раздел: Параметры инициализации.

Настройки по условиям сайта

Функция resolveRuntime(context) в init позволяет выбирать приветствие и оформление с учётом посетителя и страницы сайта. Условия задаются в коде сайта, а в настройках канала вы разрешаете сообщения, между которыми можно выбирать.

Разные сообщения для первого и повторного обращения

В этом примере посетитель без диалогов увидит одно сообщение, а посетитель с диалогами — другое. Автоматизации могут быть разными. Обе пары «автоматизация + шаг» сначала разрешите в настройках приветствия, затем подставьте их настоящие ID:

const firstContact = {
  mode: "automation_message",
  automation_id: "FIRST_AUTOMATION_ID",
  node_id: "FIRST_MESSAGE_STEP_UUID",
};
const returningContact = {
  mode: "automation_message",
  automation_id: "RETURNING_AUTOMATION_ID",
  node_id: "RETURNING_MESSAGE_STEP_UUID",
};

SenlerWidget.init({
  channel_id: "YOUR_CHANNEL_ID",
  resolveRuntime(context) {
    return {
      welcome: context.dialogs.count === 0 ? firstContact : returningContact,
    };
  },
});

Ветка для посетителя с диалогами выбирает приветствие его следующего нового чата, а не повторно приветствует его в открытой переписке. Для узнавания одного аккаунта на разных устройствах нужна подписанная привязка пользователя; анонимная история относится к браузерной сессии.

Условия страницы и данные сайта

Можно учитывать URL, статус пользователя в вашем сервисе и другие доступные сайту данные. Например, посетителю страницы тарифов без диалогов показать сообщение о выборе тарифа, а остальным оставить базовое приветствие:

SenlerWidget.init({
  channel_id: "YOUR_CHANNEL_ID",
  resolveRuntime(context) {
    if (location.pathname === "/pricing" && context.dialogs.count === 0) {
      return {
        welcome: {
          mode: "automation_message",
          automation_id: "AUTOMATION_ID",
          node_id: "MESSAGE_STEP_UUID",
        },
      };
    }
    return {};
  },
});

// После перехода внутри сайта без перезагрузки страницы:
SenlerWidget.refreshRuntime();

Сообщение сначала нужно разрешить в настройках приветствия. Данные вашего сервиса подготовьте до расчёта; context не содержит статус подписки или покупки на вашем сайте. После изменения таких данных вызовите refreshRuntime(). Выбор в коде сайта не даёт дополнительных прав посетителю.

Данные посетителя и порядок применения

context содержит только сведения о текущем посетителе этого канала:

  • channelId: ID канала;
  • visitor.isNew: запись посетителя создана при этой инициализации, а не признак отсутствия диалогов;
  • visitor.identityVerified: сервер подтвердил идентичность посетителя;
  • dialogs.count: общее число его диалогов в канале, независимо от поиска и открытой страницы списка;
  • currentDialog: { id } выбранного настоящего диалога либо null в новом чате до начала общения и при отсутствии выбора, даже если другие диалоги есть.

Функция вызывается после инициализации, до показа приветствия, и повторно при изменении этих данных. Переход по страницам сайта сам по себе их не меняет: для него и других условий сайта вызывайте refreshRuntime().

Контекст доступен только для чтения. dialogs.count === 0 снова выполняется после удаления всех диалогов. visitor.isNew относится к созданию записи в виджете при текущей инициализации, а не к первому посещению самого сайта.

Вернуть можно только welcome, lang, theme_mode, border_radius и shell. Каждый результат заменяет предыдущее переопределение этой функции; пропущенные поля берутся из текущих базовых настроек, включая init и updateRuntime. Пустой объект {} возвращает базовые настройки, а welcome: null явно выбирает приветствие из настроек канала.

Приоритет: настройки канала → init → updateRuntime → результат resolveRuntime. Вложенный shell наследуется по полям.

Для этой настройки загрузчик и приложение виджета должны поддерживать resolveRuntime. При подключении через SDK также нужны метод refreshRuntime и типы SenlerWidgetRuntimeContext, SenlerWidgetResolvedRuntimeConfig, SenlerWidgetRuntimeResolver: одной поддержки updateRuntime недостаточно. В React сохраняйте стабильный config, читайте меняющиеся условия через ref и вызывайте api.refreshRuntime() после их обновления.

Функция должна работать синхронно и возвращать объект, не Promise. Данные сайта подготовьте заранее. При исключении, неверном результате или отсутствии ответа виджет использует базовые настройки и пишет предупреждение в консоль. Без resolveRuntime и в режиме button_only вызов refreshRuntime() ничего не меняет. Эта функция не предназначена для отправки сообщений или переключения диалогов: такие команды вызывайте отдельно через Public API.