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 @@