Перейти к содержимому
  • Светлая
  • Тёмная
  • Авто

Установка виджета

Добавьте виджет VivoChat на страницы вашего сайта.

Перейдите в раздел:

Управление → Каналы связи

Создайте канал с типом: Виджет на сайт

Откройте настройки канала:

Управление → Каналы связи → [канал] → Опции

Скопируйте значение:

Идентификатор канала

WIDGET_ID — публичный идентификатор канала. Он используется для подключения виджета на сайт.

Вставьте код перед закрывающим тегом </body> на каждой странице, где должен отображаться чат. Скрипт загружается асинхронно и не блокирует рендеринг страницы. Повторное подключение скрипта не создаёт дубликат интерфейса.

<script defer>
(() => {
const loadScript = (callback) => {
const widgetId = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
const script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = `//widget.vivochat.ai/script/widget/${widgetId}`;
script.onload = callback;
const sourceScript = document.getElementsByTagName('script')[0];
sourceScript.parentNode.insertBefore(script, sourceScript);
}
const initWidget = () => {
const withIcon = true;
vivo_api.run({withIcon});
}
loadScript(initWidget)
})();
</script>
import { useEffect } from 'react';
const WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
const WIDGET_SRC = `//widget.vivochat.ai/script/widget/${WIDGET_ID}`;
declare global {
interface Window {
vivo_api?: {
run: (opts: { withIcon: boolean }) => void;
destroy: () => void;
};
}
}
export function App() {
useEffect(() => {
const script = document.createElement('script');
script.src = WIDGET_SRC;
script.async = true;
script.onload = () => window.vivo_api?.run({ withIcon: true });
document.body.appendChild(script);
return () => {
window.vivo_api?.destroy();
script.remove();
};
}, []);
return <>{/* ... */}</>;
}
'use client';
import Script from 'next/script';
const WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
export function VivoChat() {
useEffect(() => {
return () => {
window.vivo_api?.destroy();
};
}, []);
return (
<Script
src={`//widget.vivochat.ai/script/widget/${WIDGET_ID}`}
strategy="afterInteractive"
onLoad={() => window.vivo_api?.run({ withIcon: true })}
/>
);
}
<script setup lang="ts">
import { onMounted, onBeforeUnmount } from 'vue';
const WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
let script: HTMLScriptElement | null = null;
onMounted(() => {
script = document.createElement('script');
script.src = `//widget.vivochat.ai/script/widget/${WIDGET_ID}`;
script.async = true;
script.onload = () => window.vivo_api?.run({ withIcon: true });
document.body.appendChild(script);
});
onBeforeUnmount(() => {
window.vivo_api?.destroy();
script?.remove();
});
</script>
<script setup lang="ts">
const WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
onMounted(() => {
useHead({
script: [
{
src: `//widget.vivochat.ai/script/widget/${WIDGET_ID}`,
async: true,
tagPosition: 'bodyClose',
onload: () => window.vivo_api?.run({ withIcon: true }),
},
],
});
});
onBeforeUnmount(() => {
window.vivo_api?.destroy();
});
</script>
<script setup lang="ts">
const WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
const { onLoaded } = useScript(
`//widget.vivochat.ai/script/widget/${WIDGET_ID}`,
{ trigger: 'client' },
);
onLoaded(() => {
window.vivo_api?.run({ withIcon: true });
});
onBeforeUnmount(() => {
window.vivo_api?.destroy();
});
</script>
import { Component, OnInit, OnDestroy } from '@angular/core';
declare const vivo_api: {
run: (opts: { withIcon: boolean }) => void;
destroy: () => void;
};
@Component({
selector: 'app-root',
standalone: true,
template: `<!-- ... -->`,
})
export class AppComponent implements OnInit, OnDestroy {
private readonly WIDGET_ID = 'YOUR_WIDGET_ID'; // Replace with YOUR_WIDGET_ID
private script?: HTMLScriptElement;
ngOnInit(): void {
this.script = document.createElement('script');
this.script.src = `//widget.vivochat.ai/script/widget/${this.WIDGET_ID}`;
this.script.async = true;
this.script.onload = () => vivo_api.run({ withIcon: true });
document.body.appendChild(this.script);
}
ngOnDestroy(): void {
vivo_api?.destroy();
this.script?.remove();
}
}