// settings.js // DOM refs const memosUrlInput = document.getElementById("memos-url"); const apiTokenInput = document.getElementById("api-token"); const visibilitySelect = document.getElementById("visibility"); const clipModeSelect = document.getElementById("clip-mode"); const includeImagesCheck = document.getElementById("include-images"); const includeTagsCheck = document.getElementById("include-tags"); const saveBtn = document.getElementById("save-btn"); const saveDefaultsBtn = document.getElementById("save-defaults-btn"); const testBtn = document.getElementById("test-btn"); const statusEl = document.getElementById("status"); const defaultsStatusEl = document.getElementById("defaults-status"); async function load() { const s = await chrome.storage.sync.get([ "memosUrl", "apiToken", "visibility", "clipMode", "includeImages", "includeTags" ]); if (s.memosUrl) memosUrlInput.value = s.memosUrl; if (s.apiToken) apiTokenInput.value = s.apiToken; if (s.visibility) visibilitySelect.value = s.visibility; if (s.clipMode) clipModeSelect.value = s.clipMode; if (s.includeImages !== undefined) includeImagesCheck.checked = s.includeImages; if (s.includeTags !== undefined) includeTagsCheck.checked = s.includeTags; } function showStatus(el, ok, msg) { el.textContent = msg; el.className = `status ${ok ? "ok" : "err"}`; el.classList.remove("hidden"); } saveBtn.addEventListener("click", async () => { const url = memosUrlInput.value.trim().replace(/\/$/, ""); const token = apiTokenInput.value.trim(); if (!url || !token) { showStatus(statusEl, false, "URL and token are required."); return; } await chrome.storage.sync.set({ memosUrl: url, apiToken: token }); showStatus(statusEl, true, "✓ Saved."); }); saveDefaultsBtn.addEventListener("click", async () => { await chrome.storage.sync.set({ visibility: visibilitySelect.value, clipMode: clipModeSelect.value, includeImages: includeImagesCheck.checked, includeTags: includeTagsCheck.checked, }); showStatus(defaultsStatusEl, true, "✓ Defaults saved."); }); testBtn.addEventListener("click", async () => { const url = memosUrlInput.value.trim().replace(/\/$/, ""); const token = apiTokenInput.value.trim(); testBtn.textContent = "Testing…"; try { const res = await fetch(`${url}/api/v1/memos?pageSize=1`, { headers: { Authorization: `Bearer ${token}` } }); if (res.ok) { showStatus(statusEl, true, `✓ Connected! (HTTP ${res.status})`); } else { const txt = await res.text(); showStatus(statusEl, false, `✗ HTTP ${res.status}: ${txt.slice(0, 120)}`); } } catch (e) { showStatus(statusEl, false, `✗ ${e.message}`); } finally { testBtn.textContent = "Test Connection"; } }); load();