import { api } from "../api.js"; import { centerActiveChips, emptyState, sectionHeader } from "../components.js"; import { lineChart, themeColor } from "../charts.js"; import { escapeAttr, escapeHtml, formatCount, formatDate, formatDelta, } from "../format.js"; import { replaceQuery } from "../router.js"; const RANGES = [["7", "7 天"], ["30", "30 天"], ["90", "90 天"], ["3650", "全部"]]; export async function renderFans(root, { query }) { const days = query.get("days") || "90"; const mid = query.get("mid"); const fans = await api("/api/fans", { days, mid }); const options = fans.options || []; root.innerHTML = `

粉丝

${escapeHtml(fans.name || "粉丝追踪")}

${options.length > 1 ? `` : ""}
${!fans.available ? emptyState("暂无粉丝数据", "每日快照完成后会开始记录粉丝数。") : `
当前粉丝 ${formatCount(fans.follower)} ${escapeHtml(fans.stat_date || "—")} · 首次记录 ${escapeHtml(fans.first_date || "—")}
日增${fans.delta_1d === null ? "—" : formatDelta(fans.delta_1d)}
7 日净增${fans.delta_7d === null ? "—" : formatDelta(fans.delta_7d)}
累计增长${formatDelta(fans.delta_cum)}
关注数${formatCount(fans.following)}
${sectionHeader("粉丝曲线")}
${RANGES.map(([value, label]) => ``).join("")}

只绘制粉丝数,不叠加 reaction 视频数据;缺失日断开,不插值。

${sectionHeader("最近记录")}
${(fans.points || []).slice().reverse().map((point) => ` `).join("")}
日期粉丝关注状态
${escapeHtml(point.stat_date)} ${point.ok ? formatCount(point.follower) : "—"} ${point.ok ? formatCount(point.following) : "—"} ${point.ok ? "成功" : "失败"}
`}
`; root.querySelectorAll("[data-days]").forEach((button) => button.addEventListener("click", () => { replaceQuery({ days: button.dataset.days }); })); root.querySelector("#fan-mid")?.addEventListener("change", (event) => { replaceQuery({ mid: event.target.value }); }); centerActiveChips(root); const chartElement = root.querySelector("#fans-chart"); if (chartElement) { lineChart(chartElement, { dates: fans.dates || [], values: fans.series || [], name: "粉丝", color: themeColor("accent"), scale: true, }); } }