bep40 commited on
Commit
d5c4d43
·
verified ·
1 Parent(s): 012aca7

Remove all comment/bình luận features from video feeds per user request

Browse files
Files changed (1) hide show
  1. static/app_v2.js +9 -15
static/app_v2.js CHANGED
@@ -1,5 +1,5 @@
1
- // === VNEWS Frontend Part 2-4: All functions ===
2
- // This file will be merged into static/index_v2.html
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 (universal scrape) ===
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 (shared by Shorts, Short AI, Highlights) ===
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();openComments('yt-${id}')"><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>`});
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();openComments('ai-${p.id}')"><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>`});
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}