bep40 commited on
Commit
57980de
·
verified ·
1 Parent(s): f585a27

Restore static/hot_multi.js from commit 0280ca5 (v1: 3 topics, no pagination)

Browse files
Files changed (1) hide show
  1. static/hot_multi.js +23 -60
static/hot_multi.js CHANGED
@@ -1,6 +1,5 @@
1
  // === OVERRIDE: loadHotTopics loads from MULTIPLE hashtags ===
2
  // This file loaded AFTER app_v2.js, overrides the function
3
- // FIX v2: 5 topics, hiển thị ngày, nút tải thêm
4
 
5
  async function loadHotTopics(){
6
  const j=await fetch('/api/hot_topics').then(r=>r.json()).catch(()=>({topics:[]}));
@@ -10,77 +9,41 @@ async function loadHotTopics(){
10
  const topicText=t.topic||t.label.replace(/^#/,'');
11
  return`<button class="hot-chip" onclick="searchTopic('${topicText.replace(/'/g,"\\'")}')">${esc(t.label)}</button>`;
12
  }).join('');
13
- // Load tin HOT = tổng hợp từ TOP 5 hashtag nóng nhất
14
  if(topics.length>=2){
15
- loadMultiHashtag(topics.slice(0,7).map(t=>t.topic||t.label.replace(/^#/,'')));
16
  }else if(topics.length){
17
  searchTopic(topics[0].topic||topics[0].label.replace(/^#/,''));
18
  }
19
  }
20
 
21
- // Global state for pagination
22
- var _htMultiPage = 0;
23
- var _htMultiTopics = [];
24
- var _htMultiAll = [];
25
-
26
  async function loadMultiHashtag(topicList){
27
  const box=document.getElementById('hashtag-box');if(!box)return;
28
- _htMultiTopics = topicList.slice(0,5); // Limit to 5 topics
29
- _htMultiPage = 0;
30
- _htMultiAll = [];
31
- box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT tổng hợp <span style="font-size:10px;color:#888">(5 chủ đề nóng nhất)</span></h3><div class="hashtag-loading"><div class="hashtag-spinner"></div>Đang tổng hợp từ 5 chủ đề nóng nhất...</div></div>`;
32
- _htMultiLoadPage(0, true);
33
- }
34
-
35
- async function _htMultiLoadPage(page, replace){
36
- const box=document.getElementById('hashtag-box');if(!box)return;
37
  try{
38
- // Use the new aggregated endpoint with pagination
39
- const r=await fetch(`/api/hashtag/multi?page=${page}&per_page=12`);
40
- const j=await r.json();
41
- if(!j.sources||!j.sources.length){
42
- if(replace)box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT tổng hợp</h3><div style="color:#888;padding:8px">Đang cập nhật...</div></div>`;
43
- return;
 
 
 
 
 
44
  }
45
- if(replace) _htMultiAll = [];
46
- _htMultiAll = _htMultiAll.concat(j.sources);
47
- _htMultiPage = page;
48
-
49
- let h=`<div class="hashtag-sources"><h3>🔥 Tin HOT tổng hợp <span style="font-size:10px;color:#888">(${j.total} bài · ${j.topics.length} chủ đề)</span></h3><div id="ht-list">`;
50
- _htMultiAll.forEach((s,i)=>{
51
- const dateStr = s.date ? `<span style="font-size:9px;color:#777;margin-left:4px">${esc(s.date)}</span>` : '';
52
- h+=`<div class="hashtag-src-item" onclick="readArticle('${esc(s.url)}')"><div class="hashtag-src-img" id="ht-img-m-${i}"></div><div class="hashtag-src-text"><div class="hashtag-src-title">${esc(s.title)}</div><div class="hashtag-src-via">${esc(s.via||'')}${dateStr} · <span style="color:#f0c040;font-size:9px">#${esc(s._topic||'')}</span></div></div></div>`;
53
  });
54
- h+=`</div>`;
55
- // Load more button
56
- if(j.has_more){
57
- h+=`<button class="hashtag-load-more" id="ht-load-more-btn" onclick="_htMultiLoadMore()">📥 Tải thêm (${j.total - _htMultiAll.length} bài còn lại)</button>`;
58
- }else{
59
- h+=`<div style="text-align:center;color:#555;font-size:10px;margin-top:8px">Đã hiển thị tất cả ${_htMultiAll.length} bài</div>`;
60
- }
61
- // Topic chips
62
- h+=`<div style="display:flex;gap:4px;flex-wrap:wrap;margin-top:8px">`;
63
- j.topics.forEach(t=>{h+=`<button class="hot-chip" onclick="searchTopic('${t.replace(/'/g,"\\'")}')" style="font-size:10px">🔍 #${esc(t)}</button>`;});
64
  h+=`</div></div>`;
65
  box.innerHTML=h;
66
  // Lazy load images
67
- _htMultiAll.forEach((s,i)=>{
68
- if(!s.url)return;
69
- fetch('/api/article?url='+encodeURIComponent(s.url)).then(r=>r.json()).then(d=>{
70
- if(d&&(d.og_image||d.img)){
71
- const el=document.getElementById('ht-img-m-'+i);
72
- if(el)el.innerHTML=`<img src="${esc(d.og_image||d.img)}" onerror="this.style.display='none'">`;
73
- }
74
- }).catch(()=>{});
75
- });
76
- _htMultiTopics = j.topics || _htMultiTopics;
77
- }catch(e){
78
- if(replace)box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT</h3><div style="color:#e74c3c;padding:8px">Lỗi tải tin: ${e.message}</div></div>`;
79
- }
80
- }
81
-
82
- async function _htMultiLoadMore(){
83
- const btn=document.getElementById('ht-load-more-btn');
84
- if(btn){btn.disabled=true;btn.textContent='Đang tải...';}
85
- await _htMultiLoadPage(_htMultiPage + 1, false);
86
  }
 
1
  // === OVERRIDE: loadHotTopics loads from MULTIPLE hashtags ===
2
  // This file loaded AFTER app_v2.js, overrides the function
 
3
 
4
  async function loadHotTopics(){
5
  const j=await fetch('/api/hot_topics').then(r=>r.json()).catch(()=>({topics:[]}));
 
9
  const topicText=t.topic||t.label.replace(/^#/,'');
10
  return`<button class="hot-chip" onclick="searchTopic('${topicText.replace(/'/g,"\\'")}')">${esc(t.label)}</button>`;
11
  }).join('');
12
+ // Load tin HOT = tổng hợp từ TOP 3 hashtag nóng nhất
13
  if(topics.length>=2){
14
+ loadMultiHashtag(topics.slice(0,3).map(t=>t.topic||t.label.replace(/^#/,'')));
15
  }else if(topics.length){
16
  searchTopic(topics[0].topic||topics[0].label.replace(/^#/,''));
17
  }
18
  }
19
 
 
 
 
 
 
20
  async function loadMultiHashtag(topicList){
21
  const box=document.getElementById('hashtag-box');if(!box)return;
22
+ box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT tổng hợp</h3><div class="hashtag-loading"><div class="hashtag-spinner"></div>Tổng hợp từ ${topicList.length} chủ đề nóng nhất...</div></div>`;
 
 
 
 
 
 
 
 
23
  try{
24
+ const results=await Promise.all(topicList.map(topic=>
25
+ fetch(`/api/hashtag/sources?topic=${encodeURIComponent(topic)}&page=0`).then(r=>r.json()).catch(()=>({sources:[]}))
26
+ ));
27
+ // Interleave from all topics
28
+ const all=[];const seen=new Set();
29
+ const mx=Math.max(...results.map(r=>(r.sources||[]).length));
30
+ for(let i=0;i<mx;i++){
31
+ for(let j=0;j<results.length;j++){
32
+ const src=(results[j].sources||[])[i];
33
+ if(src&&src.url&&!seen.has(src.url)){seen.add(src.url);src._topic=topicList[j];all.push(src);}
34
+ }
35
  }
36
+ if(!all.length){box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT</h3><div style="color:#888;padding:8px">Đang cập nhật...</div></div>`;return;}
37
+ let h=`<div class="hashtag-sources"><h3>🔥 Tin HOT tổng hợp <span style="font-size:10px;color:#888">(${all.length} bài · ${topicList.length} chủ đề)</span></h3><div id="ht-list">`;
38
+ all.slice(0,12).forEach((s,i)=>{
39
+ h+=`<div class="hashtag-src-item" onclick="readArticle('${esc(s.url)}')"><div class="hashtag-src-img" id="ht-img-${i}"></div><div class="hashtag-src-text"><div class="hashtag-src-title">${esc(s.title)}</div><div class="hashtag-src-via">${esc(s.via||'')} · <span style="color:#f0c040;font-size:9px">#${esc(s._topic||'')}</span></div></div></div>`;
 
 
 
 
40
  });
41
+ h+=`</div><div style="display:flex;gap:4px;flex-wrap:wrap;margin-top:8px">`;
42
+ topicList.forEach(t=>{h+=`<button class="hot-chip" onclick="searchTopic('${t.replace(/'/g,"\\'")}')" style="font-size:10px">🔍 #${esc(t)}</button>`;});
 
 
 
 
 
 
 
 
43
  h+=`</div></div>`;
44
  box.innerHTML=h;
45
  // Lazy load images
46
+ all.slice(0,12).forEach((s,i)=>{if(!s.url)return;fetch('/api/article?url='+encodeURIComponent(s.url)).then(r=>r.json()).then(d=>{if(d&&(d.og_image||d.img)){const el=document.getElementById('ht-img-'+i);if(el)el.innerHTML=`<img src="${esc(d.og_image||d.img)}" onerror="this.style.display='none'">`;}}).catch(()=>{});});
47
+ _htTopic=topicList[0];
48
+ }catch(e){box.innerHTML=`<div class="hashtag-sources"><h3>🔥 Tin HOT</h3><div style="color:#e74c3c;padding:8px">Lỗi tải tin</div></div>`;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }