/* 项目详情页逻辑: 项目头部 + release 时间线 + 最近 issues. */ import { fetchJson, escapeHtml, truncate, formatDate } from "../utils.js"; export function initProjectDetailPage(projectId) { projectId = Number.parseInt(projectId, 10); if (Number.isNaN(projectId)) { console.error("project-detail: invalid project id"); return; } async function loadProject() { const header = document.getElementById("projectHeader"); try { const p = await fetchJson(`/api/projects/${projectId}`); header.innerHTML = `

${escapeHtml(p.name)} ${escapeHtml(p.full_name || "")}

${escapeHtml(p.description || "暂无描述")}

⭐ Stars: ${p.stars ?? 0} 🍴 Forks: ${p.forks ?? 0} ${escapeHtml(p.language || "N/A")} 更新于 ${formatDate(p.updated_at)}

`; } catch (err) { console.error("加载项目信息失败:", err); header.innerHTML = '
加载失败,
'; } } async function loadReleases() { const list = document.getElementById("releaseTimeline"); try { const releases = await fetchJson(`/api/projects/${projectId}/releases`); if (!releases.length) { list.innerHTML = '
  • 暂无 release
  • '; return; } list.innerHTML = releases .map( (r) => `
  • ${escapeHtml(r.tag_name || r.name || "release")} ${formatDate(r.published_at)}
    ${escapeHtml(truncate(r.body, 200))}
  • ` ) .join(""); } catch (err) { console.error("加载 releases 失败:", err); list.innerHTML = '
  • 加载失败,
  • '; } } async function loadIssues() { const tbody = document.getElementById("issueTableBody"); try { const issues = await fetchJson(`/api/projects/${projectId}/issues`); if (!issues.length) { tbody.innerHTML = '暂无 issue'; return; } tbody.innerHTML = issues .map( (i) => ` ${escapeHtml(truncate(i.title, 60))} ${escapeHtml(i.state || "")} ${formatDate(i.created_at)} ${escapeHtml(i.user || "-")} ` ) .join(""); } catch (err) { console.error("加载 issues 失败:", err); tbody.innerHTML = '加载失败, '; } } document.addEventListener("DOMContentLoaded", () => { loadProject(); loadReleases(); loadIssues(); }); }