a2e73a3d4d
- JivoWidget.vue: подгружает скрипт Jivo при заданном VITE_JIVO_WIDGET_ID (по образцу SmartCaptchaWidget); ключ пуст → ничего не грузит, виджет спит. - Смонтирован в AppLayout (клиентский портал). +VITE_JIVO_WIDGET_ID в vite-env.d.ts. - TDD: JivoWidget.spec (грузит при ключе / спит без) GREEN; AppLayout.spec 16/16; eslint 0. - Активируется вставкой VITE_JIVO_WIDGET_ID (твой ID канала Jivo). На прод не выкачено. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
31 lines
1.2 KiB
Vue
31 lines
1.2 KiB
Vue
<script setup lang="ts">
|
|
/**
|
|
* Виджет онлайн-чата JivoSite (G7-A). Когда задан VITE_JIVO_WIDGET_ID —
|
|
* на странице подгружается скрипт Jivo и появляется плавающая кнопка чата
|
|
* (Jivo рисует её сам). Ключ пуст (dev/CI/нет аккаунта) → ничего не грузим,
|
|
* виджет спит. По образцу SmartCaptchaWidget (условная подгрузка скрипта).
|
|
*/
|
|
import { onMounted } from 'vue';
|
|
|
|
const widgetId = import.meta.env.VITE_JIVO_WIDGET_ID ?? '';
|
|
const SCRIPT_ID = 'jivosite-widget-js';
|
|
|
|
function injectJivo(): void {
|
|
if (widgetId === '' || document.getElementById(SCRIPT_ID) !== null) {
|
|
return;
|
|
}
|
|
const script = document.createElement('script');
|
|
script.id = SCRIPT_ID;
|
|
script.src = `//code.jivosite.com/widget/${widgetId}`;
|
|
script.async = true;
|
|
document.head.appendChild(script);
|
|
}
|
|
|
|
onMounted(injectJivo);
|
|
</script>
|
|
|
|
<template>
|
|
<!-- Jivo рисует плавающую кнопку чата сам (в body); здесь — скрытый якорь. -->
|
|
<span class="jivo-widget-anchor" aria-hidden="true" style="display: none" />
|
|
</template>
|