Files
portal/app/resources/js/components/support/ChatWidget.vue
T
Дмитрий 303bca9081 fix(bot): свой разговор на каждый вход — чужие цифры не остаются в браузере
Ключ разговора в localStorage теперь привязан к тому, кто вошёл:
'liderra_chat_id_u<id>' в кабинете, 'liderra_chat_id_guest' на лендинге.
Смена вошедшего (вход/выход/вход под другим) очищает переписку на экране
и заводит новый ключ — иначе следующий человек за тем же компьютером
видел бы баланс и проекты прошлого клиента (окошко долбилось бы в чужой
разговор и получало 404 от серверной проверки владельца).
2026-07-13 12:11:48 +03:00

52 lines
1.8 KiB
Vue

<script setup lang="ts">
/**
* Окошко чата Лидерры. Сам чат — /chat-widget.js (один файл, без сборки): тот же скрипт
* работает и на лендинге. Здесь — подключение и передача того, КТО вошёл: по этому id окошко
* заводит отдельный разговор. Личные цифры одного клиента не должны попасть другому
* за тем же компьютером.
*/
import { onMounted, watch } from 'vue';
import { storeToRefs } from 'pinia';
import { useAuthStore } from '../../stores/auth';
declare global {
interface Window {
__liderraChatUser?: number | null;
__liderraChatSetUser?: (user: number | null) => void;
}
}
const SCRIPT_ID = 'liderra-chat-widget-js';
const { user } = storeToRefs(useAuthStore());
function injectChat(): void {
window.__liderraChatUser = user.value?.id ?? null;
if (document.getElementById(SCRIPT_ID) !== null) {
window.__liderraChatSetUser?.(window.__liderraChatUser);
return;
}
const script = document.createElement('script');
script.id = SCRIPT_ID;
script.src = '/chat-widget.js';
script.defer = true;
document.head.appendChild(script);
}
onMounted(injectChat);
// Вошли под другим клиентом в той же вкладке — окошко забывает прежний разговор.
watch(
() => user.value?.id ?? null,
(id) => {
window.__liderraChatUser = id;
window.__liderraChatSetUser?.(id);
},
);
</script>
<template>
<!-- Кнопку и окошко рисует /chat-widget.js прямо в body; здесь скрытый якорь. -->
<span class="chat-widget-anchor" aria-hidden="true" style="display: none" />
</template>