Kata Kata cartoons


Don’t Worry, Just Laugh.


SHORT COMICS

Help Us Improve Your Experience

Tell us which marketing partner brought you! This helps us understand our audience better.

let companyModalTimerInterval = null; const COMPANY_MODAL_DISMISS_DURATION = 3600; // 1 hour after dismiss const COMPANY_MODAL_IDLE_TRIGGER = 30 * 60; // Show after 30 min idle OR on revisit const COMPANY_MODAL_TIMER_DURATION = 15 * 60; // 15 min countdown timer on modal function hideCompanyModal() { const modal = document.getElementById('companyAssignmentModal'); if (modal) modal.style.display = 'none'; if (companyModalTimerInterval) clearInterval(companyModalTimerInterval); } function showCompanyModal() { const modal = document.getElementById('companyAssignmentModal'); if (!modal) return; loadCompaniesIntoSelect(); modal.style.display = 'flex'; startCompanyModalCountdown(); } function startCompanyModalCountdown() { let timeLeft = COMPANY_MODAL_TIMER_DURATION; const timerEl = document.getElementById('companyAssignmentTimer'); function updateTimer() { if (timeLeft <= 0) { if (companyModalTimerInterval) clearInterval(companyModalTimerInterval); hideCompanyModal(); return; } const mins = Math.floor(timeLeft / 60); const secs = timeLeft % 60; if (timerEl) timerEl.textContent = `Time remaining to choose: ${mins}:${secs.toString().padStart(2, '0')}`; timeLeft--; } updateTimer(); if (companyModalTimerInterval) clearInterval(companyModalTimerInterval); companyModalTimerInterval = setInterval(updateTimer, 1000); } function dismissCompanyModal() { hideCompanyModal(); companyModalDismissTime = Math.floor(Date.now() / 1000); localStorage.setItem('companyModal_dismissTime', companyModalDismissTime); } function saveCompanyAssignment() { const company = document.getElementById('companySelect').value; if (!company) { alert('Please select a marketing partner'); return; } const msisdn = localStorage.getItem('katakata_msisdn') || ''; if (!msisdn) { alert('Phone number not found'); return; } const btn = event.target; btn.disabled = true; const prevText = btn.textContent; btn.textContent = 'Saving...'; const form = new FormData(); form.append('msisdn', msisdn); form.append('company_id', company); const csrftoken = getCookie('csrftoken'); fetch('/marketing/assign/', { method: 'POST', body: form, credentials: 'same-origin', headers: csrftoken ? { 'X-CSRFToken': csrftoken } : {} }) .then(r => r.json()) .then(data => { if (data.ok) { hideCompanyModal(); companyModalDismissTime = Math.floor(Date.now() / 1000); localStorage.setItem('companyModal_dismissTime', companyModalDismissTime); localStorage.setItem('companyModal_assigned', 'true'); } else { alert(data.error || 'Failed to save'); } }) .catch(() => alert('Network error')) .finally(() => { btn.disabled = false; btn.textContent = prevText; }); } function loadCompaniesIntoSelect() { const sel = document.getElementById('companySelect'); if (!sel) return; fetch('/marketing/companies/json/', { credentials: 'same-origin' }) .then(r => r.json()) .then(data => { if (!data || !data.companies) return; sel.innerHTML = ''; data.companies.forEach(c => { const opt = document.createElement('option'); opt.value = c.id; opt.textContent = c.name; sel.appendChild(opt); }); }) .catch(() => {}); } function shouldShowCompanyModal() { // Show modal for any subscriber (promo or manual) who hasn't set a marketing company. if (localStorage.getItem('companyModal_assigned') === 'true') return false; const dismissTime = parseInt(localStorage.getItem('companyModal_dismissTime') || '0', 10); const now = Math.floor(Date.now() / 1000); if (dismissTime > 0 && (now - dismissTime) < COMPANY_MODAL_DISMISS_DURATION) return false; // Require a subscriber phone number to show assignment modal const msisdn = localStorage.getItem('katakata_msisdn'); if (!msisdn) return false; return true; } function initCompanyModalLogic() { // Trigger modal on page load if conditions met AND 30 min idle passed if (shouldShowCompanyModal()) { // Track idle time: show modal after 30 min or on revisit (page refresh) const lastIdleCheck = parseInt(localStorage.getItem('companyModal_lastCheck') || '0', 10); const now = Math.floor(Date.now() / 1000); const timeSinceLastCheck = now - lastIdleCheck; // If first check OR more than 30 min has passed if (lastIdleCheck === 0 || timeSinceLastCheck >= COMPANY_MODAL_IDLE_TRIGGER) { localStorage.setItem('companyModal_lastCheck', now.toString()); // Delay slightly so page fully renders setTimeout(showCompanyModal, 500); } else { localStorage.setItem('companyModal_lastCheck', now.toString()); } } } function getCookie(name) { const v = document.cookie.split('; ').find(row => row.startsWith(name + '=')); return v ? decodeURIComponent(v.split('=')[1]) : null; } // Initialize modal logic on page load document.addEventListener('DOMContentLoaded', function() { initCompanyModalLogic(); });