diff --git a/app/public/chat-widget.js b/app/public/chat-widget.js
index 4d13becb..1d453f3c 100644
--- a/app/public/chat-widget.js
+++ b/app/public/chat-widget.js
@@ -13,7 +13,6 @@
if (window.__liderraChat) return;
window.__liderraChat = true;
- var KEY = 'liderra_chat_id';
var POLL_MS = 1000;
var POLL_LIMIT = 25; // 25 секунд — дальше сдаёмся и говорим честно
@@ -26,12 +25,29 @@
];
var FAILED = 'Что-то пошло не так, ответ не пришёл. Попробуйте ещё раз или напишите на support@liderra.ru.';
- var chatId = localStorage.getItem(KEY);
- if (!chatId || !/^[a-f0-9]{32}$/.test(chatId)) {
- chatId = (crypto.randomUUID ? crypto.randomUUID() : String(Math.random())).replace(/[^a-f0-9]/g, '').slice(0, 32).padEnd(32, '0');
- localStorage.setItem(KEY, chatId);
+ // Ключ разговора — СВОЙ на каждый вход: переписка вошедшего содержит его личные цифры
+ // (баланс, проекты), и следующий человек за тем же компьютером не должен их увидеть.
+ function keyFor(user) {
+ return user ? 'liderra_chat_id_u' + user : 'liderra_chat_id_guest';
}
+ function newChatId() {
+ return (crypto.randomUUID ? crypto.randomUUID() : String(Math.random()))
+ .replace(/[^a-f0-9]/g, '').slice(0, 32).padEnd(32, '0');
+ }
+
+ function chatIdFor(key) {
+ var id = localStorage.getItem(key);
+ if (!id || !/^[a-f0-9]{32}$/.test(id)) {
+ id = newChatId();
+ localStorage.setItem(key, id);
+ }
+ return id;
+ }
+
+ var KEY = keyFor(window.__liderraChatUser || null);
+ var chatId = chatIdFor(KEY);
+
var lastId = 0;
var busy = false;
@@ -225,4 +241,19 @@
input.value = '';
send(text);
};
+
+ // Скрипт грузится один раз за вкладку. Если в этой же вкладке вошли под другим клиентом
+ // (или вышли), окошко обязано забыть прежний разговор — иначе чужие цифры останутся
+ // на экране, а сервер будет отвечать 404 на чужой ключ.
+ window.__liderraChatSetUser = function (user) {
+ var next = keyFor(user || null);
+ if (next === KEY) return;
+
+ KEY = next;
+ chatId = chatIdFor(KEY);
+ lastId = 0;
+ busy = false;
+ while (body.firstChild) body.removeChild(body.firstChild);
+ if (panel.classList.contains('lch-open')) loadHistory();
+ };
})();
diff --git a/app/resources/js/components/support/ChatWidget.vue b/app/resources/js/components/support/ChatWidget.vue
index 8dfbe28a..5905fe1c 100644
--- a/app/resources/js/components/support/ChatWidget.vue
+++ b/app/resources/js/components/support/ChatWidget.vue
@@ -1,15 +1,29 @@