События виджета
Задавайте callbacks при инициализации, а обработчики событий страницы подключайте до действия, результат которого нужно получить.
Функции обратного вызова и события
В SenlerWidget.init доступны:
contextProvider()— синхронно возвращает постоянный контекст страницы; Promise не поддерживается;resolveRuntime(context)— синхронно выбирает настройки по состоянию посетителя и диалогов;onCollapse(detail)— сообщает о нажатии кнопкиshell.collapse_button.onReady(detail)— один раз сообщает об успешной инициализации и авторизации чата.detailсодержитchannel_id,display_mode,button_only. Дляbutton_onlyэто готовность кнопки без загрузки чата.onError(error)— сообщает о первой ошибке запуска экземпляра; ошибки отправки сообщений и переподключения после готовности сюда не поступают.
SenlerWidget.init({
channel_id: "CHANNEL_ID",
onReady(detail) {
console.log("Виджет готов", detail);
},
onError(error) {
console.error(error.code, error.message, error.retryable);
},
});
error — объект Error с именем SenlerWidgetInitializationError. Код code: invalid_config, iframe_load_failed, startup_failed, authentication_failed, init_failed, init_timeout или protocol_mismatch. retryable показывает, имеет ли смысл повторить запуск без изменения конфигурации. Если результат запуска не получен за 90 секунд, приходит init_timeout; конкретная ошибка может прийти раньше. При некорректной конфигурации init также синхронно выбрасывает ту же ошибку.
При прямом вызове init существующие повторы загрузки продолжаются после onError: если запуск восстановится, следом придёт onReady. Каждый callback вызывается не более одного раза на экземпляр. После destroy() или замены экземпляра через init его отложенные callbacks подавляются. Исключение внутри callback не прерывает работу виджета.
В SDK createSenlerWidgetSession(...).ready ждёт готовности чата. При первой ошибке Promise отклоняется и экземпляр освобождается; для повтора создайте новую сессию или измените retryKey в React. Уничтожение ожидающей сессии отклоняет Promise с AbortError. Ошибка загрузки самого скрипта отклоняет Promise загрузчика/сессии до вызова init.
Кнопки customActions обрабатываются через handler каждого действия, а не через общий callback.
События страницы
Событие window | Когда приходит |
|---|---|
senler-widget:collapse-request | Пользователь нажал кнопку сворачивания. |
senler-widget:mobile-edge-swipe | Пользователь сделал разрешённый свайп от левого края. |
senler-widget:credit-purchase-requested | Пользователь запросил покупку дополнительных кредитов; в detail находятся channel_id и lead_id. |
senler-widget:runtime-message-result | Runtime-сообщение принято, завершено или завершилось ошибкой. |
senler-widget:stage | Изменился диагностический этап загрузки, соединения, отправки, истории или файла. Используйте для наблюдаемости, не для бизнес-логики. |
У senler-widget:stage в detail всегда есть area, phase и timestamp; дополнительно могут прийти attempt, duration_ms и итог result: "success" | "error" | "timeout".
area | Возможные phase |
|---|---|
loader | instance-created, iframe-created, iframe-loading, iframe-loaded, app-mounted, ready-timeout, error |
bootstrap | loading, success, error, timeout, interactive |
dialogs | idle, loading, refetching, success, empty, error |
history | idle, loading, refetching, loading-more, success, empty, error |
realtime | disabled, token-loading, connecting, connected, reconnecting, disconnected, error |
message | optimistic, sending, queued, sent, failed, waiting, typing, streaming, done, error |
upload | requesting-url, uploading, confirming, ready, error |
Это диагностический поток, а не конечный автомат бизнес-процесса. Набор этапов может расширяться, а отдельные фазы — повторяться или пропускаться, поэтому бизнес-сценарий не должен зависеть от их конкретной последовательности.
Обработку крестика и свайпа смотрите во встраивании в контейнер, а статусы отправки — в отправке сообщений с сайта.