// retoor 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" }), }); } }