finance-tools/extension/popup.js

79 lines
2.9 KiB
JavaScript

let apiHost = "http://localhost:3000";
function $(id) { return document.getElementById(id); }
async function checkServer() {
const host = $("api-host").value.trim() || apiHost;
apiHost = host;
try {
const res = await fetch(`${host}/api/health`, { signal: AbortSignal.timeout(3000) });
if (res.ok) {
const data = await res.json();
$("server-status").textContent = `✓ 已連線 (knowledge: ${data.knowledge ? "✓" : "✕"})`;
$("server-badge").textContent = "OK";
$("server-badge").className = "badge badge-ok";
} else {
$("server-status").textContent = `✕ 伺服器回應 ${res.status}`;
$("server-badge").className = "badge badge-warn";
}
} catch (err) {
$("server-status").textContent = `✕ 無法連線: ${err.message.slice(0, 30)}`;
$("server-badge").className = "badge badge-warn";
}
}
async function getCurrentTab() {
const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
return tabs[0];
}
async function updatePageInfo() {
const tab = await getCurrentTab();
if (!tab) return;
const url = tab.url || "";
const title = tab.title || "";
if (url.includes("youtube.com/watch") || url.includes("youtu.be")) {
$("page-info").innerHTML = `🎬 YouTube 影片<br/><span class="text-dim">${title.slice(0, 60)}</span>`;
$("btn-capture").style.display = "block";
$("btn-capture").textContent = "📥 擷取此影片";
$("btn-capture").onclick = async () => {
try {
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
await chrome.tabs.sendMessage(tab.id, { action: "capture" });
$("capture-result").textContent = "✓ 已觸發擷取,請查看頁面按鈕狀態";
} catch (err) {
$("capture-result").textContent = `${err.message}`;
}
};
} else if (url.includes("hyread")) {
$("page-info").innerHTML = `📖 HyRead 閱讀器<br/><span class="text-dim">${title.slice(0, 60)}</span>`;
$("btn-capture").style.display = "block";
$("btn-capture").textContent = "📖 擷取此書籍";
$("btn-capture").onclick = async () => {
try {
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
await chrome.tabs.sendMessage(tab.id, { action: "capture" });
$("capture-result").textContent = "✓ 已觸發擷取,請查看頁面按鈕狀態";
} catch (err) {
$("capture-result").textContent = `${err.message}`;
}
};
} else {
$("page-info").textContent = `目前頁面: ${title.slice(0, 40)} (不支援此頁面)`;
$("btn-capture").style.display = "none";
}
}
$("api-host").addEventListener("change", checkServer);
document.addEventListener("DOMContentLoaded", async () => {
const stored = await chrome.storage.local.get("apiHost");
if (stored.apiHost) {
$("api-host").value = stored.apiHost;
}
checkServer();
updatePageInfo();
});