132 lines
7.4 KiB
JavaScript
132 lines
7.4 KiB
JavaScript
/**
|
|
* WEVAL Feature Tracker + NPS Popup + CSAT autolink
|
|
* Zero external deps. Zero cookies. sessionStorage only.
|
|
* Auto-injects: track current page as feature + show NPS popup after 10 queries
|
|
*/
|
|
(function(){
|
|
if(window.__WEVAL_TRACKER_LOADED__) return;
|
|
window.__WEVAL_TRACKER_LOADED__ = true;
|
|
|
|
var path = window.location.pathname.replace(/^\/+|\.html$/g,'').replace(/\//g,'_') || 'index';
|
|
var feature = path.toLowerCase();
|
|
var user = (function(){
|
|
try { return localStorage.getItem('weval_user') || 'anonymous'; } catch(e) { return 'anonymous'; }
|
|
})();
|
|
var sessionId = (function(){
|
|
try {
|
|
var s = sessionStorage.getItem('weval_session_id');
|
|
if(!s) { s = 's_' + Date.now() + '_' + Math.random().toString(36).slice(2,8); sessionStorage.setItem('weval_session_id', s); }
|
|
return s;
|
|
} catch(e) { return 's_na'; }
|
|
})();
|
|
|
|
// 1. Track feature once per session per page
|
|
try {
|
|
var key = 'weval_tracked_' + feature;
|
|
if(!sessionStorage.getItem(key)) {
|
|
sessionStorage.setItem(key, '1');
|
|
var fd = new FormData();
|
|
fd.append('action','track'); fd.append('feature',feature); fd.append('user',user); fd.append('session_id',sessionId);
|
|
fetch('/api/feature-adoption.php?action=track', {method:'POST', body:fd}).catch(function(){});
|
|
}
|
|
} catch(e){}
|
|
|
|
// 2. Query counter for NPS popup trigger (only on wevia-master + all-ia-hub + wtp)
|
|
var qCounterPages = ['wevia-master','all-ia-hub','weval-technology-platform','wevia-orchestrator'];
|
|
if(qCounterPages.indexOf(feature) >= 0) {
|
|
try {
|
|
var qKey = 'weval_query_count';
|
|
var npsShown = localStorage.getItem('weval_nps_shown_30d');
|
|
var now = Date.now();
|
|
// NPS not shown in last 30d
|
|
if(!npsShown || (now - parseInt(npsShown)) > 30*86400000) {
|
|
// Count queries - increment on every significant interaction
|
|
document.addEventListener('click', function(e){
|
|
var tgt = e.target;
|
|
// Count clicks on buttons/send actions only
|
|
if(tgt.matches && (tgt.matches('button, [type="submit"], .btn, .send-button, [onclick*="send"]') || (tgt.closest && tgt.closest('button, .btn')))) {
|
|
var count = parseInt(localStorage.getItem(qKey) || '0') + 1;
|
|
localStorage.setItem(qKey, count);
|
|
if(count >= 10 && !document.getElementById('weval-nps-popup-el')) {
|
|
showNPSPopup();
|
|
}
|
|
}
|
|
}, true);
|
|
}
|
|
} catch(e){}
|
|
}
|
|
|
|
// 3. NPS Popup injection
|
|
function showNPSPopup() {
|
|
var pop = document.createElement('div');
|
|
pop.id = 'weval-nps-popup-el';
|
|
pop.innerHTML = [
|
|
'<div id="weval-nps-overlay" style="position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:99999;display:flex;align-items:center;justify-content:center;backdrop-filter:blur(4px);font-family:system-ui,sans-serif">',
|
|
'<div style="background:linear-gradient(135deg,#0f172a,#1e293b);border:1px solid #334a7a;border-radius:12px;padding:28px;max-width:480px;width:90%;box-shadow:0 20px 60px rgba(0,0,0,.5)">',
|
|
'<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:16px">',
|
|
'<h2 style="margin:0;color:#e2e8f0;font-size:19px">Comment notez-vous WEVAL ?</h2>',
|
|
'<button id="weval-nps-close" style="background:none;border:none;color:#64748b;font-size:22px;cursor:pointer;line-height:1" aria-label="Fermer">×</button>',
|
|
'</div>',
|
|
'<p style="margin:0 0 18px 0;color:#94a3b8;font-size:13.5px;line-height:1.5">Sur une échelle de 0 à 10, recommanderiez-vous WEVAL à un collègue ?</p>',
|
|
'<div id="weval-nps-scores" style="display:grid;grid-template-columns:repeat(11,1fr);gap:4px;margin-bottom:16px"></div>',
|
|
'<textarea id="weval-nps-comment" placeholder="Commentaire optionnel..." style="width:100%;padding:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#e2e8f0;font-size:13px;font-family:inherit;resize:vertical;min-height:60px;box-sizing:border-box"></textarea>',
|
|
'<div id="weval-nps-thanks" style="display:none;margin-top:14px;padding:10px;background:rgba(16,185,129,.12);border:1px solid rgba(16,185,129,.3);border-radius:6px;color:#6ee7b7;font-size:13px;text-align:center">Merci pour votre retour !</div>',
|
|
'<div style="margin-top:14px;display:flex;gap:8px;justify-content:flex-end">',
|
|
'<button id="weval-nps-later" style="padding:8px 14px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);color:#94a3b8;border-radius:6px;cursor:pointer;font-size:12px">Plus tard</button>',
|
|
'<button id="weval-nps-submit" disabled style="padding:8px 14px;background:#3b82f6;border:none;color:#fff;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;opacity:.5">Envoyer</button>',
|
|
'</div></div></div>'
|
|
].join('');
|
|
document.body.appendChild(pop);
|
|
// Score buttons 0-10
|
|
var scoresDiv = document.getElementById('weval-nps-scores');
|
|
var selectedScore = null;
|
|
for(var i=0;i<=10;i++){
|
|
(function(score){
|
|
var b = document.createElement('button');
|
|
b.textContent = score;
|
|
b.style.cssText = 'padding:10px 4px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);color:#cbd5e1;border-radius:6px;cursor:pointer;font-size:13px;font-weight:600;transition:all .12s';
|
|
b.onmouseover = function(){ if(selectedScore!==score){ this.style.background='rgba(59,130,246,.15)'; this.style.borderColor='#3b82f6'; } };
|
|
b.onmouseout = function(){ if(selectedScore!==score){ this.style.background='rgba(255,255,255,.05)'; this.style.borderColor='rgba(255,255,255,.12)'; } };
|
|
b.onclick = function(){
|
|
selectedScore = score;
|
|
Array.from(scoresDiv.children).forEach(function(el){ el.style.background='rgba(255,255,255,.05)'; el.style.borderColor='rgba(255,255,255,.12)'; el.style.color='#cbd5e1'; });
|
|
this.style.background = score>=9?'#10b981':(score>=7?'#3b82f6':'#ef4444');
|
|
this.style.borderColor = 'transparent';
|
|
this.style.color = '#fff';
|
|
var sb = document.getElementById('weval-nps-submit');
|
|
sb.disabled = false; sb.style.opacity = '1';
|
|
};
|
|
scoresDiv.appendChild(b);
|
|
})(i);
|
|
}
|
|
function close(){
|
|
var el = document.getElementById('weval-nps-popup-el');
|
|
if(el) el.remove();
|
|
}
|
|
document.getElementById('weval-nps-close').onclick = function(){
|
|
try { localStorage.setItem('weval_nps_shown_30d', Date.now()); } catch(e){}
|
|
close();
|
|
};
|
|
document.getElementById('weval-nps-later').onclick = function(){
|
|
try { localStorage.removeItem('weval_query_count'); } catch(e){}
|
|
close();
|
|
};
|
|
document.getElementById('weval-nps-submit').onclick = function(){
|
|
if(selectedScore === null) return;
|
|
var comment = document.getElementById('weval-nps-comment').value;
|
|
var fd = new FormData();
|
|
fd.append('action','submit'); fd.append('score',selectedScore); fd.append('comment',comment); fd.append('user',user);
|
|
fetch('/api/nps-collector.php?action=submit', {method:'POST', body:fd})
|
|
.then(function(){
|
|
document.getElementById('weval-nps-thanks').style.display = 'block';
|
|
try { localStorage.setItem('weval_nps_shown_30d', Date.now()); localStorage.removeItem('weval_query_count'); } catch(e){}
|
|
setTimeout(close, 1800);
|
|
})
|
|
.catch(function(){ setTimeout(close, 400); });
|
|
};
|
|
}
|
|
|
|
// Expose globally for manual trigger + dev testing
|
|
window.wevalShowNPS = showNPSPopup;
|
|
})();
|