-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuser-counter.js
More file actions
1 lines (1 loc) · 3.05 KB
/
Copy pathuser-counter.js
File metadata and controls
1 lines (1 loc) · 3.05 KB
1
(function(){'use strict';const WORKER_BASE='';const COUNTER_URL='/api/counter';const CACHE_KEY='acreetion_visitor_count';const CACHE_TIME=5*60*1000;function createCounter(count){const container=document.createElement('div');container.className='acreetion-user-counter';container.setAttribute('aria-label','Community statistics');container.innerHTML='<div class="counter-stat">'+'<span class="counter-number" id="live-count">'+formatNumber(count)+'</span>'+'<span class="counter-label">Active Users</span>'+'</div>';return container;}function formatNumber(n){if(n >=1000000)return(n/1000000).toFixed(1)+'M';if(n >=1000)return(n/1000).toFixed(1)+'k';return n.toString();}async function fetchCount(){const cached=localStorage.getItem(CACHE_KEY);if(cached){try{const parsed=JSON.parse(cached);if(Date.now()-parsed.ts < CACHE_TIME){return parsed.count;}}catch(e){}}if(location.protocol==='file:')return null;try{const res=await fetch(COUNTER_URL,{method:'POST',headers:{'Content-Type':'application/json'}});if(!res.ok)throw new Error('Worker unavailable');const data=await res.json();const count=data.count || 0;localStorage.setItem(CACHE_KEY,JSON.stringify({count:count,ts:Date.now()}));return count;}catch(e){return null;}}async function injectCounter(){let target=document.querySelector('.announcement-content,.tracker-hero,.demo-hero');if(!target){target=document.querySelector('.page-wrapper,.content-feed,.hero');}if(!target)return;const placeholder=document.createElement('div');placeholder.className='acreetion-user-counter acreetion-counter-loading';placeholder.textContent='';target.parentNode.insertBefore(placeholder,target.nextSibling);const count=await fetchCount();placeholder.remove();if(count !==null && count > 0){const counter=createCounter(count);target.parentNode.insertBefore(counter,target.nextSibling);}}function addStyles(){if(document.getElementById('counter-styles'))return;const style=document.createElement('style');style.id='counter-styles';style.textContent='.acreetion-user-counter{display:flex;justify-content:center;align-items:center;padding:1rem;margin:0 auto;max-width:500px}'+'.acreetion-user-counter .counter-stat{display:flex;flex-direction:column;align-items:center;padding:0 2rem}'+'.acreetion-user-counter .counter-number{font-family:var(--font-mono),"Fira Code",monospace;font-size:2.4rem;font-weight:700;color:var(--acreetion-green,#2ecc71);line-height:1.1;animation:countPulse 0.5s ease}'+'.acreetion-user-counter .counter-label{font-size:0.78rem;color:var(--acreetion-text,#b2b2b2);text-transform:uppercase;letter-spacing:1px;margin-top:0.2rem}'+'@keyframes countPulse{from{transform:scale(1.1);color:var(--acreetion-text-bright,#fff)}to{transform:scale(1)}}'+'.acreetion-counter-loading{color:var(--acreetion-text,#b2b2b2);font-size:0.85rem;text-align:center;padding:1rem}'+'@media(max-width:480px){.acreetion-user-counter .counter-number{font-size:1.8rem}}';document.head.appendChild(style);}if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',function(){addStyles();setTimeout(injectCounter,300);});}else{addStyles();setTimeout(injectCounter,300);}})();