Spaces:
Running
Running
Remove all comment/bình luận features from video feeds per user request
Browse files- static/app_v2.js +9 -15
static/app_v2.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
-
// === VNEWS Frontend
|
| 2 |
-
//
|
| 3 |
|
| 4 |
// === LOAD HOME ===
|
| 5 |
async function loadHome(){
|
|
@@ -76,7 +76,6 @@ async function loadHotTopics(){
|
|
| 76 |
const j=await fetch('/api/hot_topics').then(r=>r.json()).catch(()=>({topics:[]}));
|
| 77 |
const el=document.getElementById('hot-topics');if(!el)return;
|
| 78 |
el.innerHTML=(j.topics||[]).slice(0,18).map(t=>`<button class="hot-chip" data-topic="${esc(t.topic)}" onclick="searchTopic('${esc(t.topic).replace(/'/g,"\\'")}')">${esc(t.label)}</button>`).join('');
|
| 79 |
-
// Auto-load first hashtag
|
| 80 |
if(j.topics&&j.topics[0])setTimeout(()=>searchTopic(j.topics[0].topic),1000);
|
| 81 |
}
|
| 82 |
function searchTopic(topic){
|
|
@@ -109,7 +108,6 @@ async function showHashtagSources(topic,page){
|
|
| 109 |
const btn=document.getElementById('ht-more');
|
| 110 |
if(btn){if(!j.has_more)btn.remove();else{btn.disabled=false;btn.textContent='Tải thêm ▼';}}
|
| 111 |
}
|
| 112 |
-
// Lazy load images
|
| 113 |
sources.forEach((s,i)=>{
|
| 114 |
const idx=page*6+i;
|
| 115 |
if(!s.url)return;
|
|
@@ -139,7 +137,7 @@ function openMatch(id){if(!id)return;_currentEventId=id;document.getElementById(
|
|
| 139 |
function closeMatch(){document.getElementById('match-overlay').classList.remove('active');document.body.style.overflow=''}
|
| 140 |
async function loadMatchTab(tab){document.querySelectorAll('.mo-tab').forEach(t=>t.classList.remove('active'));document.querySelectorAll('.mo-tab').forEach(t=>{if((tab==='comm'&&t.textContent==='Diễn biến')||(tab==='stats'&&t.textContent==='Thống kê'))t.classList.add('active')});const el=document.getElementById('mo-body');el.innerHTML='<div class="loading">Đang tải...</div>';try{const r=await fetch(tab==='stats'?`/api/match/${_currentEventId}/stats`:`/api/match/${_currentEventId}/commentaries`);const d=await r.json();el.innerHTML=d.html||'<div class="loading">Không có dữ liệu</div>'}catch(e){el.innerHTML='<div class="loading">Lỗi</div>'}}
|
| 141 |
|
| 142 |
-
// === READ ARTICLE
|
| 143 |
async function readArticle(url){
|
| 144 |
showView('view-article');const el=document.getElementById('view-article');
|
| 145 |
el.innerHTML='<div class="loading">Đang tải...</div>';
|
|
@@ -164,7 +162,7 @@ async function askAI(){const q=document.getElementById('ask-q')?.value.trim();if
|
|
| 164 |
// === WALL POST ===
|
| 165 |
async function readWallPost(i){const wall=(await fetch('/api/ai_wall').then(r=>r.json()).catch(()=>({posts:[]}))).posts||[];const p=wall[i];if(!p)return;showView('view-article');let h=`<button class="back-btn" onclick="switchCat('home')">← Quay lại</button><div class="article-view"><span class="badge badge-ai">AI</span><h1 class="article-title">${esc(p.title)}</h1>${p.img?`<img class="article-img" src="${p.img}">`:''}<p class="article-p" style="white-space:pre-wrap">${esc(p.text)}</p><div class="article-actions">${p.video?`<button onclick="openShortAIFeed(${i})">🎬 Xem Short</button>`:''}<button onclick="doShare('${esc(p.title)}','${SPACE}','${esc(p.img||'')}')">📤</button></div></div>`;document.getElementById('view-article').innerHTML=h;window.scrollTo(0,0)}
|
| 166 |
|
| 167 |
-
// === TIKTOK FEED (
|
| 168 |
function initTikTokFeed(){
|
| 169 |
const feed=document.getElementById('tiktok-feed');if(!feed)return;
|
| 170 |
const slides=feed.querySelectorAll('.tiktok-slide');let cur=-1;
|
|
@@ -174,7 +172,7 @@ function initTikTokFeed(){
|
|
| 174 |
slides.forEach(sl=>{const v=sl.querySelector('video');if(v)v.addEventListener('click',e=>{e.preventDefault();v.paused?v.play().catch(()=>{}):v.pause()})});
|
| 175 |
}
|
| 176 |
|
| 177 |
-
// === HIGHLIGHT FEED ===
|
| 178 |
async function openHighlightFeed(league,idx){
|
| 179 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 180 |
let articles=(_hlLeagueData||{})[league]||[];
|
|
@@ -193,7 +191,7 @@ async function openHighlightFeed(league,idx){
|
|
| 193 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 194 |
}
|
| 195 |
|
| 196 |
-
// === SHORTS YOUTUBE FEED ===
|
| 197 |
async function openYTShortsFeed(startIdx){
|
| 198 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 199 |
const arts=await fetch('/api/shorts').then(r=>r.json()).catch(()=>[]);
|
|
@@ -202,25 +200,21 @@ async function openYTShortsFeed(startIdx){
|
|
| 202 |
let h=`<button class="back-btn" onclick="switchCat('home')">← Shorts</button><div class="tiktok-container"><div class="tiktok-feed" id="tiktok-feed">`;
|
| 203 |
ordered.forEach((v,i)=>{
|
| 204 |
const id=v.id||'';const src=`https://www.youtube.com/embed/${id}?autoplay=1&rel=0&playsinline=1`;
|
| 205 |
-
h+=`<div class="tiktok-slide"><iframe data-yt-src="${src}" allowfullscreen allow="accelerometer;autoplay;clipboard-write;encrypted-media;gyroscope;picture-in-picture"></iframe><div class="tiktok-bottom"><span class="badge badge-fpt">YT</span><p class="tiktok-title">${esc(v.title)}</p></div><div class="tiktok-right"><button class="tiktok-right-btn"><div class="icon">👁</div></button><button class="tiktok-right-btn"><div class="icon">❤️</div></button><button class="tiktok-right-btn" onclick="event.stopPropagation();
|
| 206 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 207 |
}
|
| 208 |
|
| 209 |
-
// === SHORT AI FEED ===
|
| 210 |
async function openShortAIFeed(startIdx){
|
| 211 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 212 |
const wall=(await fetch('/api/ai_wall').then(r=>r.json()).catch(()=>({posts:[]}))).posts||[];
|
| 213 |
const vids=wall.filter(p=>p.video);if(!vids.length){el.innerHTML='<div class="loading">Chưa có Short AI</div>';return}
|
| 214 |
const ordered=startIdx>0?[...vids.slice(startIdx),...vids.slice(0,startIdx)]:vids;
|
| 215 |
let h=`<button class="back-btn" onclick="switchCat('home')">← Short AI</button><div class="tiktok-container"><div class="tiktok-feed" id="tiktok-feed">`;
|
| 216 |
-
ordered.forEach((p,i)=>{h+=`<div class="tiktok-slide"><video src="${p.video}" playsinline loop controls></video><div class="tiktok-bottom"><span class="badge badge-ai">AI</span><p class="tiktok-title">${esc(p.title)}</p></div><div class="tiktok-right"><button class="tiktok-right-btn"><div class="icon">👁</div></button><button class="tiktok-right-btn"><div class="icon">❤️</div></button><button class="tiktok-right-btn" onclick="event.stopPropagation();
|
| 217 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 218 |
}
|
| 219 |
|
| 220 |
-
// === COMMENTS ===
|
| 221 |
-
async function openComments(id){const panel=document.getElementById('cmt-panel');const j=await fetch('/api/short/comments?id='+encodeURIComponent(id)).then(r=>r.json()).catch(()=>({comments:[]}));const cmts=j.comments||[];panel.innerHTML=`<h3 style="color:#5cb87a;font-size:14px">💬 Bình luận</h3><div id="cmt-list">${cmts.map(c=>`<div style="background:#222;border-radius:8px;padding:7px;margin:5px 0;color:#ccc;font-size:12px">${esc(c.text)}</div>`).join('')||'<div style="color:#777;font-size:12px">Chưa có</div>'}</div><textarea id="cmt-text" placeholder="Bình luận..."></textarea><button onclick="submitCmt('${esc(id)}')">Gửi</button><button onclick="document.getElementById('cmt-panel').classList.remove('active')">Đóng</button>`;panel.classList.add('active')}
|
| 222 |
-
async function submitCmt(id){const t=document.getElementById('cmt-text')?.value.trim();if(!t)return;const j=await fetch('/api/short/comment',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id,text:t})}).then(r=>r.json()).catch(()=>({comments:[]}));document.getElementById('cmt-list').innerHTML=(j.comments||[]).map(c=>`<div style="background:#222;border-radius:8px;padding:7px;margin:5px 0;color:#ccc;font-size:12px">${esc(c.text)}</div>`).join('');document.getElementById('cmt-text').value=''}
|
| 223 |
-
|
| 224 |
// === NEWS TAB ===
|
| 225 |
async function loadNewsTab(){const el=document.getElementById('view-cat');el.innerHTML='<div class="loading">Đang tải...</div>';try{const r=await fetch('/api/homepage');const news=await r.json();if(!news.length){el.innerHTML='<div class="loading">Không có tin</div>';return}const groups={};news.forEach(a=>{if(!groups[a.group])groups[a.group]=[];groups[a.group].push(a)});let h='';for(const[g,arts] of Object.entries(groups)){h+=`<div class="section-title">${g}</div><div class="grid">`;arts.slice(0,6).forEach(a=>{h+=`<div class="card" onclick="readArticle('${esc(a.link)}')"><div class="card-img">${a.img?`<img src="${a.img}">`:''}</div><div class="card-body"><span class="badge badge-vne">${esc(a.source||'VnE')}</span><div class="card-title">${esc(a.title)}</div></div></div>`});h+='</div>'}el.innerHTML=h}catch(e){el.innerHTML='<div class="loading">Lỗi</div>'}}
|
| 226 |
async function loadCat(id){const el=document.getElementById('view-cat');el.innerHTML='<div class="loading">Đang tải...</div>';const arts=await fetch('/api/category/'+id).then(r=>r.json()).catch(()=>[]);if(!arts.length){el.innerHTML='<div class="loading">Không có tin</div>';return}let h='<div class="grid">';arts.forEach(a=>{h+=`<div class="card" onclick="readArticle('${esc(a.link)}')"><div class="card-img">${a.img?`<img src="${a.img}">`:''}</div><div class="card-body"><span class="badge badge-vne">${esc(a.source||'')}</span><div class="card-title">${esc(a.title)}</div></div></div>`});h+='</div>';el.innerHTML=h}
|
|
|
|
| 1 |
+
// === VNEWS Frontend v2 - All Functions ===
|
| 2 |
+
// Comments/bình luận removed per user request
|
| 3 |
|
| 4 |
// === LOAD HOME ===
|
| 5 |
async function loadHome(){
|
|
|
|
| 76 |
const j=await fetch('/api/hot_topics').then(r=>r.json()).catch(()=>({topics:[]}));
|
| 77 |
const el=document.getElementById('hot-topics');if(!el)return;
|
| 78 |
el.innerHTML=(j.topics||[]).slice(0,18).map(t=>`<button class="hot-chip" data-topic="${esc(t.topic)}" onclick="searchTopic('${esc(t.topic).replace(/'/g,"\\'")}')">${esc(t.label)}</button>`).join('');
|
|
|
|
| 79 |
if(j.topics&&j.topics[0])setTimeout(()=>searchTopic(j.topics[0].topic),1000);
|
| 80 |
}
|
| 81 |
function searchTopic(topic){
|
|
|
|
| 108 |
const btn=document.getElementById('ht-more');
|
| 109 |
if(btn){if(!j.has_more)btn.remove();else{btn.disabled=false;btn.textContent='Tải thêm ▼';}}
|
| 110 |
}
|
|
|
|
| 111 |
sources.forEach((s,i)=>{
|
| 112 |
const idx=page*6+i;
|
| 113 |
if(!s.url)return;
|
|
|
|
| 137 |
function closeMatch(){document.getElementById('match-overlay').classList.remove('active');document.body.style.overflow=''}
|
| 138 |
async function loadMatchTab(tab){document.querySelectorAll('.mo-tab').forEach(t=>t.classList.remove('active'));document.querySelectorAll('.mo-tab').forEach(t=>{if((tab==='comm'&&t.textContent==='Diễn biến')||(tab==='stats'&&t.textContent==='Thống kê'))t.classList.add('active')});const el=document.getElementById('mo-body');el.innerHTML='<div class="loading">Đang tải...</div>';try{const r=await fetch(tab==='stats'?`/api/match/${_currentEventId}/stats`:`/api/match/${_currentEventId}/commentaries`);const d=await r.json();el.innerHTML=d.html||'<div class="loading">Không có dữ liệu</div>'}catch(e){el.innerHTML='<div class="loading">Lỗi</div>'}}
|
| 139 |
|
| 140 |
+
// === READ ARTICLE ===
|
| 141 |
async function readArticle(url){
|
| 142 |
showView('view-article');const el=document.getElementById('view-article');
|
| 143 |
el.innerHTML='<div class="loading">Đang tải...</div>';
|
|
|
|
| 162 |
// === WALL POST ===
|
| 163 |
async function readWallPost(i){const wall=(await fetch('/api/ai_wall').then(r=>r.json()).catch(()=>({posts:[]}))).posts||[];const p=wall[i];if(!p)return;showView('view-article');let h=`<button class="back-btn" onclick="switchCat('home')">← Quay lại</button><div class="article-view"><span class="badge badge-ai">AI</span><h1 class="article-title">${esc(p.title)}</h1>${p.img?`<img class="article-img" src="${p.img}">`:''}<p class="article-p" style="white-space:pre-wrap">${esc(p.text)}</p><div class="article-actions">${p.video?`<button onclick="openShortAIFeed(${i})">🎬 Xem Short</button>`:''}<button onclick="doShare('${esc(p.title)}','${SPACE}','${esc(p.img||'')}')">📤</button></div></div>`;document.getElementById('view-article').innerHTML=h;window.scrollTo(0,0)}
|
| 164 |
|
| 165 |
+
// === TIKTOK FEED (Shorts, Short AI, Highlights) - NO COMMENTS ===
|
| 166 |
function initTikTokFeed(){
|
| 167 |
const feed=document.getElementById('tiktok-feed');if(!feed)return;
|
| 168 |
const slides=feed.querySelectorAll('.tiktok-slide');let cur=-1;
|
|
|
|
| 172 |
slides.forEach(sl=>{const v=sl.querySelector('video');if(v)v.addEventListener('click',e=>{e.preventDefault();v.paused?v.play().catch(()=>{}):v.pause()})});
|
| 173 |
}
|
| 174 |
|
| 175 |
+
// === HIGHLIGHT FEED (no comments) ===
|
| 176 |
async function openHighlightFeed(league,idx){
|
| 177 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 178 |
let articles=(_hlLeagueData||{})[league]||[];
|
|
|
|
| 191 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 192 |
}
|
| 193 |
|
| 194 |
+
// === SHORTS YOUTUBE FEED (no comments) ===
|
| 195 |
async function openYTShortsFeed(startIdx){
|
| 196 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 197 |
const arts=await fetch('/api/shorts').then(r=>r.json()).catch(()=>[]);
|
|
|
|
| 200 |
let h=`<button class="back-btn" onclick="switchCat('home')">← Shorts</button><div class="tiktok-container"><div class="tiktok-feed" id="tiktok-feed">`;
|
| 201 |
ordered.forEach((v,i)=>{
|
| 202 |
const id=v.id||'';const src=`https://www.youtube.com/embed/${id}?autoplay=1&rel=0&playsinline=1`;
|
| 203 |
+
h+=`<div class="tiktok-slide"><iframe data-yt-src="${src}" allowfullscreen allow="accelerometer;autoplay;clipboard-write;encrypted-media;gyroscope;picture-in-picture"></iframe><div class="tiktok-bottom"><span class="badge badge-fpt">YT</span><p class="tiktok-title">${esc(v.title)}</p></div><div class="tiktok-right"><button class="tiktok-right-btn"><div class="icon">👁</div></button><button class="tiktok-right-btn"><div class="icon">❤️</div></button><button class="tiktok-right-btn" onclick="event.stopPropagation();doShare('${esc(v.title)}','https://youtube.com/watch?v=${id}','')"><div class="icon">📤</div></button></div><span class="tiktok-counter">${i+1}/${ordered.length}</span></div>`});
|
| 204 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 205 |
}
|
| 206 |
|
| 207 |
+
// === SHORT AI FEED (no comments) ===
|
| 208 |
async function openShortAIFeed(startIdx){
|
| 209 |
showView('view-tiktok');const el=document.getElementById('view-tiktok');el.innerHTML='<div class="loading">Đang tải...</div>';
|
| 210 |
const wall=(await fetch('/api/ai_wall').then(r=>r.json()).catch(()=>({posts:[]}))).posts||[];
|
| 211 |
const vids=wall.filter(p=>p.video);if(!vids.length){el.innerHTML='<div class="loading">Chưa có Short AI</div>';return}
|
| 212 |
const ordered=startIdx>0?[...vids.slice(startIdx),...vids.slice(0,startIdx)]:vids;
|
| 213 |
let h=`<button class="back-btn" onclick="switchCat('home')">← Short AI</button><div class="tiktok-container"><div class="tiktok-feed" id="tiktok-feed">`;
|
| 214 |
+
ordered.forEach((p,i)=>{h+=`<div class="tiktok-slide"><video src="${p.video}" playsinline loop controls></video><div class="tiktok-bottom"><span class="badge badge-ai">AI</span><p class="tiktok-title">${esc(p.title)}</p></div><div class="tiktok-right"><button class="tiktok-right-btn"><div class="icon">👁</div></button><button class="tiktok-right-btn"><div class="icon">❤️</div></button><button class="tiktok-right-btn" onclick="event.stopPropagation();doShare('${esc(p.title)}','${SPACE}','')"><div class="icon">📤</div></button></div><span class="tiktok-counter">${i+1}/${ordered.length}</span></div>`});
|
| 215 |
h+='</div></div>';el.innerHTML=h;initTikTokFeed();
|
| 216 |
}
|
| 217 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
// === NEWS TAB ===
|
| 219 |
async function loadNewsTab(){const el=document.getElementById('view-cat');el.innerHTML='<div class="loading">Đang tải...</div>';try{const r=await fetch('/api/homepage');const news=await r.json();if(!news.length){el.innerHTML='<div class="loading">Không có tin</div>';return}const groups={};news.forEach(a=>{if(!groups[a.group])groups[a.group]=[];groups[a.group].push(a)});let h='';for(const[g,arts] of Object.entries(groups)){h+=`<div class="section-title">${g}</div><div class="grid">`;arts.slice(0,6).forEach(a=>{h+=`<div class="card" onclick="readArticle('${esc(a.link)}')"><div class="card-img">${a.img?`<img src="${a.img}">`:''}</div><div class="card-body"><span class="badge badge-vne">${esc(a.source||'VnE')}</span><div class="card-title">${esc(a.title)}</div></div></div>`});h+='</div>'}el.innerHTML=h}catch(e){el.innerHTML='<div class="loading">Lỗi</div>'}}
|
| 220 |
async function loadCat(id){const el=document.getElementById('view-cat');el.innerHTML='<div class="loading">Đang tải...</div>';const arts=await fetch('/api/category/'+id).then(r=>r.json()).catch(()=>[]);if(!arts.length){el.innerHTML='<div class="loading">Không có tin</div>';return}let h='<div class="grid">';arts.forEach(a=>{h+=`<div class="card" onclick="readArticle('${esc(a.link)}')"><div class="card-img">${a.img?`<img src="${a.img}">`:''}</div><div class="card-body"><span class="badge badge-vne">${esc(a.source||'')}</span><div class="card-title">${esc(a.title)}</div></div></div>`});h+='</div>';el.innerHTML=h}
|