43 lines
2.0 KiB
JavaScript
43 lines
2.0 KiB
JavaScript
document.querySelectorAll('form[data-chat-coach]').forEach(form=>{
|
||
const input=form.querySelector('textarea[name="body"]');
|
||
if(!input)return;
|
||
const rapidWindowMs=2*60*1000;
|
||
const autoDismissMs=3000;
|
||
let dismissed=false;
|
||
let dismissTimer=null;
|
||
|
||
const readLastTwoMessageTimes=()=>Array.from(document.querySelectorAll('[data-chat-coach-own][data-chat-coach-at]'))
|
||
.map(node=>Number(node.dataset.chatCoachAt)*1000)
|
||
.filter(Number.isFinite)
|
||
.sort((a,b)=>a-b)
|
||
.slice(-2);
|
||
|
||
const hint=document.createElement('aside');
|
||
hint.className='chat-coach chat-coach-floating';hint.hidden=true;hint.setAttribute('role','status');hint.setAttribute('aria-live','polite');
|
||
hint.innerHTML='<span class="chat-coach-icon" aria-hidden="true">✦</span><div><b>برای دریافت پاسخ دقیقتر</b><p>لطفاً همه توضیحات و سؤالهای خود را در یک پیام کامل بنویسید و سپس ارسال کنید.</p></div><button type="button" data-chat-coach-dismiss aria-label="بستن راهنما" title="بستن">×</button>';
|
||
document.body.append(hint);
|
||
|
||
const dismiss=({focusInput=false}={})=>{
|
||
dismissed=true;
|
||
hint.hidden=true;
|
||
if(dismissTimer)clearTimeout(dismissTimer);
|
||
dismissTimer=null;
|
||
if(focusInput)input.focus();
|
||
};
|
||
const showTemporarily=()=>{
|
||
if(!hint.hidden)return;
|
||
hint.hidden=false;
|
||
dismissTimer=setTimeout(()=>dismiss(),autoDismissMs);
|
||
};
|
||
const detect=()=>{
|
||
const [previous,last]=readLastTwoMessageTimes();
|
||
const rapidPair=Number.isFinite(previous)&&Number.isFinite(last)&&last>=previous&&last-previous<=rapidWindowMs;
|
||
if(!dismissed&&rapidPair)showTemporarily();
|
||
else if(!rapidPair)hint.hidden=true;
|
||
};
|
||
hint.querySelector('[data-chat-coach-dismiss]').addEventListener('click',()=>dismiss({focusInput:true}));
|
||
const conversation=document.querySelector('[data-conversation]');
|
||
if(conversation)new MutationObserver(detect).observe(conversation,{childList:true,subtree:true});
|
||
detect();
|
||
});
|