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());
});