303bca9081
Ключ разговора в localStorage теперь привязан к тому, кто вошёл: 'liderra_chat_id_u<id>' в кабинете, 'liderra_chat_id_guest' на лендинге. Смена вошедшего (вход/выход/вход под другим) очищает переписку на экране и заводит новый ключ — иначе следующий человек за тем же компьютером видел бы баланс и проекты прошлого клиента (окошко долбилось бы в чужой разговор и получало 404 от серверной проверки владельца).
52 lines
1.8 KiB
Vue
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>
|