// retoor <retoor@molodetz.nl>
import { Http } from "./Http.js";
import { JobPoller } from "./JobPoller.js";
export class IssueReporter {
constructor() {
this.active = false;
document.addEventListener("submit", (event) => {
const form = event.target.closest("form[data-issue-create]");
if (!form) return;
event.preventDefault();
this.submit(form);
});
}
async submit(form) {
if (this.active) return;
const title = form.querySelector("[name='title']").value.trim();
const description = form.querySelector("[name='description']").value.trim();
if (!title || !description) {
window.app.toast.show("Title and description are required", { type: "error" });
return;
}
const uidsInput = form.querySelector("[name='attachment_uids']");
const attachmentUids = uidsInput ? uidsInput.value : "";
this.active = true;
const button = form.querySelector("button[type='submit']");
if (button) {
button.disabled = true;
button.classList.add("is-loading");
}
window.app.toast.show("Filing your report and improving it with AI...", {
type: "info",
ms: 5000,
});
try {
const job = await Http.sendForm(form.action, {
title,
description,
attachment_uids: attachmentUids,
});
await this.poll(job.status_url);
} catch (error) {
window.app.toast.show("Could not submit the report", { type: "error" });
} finally {
this.active = false;
if (button) {
button.disabled = false;
button.classList.remove("is-loading");
}
}
}
poll(statusUrl) {
return JobPoller.run(statusUrl, {
onDone: (status) => {
window.app.toast.show("Issue report filed", { type: "success" });
window.location.href = status.issue_url || "/issues";
},
onFailed: (status) => {
window.app.toast.show(
"Report failed: " + (status.error || "unknown error"),
{ type: "error" },
);
},
onTimeout: () =>
window.app.toast.show("Report is still processing", { type: "info" }),
});
}
}