nose-pluto/src/js/form.ts
2025-10-01 22:16:38 -07:00

49 lines
1.1 KiB
TypeScript

////
// All forms are submitted via ajax.
import type { CommandResult, CommandOutput } from "../shared/types"
import { sessionId } from "./session"
import { setStatus, replaceOutput } from "./scrollback"
import { focusInput } from "./focus"
export function initForm() {
document.addEventListener("submit", submitHandler)
}
export const submitHandler = async (e: SubmitEvent) => {
e.preventDefault()
const form = e.target
if (!(form instanceof HTMLFormElement)) return
const li = form.closest(".output")
if (!(li instanceof HTMLLIElement)) return
const id = li.dataset.id
if (!id) return
let output: CommandOutput
let error = false
try {
const fd = new FormData(form)
const data: CommandResult = await fetch("/cmd" + new URL(form.action).pathname, {
method: "POST",
headers: { "X-Session": sessionId }, // don't set Content-Type manually
body: fd
}).then(r => r.json())
output = data.output
error = data.status === "error"
} catch (e: any) {
output = e.message || e.toString()
error = true
}
if (error) setStatus(id, "error")
replaceOutput(id, output)
focusInput()
}