Установка и JavaScript API виджета
Подключение к HTML, Next.js, WordPress, Tilda и Bitrix. Команды open/close, события, consent и CSP.
Подключение к HTML, Next.js, WordPress, Tilda и Bitrix. Команды open/close, события, consent и CSP.
Скопируйте embed-код из карточки Widget-канала. Loader создаёт кнопку чата и подгружает основной bundle после загрузки страницы, при первом действии посетителя или при вызове JavaScript API.
Вставьте loader перед закрывающим тегом </body>. Замените YOUR_CHANNEL_ID на ID из карточки канала.
<script async src="https://novalead.ru/widget/YOUR_CHANNEL_ID"></script>Используйте next/script. Разместите Script в layout, который оборачивает только нужные маршруты. Для публичной части сайта удобно создать route group app/(public) и положить loader в app/(public)/layout.tsx. Next.js загрузит скрипт при первом открытии маршрута внутри этого layout и не будет загружать его повторно при переходах между вложенными страницами.
Виджет только на части маршрутов
Если переход из публичного layout в закрытую часть происходит без полной перезагрузки страницы, вызовите window.NovaLead.destroy() при размонтировании клиентской обёртки. Команда удалит DOM, socket, таймеры и обработчики виджета.
import Script from "next/script"
export default function PublicLayout({ children }: { children: React.ReactNode }) {
return (
<>
{children}
<Script
src="https://novalead.ru/widget/YOUR_CHANNEL_ID"
strategy="afterInteractive"
/>
</>
)
}Loader создаёт window.NovaLead сразу после выполнения embed-скрипта. Команды, вызванные до загрузки основного bundle, попадают в очередь и выполняются после инициализации.
window.NovaLead.open()
window.NovaLead.close()
window.NovaLead.sendMessage("Хочу уточнить тариф")
window.NovaLead.setTheme("dark")
window.NovaLead.identify(identityToken)
window.NovaLead.grantConsent()
window.NovaLead.destroy()Системную кнопку можно дополнить CTA в любом месте сайта. Optional chaining не даст ошибку, если пользователь нажмёт до выполнения loader.
<button type="button" onclick="window.NovaLead?.open()">
Задать вопрос
</button>Identity token создаётся на сервере вашего сайта и подписывается signing secret из настроек Widget-канала. Не добавляйте secret во frontend bundle и не подписывайте произвольные claims из request body.
Получите токен через защищённый endpoint своей системы и передайте его виджету до первого открытия.
Смена пользователя
При logout или смене аккаунта вызовите destroy() и заново подключите loader. Identify намеренно нельзя менять после открытия: так истории разных пользователей не смешиваются.
const response = await fetch("/api/novalead-identity")
const { token } = await response.json()
window.NovaLead.identify(token)
window.NovaLead.open()Если в настройках канала включено «Требовать согласие», виджет может открыться визуально, но не создаёт chat-сессию до grantConsent(). Вызовите команду из обработчика принятия cookies.
cookieBanner.onAccept(() => {
window.NovaLead?.grantConsent()
})Виджет отправляет CustomEvent в window. Подпишитесь на них для аналитики и логики интерфейса.
window.addEventListener("novalead:opened", () => {
console.info("Widget opened")
})
window.addEventListener("novalead:message-sent", (event) => {
console.info(event.detail.length)
})Если сайт использует CSP, добавьте источники NovaLead в существующие директивы. Не заменяйте ими текущую политику сайта.
script-src https://novalead.ru
connect-src https://api.novalead.ru wss://api.novalead.ru
img-src https://novalead.ru https://api.novalead.ru data: blob:
style-src 'unsafe-inline'
font-src data:
media-src https://novalead.ruLoader не работает
Актуальный embed загружается с https://novalead.ru/widget/..., а API и WebSocket работают через https://api.novalead.ru. Старый домен widget.novalead.ru использовать не нужно.
Можно вызвать open() сразу после embed-скрипта?
Да. Loader поставит команду в очередь, сразу начнёт загрузку основного bundle и откроет чат после инициализации.
Есть команда toggle()?
Нет. Используйте явные open() и close(), чтобы состояние интерфейса было предсказуемым.
Как заново создать виджет после destroy()?
Подключите loader повторно. Destroy удаляет текущий экземпляр, но сам по себе не выполняет повторную инициализацию.
Напишите в Telegram — обычно отвечаем в течение часа в рабочее время.