Files
byre/web/dist/app.js
T

80 lines
3.0 KiB
JavaScript

import { get, put, subscribe } from "./api.js";
import { errorText, h, replace, showAlert } from "./dom.js";
import { mountNavbar } from "./navbar.js";
import { leadPane, taskPane } from "./panes.js";
import { handleEvent, loadFocus, loadInbox, loadLeadSessions, loadMe, loadProjects, notify, on, selectTask, setFocus, startLeadStream, state } from "./state.js";
function identityBanner(root) {
const render = () => {
const me = state.me;
if (!me || (me.git_name && me.git_email)) {
replace(root);
root.hidden = true;
return;
}
const name = h("input", { placeholder: "Git name", value: me.display_name, required: true });
const email = h("input", { type: "email", placeholder: "Git email", required: true });
const form = h("form", { class: "inline-form" }, "Set the identity agents commit as: ", name, email, h("button", { type: "submit" }, "Save"));
form.onsubmit = async (e) => {
e.preventDefault();
try {
state.me = await put("/api/me", { body: { git_name: name.value, git_email: email.value } });
render();
}
catch (err) {
void showAlert(errorText(err));
}
};
root.hidden = false;
replace(root, form);
};
on("me", render);
render();
}
function route() {
const match = /^#\/task\/(\w+)$/.exec(location.hash);
const taskId = match?.[1];
if (taskId !== state.focus.task_id) {
setFocus({ task_id: taskId ?? null }).catch((err) => console.error("set focus", err));
}
if (taskId !== state.selectedTaskId) {
selectTask(taskId);
}
}
async function main() {
const navbar = h("header", { class: "navbar" });
const banner = h("div", { class: "banner", hidden: true });
const status = await get("/api/admin/status");
await Promise.all([loadMe(), loadProjects(), loadInbox(), loadLeadSessions()]);
const linked = location.hash;
await loadFocus();
if (/^#\/task\/\w+$/.test(linked)) {
location.hash = linked;
}
startLeadStream();
replace(document.body, navbar, banner, h("div", { class: "panes" }, leadPane(), taskPane()));
mountNavbar(navbar);
identityBanner(banner);
addEventListener("keydown", (e) => {
if (e.key !== "Escape") {
return;
}
e.preventDefault();
document.querySelector("dialog[open]")?.close();
}, { capture: true });
subscribe(status.last_event_seq, {}, handleEvent, (connected) => {
state.connected = connected;
notify("connection");
});
addEventListener("hashchange", route);
route();
if ("serviceWorker" in navigator) {
navigator.serviceWorker.onmessage = (e) => {
location.hash = new URL(e.data.open, location.origin).hash;
};
await navigator.serviceWorker.register("/sw.js");
}
}
main().catch((err) => {
replace(document.body, h("pre", { class: "fatal" }, `byre failed to start: ${errorText(err)}`));
});
//# sourceMappingURL=app.js.map