mirror of
https://github.com/wasrusgen/zashita-brandbook.git
synced 2026-06-03 21:24:47 +00:00
feat: invite to cabinet flow + intake confirmation in cabinet chat
This commit is contained in:
parent
9c4e2df3cc
commit
6846c72566
111
mockup.html
111
mockup.html
@ -5045,6 +5045,29 @@ function _chatTransition(userText, intent) {
|
|||||||
|
|
||||||
/* ── HERO CHAT ── */
|
/* ── HERO CHAT ── */
|
||||||
|
|
||||||
|
// Приглашение в кабинет после первого ответа Елены
|
||||||
|
function _inviteToCabinet(userText) {
|
||||||
|
var msgs = document.getElementById('hchat-msgs');
|
||||||
|
if (!msgs) return;
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.className = 'hc-msg hc-elena';
|
||||||
|
div.innerHTML =
|
||||||
|
'<img class="hc-av" src="logos/elena-photo.jpg">' +
|
||||||
|
'<div class="hc-bubble" style="display:flex;flex-direction:column;gap:10px">' +
|
||||||
|
'<div>Давайте зафиксирую Ваш вопрос — так удобнее работать с документами и отслеживать статус.</div>' +
|
||||||
|
'<button class="btn btn-p" style="padding:8px 18px;font-size:13px;width:fit-content" ' +
|
||||||
|
'onclick="_goToCabinetWithContext()">📂 Перейти в кабинет →</button>' +
|
||||||
|
'</div>';
|
||||||
|
msgs.appendChild(div);
|
||||||
|
msgs.scrollTop = msgs.scrollHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _goToCabinetWithContext() {
|
||||||
|
go('start'); // переходим на главный экран
|
||||||
|
go('cabinet'); // затем в кабинет
|
||||||
|
setTimeout(function(){ initReturnChat(); }, 100);
|
||||||
|
}
|
||||||
|
|
||||||
var _hchatDone =false;
|
var _hchatDone =false;
|
||||||
|
|
||||||
var _HC_MESSAGES = [
|
var _HC_MESSAGES = [
|
||||||
@ -5484,7 +5507,10 @@ function heroChatSend() {
|
|||||||
_hcRemoveTyping();
|
_hcRemoveTyping();
|
||||||
var elenaText = apiReply || fallbackText;
|
var elenaText = apiReply || fallbackText;
|
||||||
_hcAddBubble(elenaText, false);
|
_hcAddBubble(elenaText, false);
|
||||||
setTimeout(function(){ _chatTransition(txt, intent); }, 1400);
|
// Сохраняем ситуацию для кабинета
|
||||||
|
try { sessionStorage.setItem('zashita_pending_intake', JSON.stringify({text: txt, intent: intent, ts: Date.now()})); } catch(e){}
|
||||||
|
// Приглашение в кабинет вместо автоперехода
|
||||||
|
setTimeout(function(){ _inviteToCabinet(txt); }, 900);
|
||||||
});
|
});
|
||||||
}, 400);
|
}, 400);
|
||||||
return;
|
return;
|
||||||
@ -5768,7 +5794,36 @@ function initReturnChat() {
|
|||||||
_renderRchatButtons({ urgentDL: urgentDL, hasContracts: _getContracts().length > 0,
|
_renderRchatButtons({ urgentDL: urgentDL, hasContracts: _getContracts().length > 0,
|
||||||
hasHistory: _chatHistory.length > 0, credits: credits, subPlan: subPlan });
|
hasHistory: _chatHistory.length > 0, credits: credits, subPlan: subPlan });
|
||||||
|
|
||||||
// ── Последовательность сообщений ──
|
// ── Проверяем незавершённый intake с главного экрана ──
|
||||||
|
var pendingIntake = null;
|
||||||
|
try { pendingIntake = JSON.parse(sessionStorage.getItem('zashita_pending_intake') || 'null'); } catch(e){}
|
||||||
|
if (pendingIntake && pendingIntake.text && (Date.now() - pendingIntake.ts < 600000)) {
|
||||||
|
// Клиент пришёл из главного чата — показываем подтверждение
|
||||||
|
sessionStorage.removeItem('zashita_pending_intake');
|
||||||
|
var intake = pendingIntake;
|
||||||
|
setTimeout(function(){
|
||||||
|
_rcAddTyping();
|
||||||
|
setTimeout(function(){
|
||||||
|
_rcRemoveTyping();
|
||||||
|
var quote = intake.text.length > 80 ? intake.text.slice(0, 80) + '...' : intake.text;
|
||||||
|
var confirmHtml =
|
||||||
|
'Я правильно Вас поняла:<br>' +
|
||||||
|
'<div style="background:var(--surf);border-left:3px solid var(--bg);border-radius:0 8px 8px 0;' +
|
||||||
|
'padding:8px 12px;margin:8px 0;font-style:italic;font-size:13px">' +
|
||||||
|
'«' + quote.replace(/</g,'<') + '»' +
|
||||||
|
'</div>' +
|
||||||
|
'<div style="display:flex;gap:8px;margin-top:10px">' +
|
||||||
|
'<button class="btn btn-p" style="padding:7px 16px;font-size:13px" ' +
|
||||||
|
'onclick="_confirmIntake(\'' + intake.intent + '\',\'' + quote.replace(/'/g,"\\'").replace(/"/g,""") + '\')">✅ Да, всё верно</button>' +
|
||||||
|
'<button class="svc-btn-detail" onclick="_clarifyIntake()">✏️ Уточнить</button>' +
|
||||||
|
'</div>';
|
||||||
|
_rcAddBubble(confirmHtml, false, true);
|
||||||
|
}, 800);
|
||||||
|
}, 300);
|
||||||
|
return; // не показываем стандартное приветствие
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Стандартная последовательность сообщений ──
|
||||||
var delay = 0;
|
var delay = 0;
|
||||||
|
|
||||||
// msg 1: greeting
|
// msg 1: greeting
|
||||||
@ -6506,6 +6561,58 @@ function _getElenaCtxReply(intent, dl) {
|
|||||||
return 'Продолжаем по сроку «' + name + '». Что именно хотите уточнить?';
|
return 'Продолжаем по сроку «' + name + '». Что именно хотите уточнить?';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _confirmIntake(intent, quote) {
|
||||||
|
// Клиент подтвердил ситуацию → фиксируем и начинаем работу
|
||||||
|
var msgs = document.getElementById('rchat-msgs');
|
||||||
|
if (!msgs) return;
|
||||||
|
|
||||||
|
// Пузырь клиента
|
||||||
|
var uDiv = document.createElement('div');
|
||||||
|
uDiv.className = 'hc-msg hc-user';
|
||||||
|
uDiv.innerHTML = '<div class="hc-bubble">Да, всё верно</div>';
|
||||||
|
msgs.appendChild(uDiv);
|
||||||
|
|
||||||
|
// Сохраняем в историю
|
||||||
|
_chatHistory.push({role: 'user', content: quote});
|
||||||
|
_saveHistory();
|
||||||
|
|
||||||
|
// Елена: фиксирует дело и спрашивает про договор
|
||||||
|
setTimeout(function(){
|
||||||
|
_rcAddTyping();
|
||||||
|
var ctx = quote;
|
||||||
|
_elenaApi('Клиент подтвердил ситуацию: ' + ctx + '. Зафикисруй дело и спроси что нужно для помощи.',
|
||||||
|
intent,
|
||||||
|
function(apiReply, apiActions) {
|
||||||
|
_rcRemoveTyping();
|
||||||
|
var reply = apiReply || 'Хорошо, зафиксировала. Есть ли у Вас договор на руках? Если загрузите — смогу сразу оценить риски и предложить конкретные действия.';
|
||||||
|
_chatHistory.push({role: 'assistant', content: reply});
|
||||||
|
_saveHistory();
|
||||||
|
_rcAddBubble(reply, false);
|
||||||
|
if (apiActions && apiActions.length) {
|
||||||
|
var m = document.getElementById('rchat-msgs');
|
||||||
|
if (m) _renderElenaActions(apiActions, m);
|
||||||
|
}
|
||||||
|
_rcShowControls();
|
||||||
|
|
||||||
|
// Обновляем досье
|
||||||
|
_updateDossier({ facts: ['Зафиксировано дело: ' + ctx] });
|
||||||
|
});
|
||||||
|
}, 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _clarifyIntake() {
|
||||||
|
// Клиент хочет уточнить
|
||||||
|
var msgs = document.getElementById('rchat-msgs');
|
||||||
|
if (!msgs) return;
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.className = 'hc-msg hc-elena';
|
||||||
|
div.innerHTML = '<img class="hc-av" src="logos/elena-photo.jpg">' +
|
||||||
|
'<div class="hc-bubble">Уточните, пожалуйста — опишите ситуацию своими словами.</div>';
|
||||||
|
msgs.appendChild(div);
|
||||||
|
msgs.scrollTop = msgs.scrollHeight;
|
||||||
|
_rcShowControls();
|
||||||
|
}
|
||||||
|
|
||||||
function retChatSend() {
|
function retChatSend() {
|
||||||
var inp = document.getElementById('rchat-inp');
|
var inp = document.getElementById('rchat-inp');
|
||||||
if (!inp) return;
|
if (!inp) return;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user