import { getClient, checkStaff, signIn, signInWithGoogle, signOut, fetchYbMetrics, fetchReports, downloadCsv, escapeHtml, adminSetBusinessVerified, fetchBusinessLocationClaims, adminReviewBusinessLocationClaim, } from "./admin-core.mjs"; var el = function (id) { return document.getElementById(id); }; function show(id, on) { var n = el(id); if (n) n.hidden = !on; } function setLoginFormEnabled(on) { var form = el("form-login"); if (!form) return; form.querySelectorAll("input").forEach(function (inp) { inp.disabled = !on; if (on) { inp.setAttribute("required", "required"); } else { inp.removeAttribute("required"); } }); var btn = el("btn-login-submit"); if (btn) btn.disabled = !on; var gbtn = el("btn-login-google"); if (gbtn) gbtn.disabled = !on; } function updateHeaderNav(dashVisible) { var b = el("btn-show-login"); if (b) b.hidden = !!dashVisible; } function scrollToLogin() { var sec = el("login-section"); if (sec) sec.scrollIntoView({ behavior: "smooth", block: "start" }); var em = el("in-email"); if (em && !em.disabled) em.focus(); } async function refresh() { var err = el("load-error"); if (err) { err.textContent = ""; err.hidden = true; } try { var m = await fetchYbMetrics(); el("m-reports-24h").textContent = m.reports_24h ?? "—"; el("m-reports-7d").textContent = m.reports_7d ?? "—"; el("m-crashes-7d").textContent = m.crashes_7d ?? "—"; el("m-bugs-7d").textContent = m.bugs_7d ?? "—"; el("m-feedback-7d").textContent = m.feedback_7d ?? "—"; el("m-vibes-24h").textContent = m.vibes_with_profile_24h ?? "—"; el("m-vibes-7d").textContent = m.vibes_with_profile_7d ?? "—"; el("m-by-kind").textContent = JSON.stringify(m.by_kind_7d || {}, null, 2); el("m-by-platform").textContent = JSON.stringify(m.by_platform_7d || {}, null, 2); var rows = await fetchReports(200); var tbody = el("reports-body"); if (tbody) { tbody.innerHTML = rows .map(function (r) { return ( "" + escapeHtml(String(r.created_at || "").replace("T", " ").slice(0, 19)) + "" + escapeHtml(r.report_kind) + "" + escapeHtml((r.title || "").slice(0, 40)) + "" + escapeHtml((r.body || "").slice(0, 200)) + "" + escapeHtml(r.platform || "") + "" + escapeHtml(r.app_version || "") + "" ); }) .join(""); } var bx = el("btn-export"); if (bx) { bx.onclick = function () { downloadCsv("yb-reports.csv", rows, [ { key: "created_at", get: function (r) { return r.created_at; } }, { key: "report_kind", get: function (r) { return r.report_kind; } }, { key: "title", get: function (r) { return r.title; } }, { key: "body", get: function (r) { return r.body; } }, { key: "platform", get: function (r) { return r.platform; } }, { key: "app_version", get: function (r) { return r.app_version; } }, { key: "user_id", get: function (r) { return r.user_id; } }, ]); }; } } catch (e) { if (err) { err.textContent = String(e.message || e); err.hidden = false; } } } async function refreshBusinessClaims() { var err = el("business-claims-error"); if (err) { err.textContent = ""; err.hidden = true; } try { var sel = el("business-claim-status"); var st = sel && sel.value ? String(sel.value) : ""; var rows = await fetchBusinessLocationClaims(st === "" ? null : st); var tbody = el("business-claims-body"); if (tbody) { tbody.innerHTML = (rows || []) .map(function (r) { var rawId = String(r.id || ""); var when = escapeHtml(String(r.created_at || "").replace("T", " ").slice(0, 19)); var h = escapeHtml(r.profile_handle || ""); var dn = escapeHtml(r.display_name || ""); var stt = escapeHtml(r.status || ""); var notes = escapeHtml((r.proof_notes || "").slice(0, 120)); var lat = r.lat != null ? Number(r.lat).toFixed(4) : ""; var lon = r.lon != null ? Number(r.lon).toFixed(4) : ""; var paths = Array.isArray(r.photo_paths) ? r.photo_paths.length : 0; var actions = r.status === "pending" ? " " : "—"; return ( "" + when + "" + h + "" + dn + "" + stt + "" + notes + (paths ? " (" + paths + " photos)" : "") + "" + escapeHtml(lat + "," + lon) + "" + actions + "" ); }) .join(""); tbody.querySelectorAll("[data-approve]").forEach(function (btn) { btn.addEventListener("click", async function () { var id = btn.getAttribute("data-approve"); var note = window.prompt("Optional admin note (shown internally):", "") || ""; try { await adminReviewBusinessLocationClaim(id, true, note || null); await refreshBusinessClaims(); } catch (e) { alert(String(e.message || e)); } }); }); tbody.querySelectorAll("[data-reject]").forEach(function (btn) { btn.addEventListener("click", async function () { var id = btn.getAttribute("data-reject"); var note = window.prompt("Rejection reason (optional):", "") || ""; try { await adminReviewBusinessLocationClaim(id, false, note || null); await refreshBusinessClaims(); } catch (e) { alert(String(e.message || e)); } }); }); } } catch (e) { if (err) { err.textContent = String(e.message || e); err.hidden = false; } } } async function gate() { var hint = el("login-config-hint"); var hasConfig = !!getClient(); if (hint) hint.hidden = hasConfig; if (!hasConfig) { show("config-error", true); setLoginFormEnabled(false); show("login-section", true); show("dash", false); show("denied", false); updateHeaderNav(false); return; } show("config-error", false); setLoginFormEnabled(true); var session = await getClient().auth.getSession(); if (!session.data.session) { show("login-section", true); show("dash", false); show("denied", false); updateHeaderNav(false); return; } var ok = await checkStaff(); if (!ok) { show("login-section", false); show("denied", true); show("dash", false); updateHeaderNav(false); return; } show("denied", false); show("login-section", false); show("dash", true); updateHeaderNav(true); var ue = el("user-email"); if (ue) ue.textContent = session.data.session.user.email || ""; await refresh(); await refreshBusinessClaims(); } function wire() { var form = el("form-login"); if (form) { form.addEventListener("submit", async function (ev) { ev.preventDefault(); var le = el("login-error"); if (le) le.textContent = ""; try { await signIn(el("in-email").value, el("in-password").value); await gate(); } catch (e) { if (le) le.textContent = String(e.message || e); } }); } var googleBtn = el("btn-login-google"); if (googleBtn) { googleBtn.addEventListener("click", async function () { var le = el("login-error"); if (le) le.textContent = ""; try { await signInWithGoogle(); } catch (e) { if (le) le.textContent = String(e.message || e); } }); } var lo = el("btn-logout"); if (lo) { lo.addEventListener("click", async function () { await signOut(); show("dash", false); show("denied", false); show("login-section", true); setLoginFormEnabled(!!getClient()); updateHeaderNav(false); }); } var br = el("btn-refresh"); if (br) br.addEventListener("click", function () { refresh(); refreshBusinessClaims(); }); var bv = el("btn-business-verify"); if (bv) { bv.addEventListener("click", async function () { var pid = (el("business-profile-id") && el("business-profile-id").value) || ""; pid = pid.trim(); var msg = el("business-verify-msg"); if (msg) { msg.textContent = ""; } if (!pid) { if (msg) msg.textContent = "Enter a profile UUID."; return; } try { await adminSetBusinessVerified(pid, true); if (msg) msg.textContent = "Verified."; } catch (e) { if (msg) msg.textContent = String(e.message || e); } }); } var bu = el("btn-business-unverify"); if (bu) { bu.addEventListener("click", async function () { var pid = (el("business-profile-id") && el("business-profile-id").value) || ""; pid = pid.trim(); var msg = el("business-verify-msg"); if (msg) { msg.textContent = ""; } if (!pid) { if (msg) msg.textContent = "Enter a profile UUID."; return; } try { await adminSetBusinessVerified(pid, false); if (msg) msg.textContent = "Verification cleared."; } catch (e) { if (msg) msg.textContent = String(e.message || e); } }); } var bcl = el("btn-business-claims-load"); if (bcl) bcl.addEventListener("click", function () { refreshBusinessClaims(); }); var showBtn = el("btn-show-login"); if (showBtn) { showBtn.addEventListener("click", function () { show("login-section", true); show("denied", false); scrollToLogin(); }); } var retry = el("btn-denied-retry"); if (retry) { retry.addEventListener("click", async function () { await signOut(); show("denied", false); show("login-section", true); setLoginFormEnabled(!!getClient()); updateHeaderNav(false); scrollToLogin(); }); } var sentry = window.ADMIN_SENTRY_ISSUES_URL; if (sentry) { var sl = el("link-sentry"); if (sl) { sl.href = sentry; sl.hidden = false; } } } wire(); gate().catch(function (e) { console.error(e); var le = el("login-error"); if (le) le.textContent = "Failed to initialize: " + String(e.message || e); show("login-section", true); setLoginFormEnabled(!!getClient()); });