// === VNEWS Frontend v2 - Optimized for speed === // === LOAD HOME - Fast: immediate shell + parallel fetch === function _fetchWithTimeout(url, ms){ return new Promise((resolve,reject)=>{ const ctrl=new AbortController(); const tid=setTimeout(()=>ctrl.abort(),ms); fetch(url,{signal:ctrl.signal}).then(r=>{ clearTimeout(tid); if(!r.ok) return reject(new Error('HTTP '+r.status)); return r.json(); }).then(d=>resolve(d)).catch(e=>{clearTimeout(tid);reject(e);}); }); } async function loadHome(){ const homeEl = document.getElementById('view-home'); if(!homeEl) return; // Build shell IMMEDIATELY — no skeleton, no delay homeEl.innerHTML = '
' +'${b.text}
`;else if(b.type==='img'&&b.src&&!seen[b.src]){seen[b.src]=1;h+=`Không đọc được.
Mở gốc →${esc(p.text)}
${hasVideo?``:''}