Динамические сообщения
Выбирайте сообщения из автоматизаций по условиям сайта: например, разное приветствие для нового и постоянного посетителя.
Основной раздел: Параметры инициализации.
Настройки по условиям сайта
Функция 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.