import { useState } from "react"; import { LuPencil, LuPlus, LuTrash2, LuX } from "react-icons/lu"; import { errorMessage } from "../api/client.js"; import { useDeleteHttpPage, useHttpPages, useUpsertHttpPage, } from "../api/hooks.js"; import { ConfirmDialog } from "../components/ConfirmDialog.jsx"; import { formatTime } from "../lib/format"; const emptyForm = { name: "", content: "", mime: "html", status: 200, kind: "response", }; function kindLabel(kind) { return kind === "template" ? "HTML template" : "HTTP response"; } export function ResponsesPage() { const { data: pages = [], isLoading } = useHttpPages(); const upsert = useUpsertHttpPage(); const del = useDeleteHttpPage(); const [mode, setMode] = useState(null); const [form, setForm] = useState(emptyForm); const [confirmDelete, setConfirmDelete] = useState(null); function openAdd() { setMode("add"); setForm(emptyForm); } function openEdit(p) { setMode("edit"); setForm({ name: p.name, content: p.content, mime: p.mime, status: p.status, kind: p.kind ?? "response", system: Boolean(p.system), }); } function closeForm() { setMode(null); setForm(emptyForm); } function onSubmit(e) { e.preventDefault(); upsert.mutate( { name: form.name, content: form.content, mime: form.kind === "template" ? "html" : form.mime, status: Number(form.status) || 200, kind: form.kind, }, { onSuccess: closeForm }, ); } return (

Responses

Named HTML/JSON pages for HTTP trigger responses, or HTML templates for Mustache rendering in workflows. HTTP responses use{" "} response: name; templates use{" "} render-template.js with{" "} config.template: name.

{isLoading ? ( ) : pages.length === 0 ? (

No response pages yet.

) : (
{pages.map((p) => ( ))}
Name Kind Mime Status Updated
{p.name} {p.system ? ( system ) : null} {kindLabel(p.kind ?? "response")} {p.mime} {p.kind === "template" ? "—" : p.status} {formatTime(p.updated_at)}
)} {mode ? (
{mode === "add" ? "New page" : `Edit ${form.name}`}
setForm({ ...form, name: e.target.value })} required pattern="[A-Za-z0-9._-]+" title="Letters, numbers, dots, underscores, hyphens" disabled={mode === "edit"} /> {form.kind === "template" ? (

Templates use Mustache syntax ({"{{title}}"},{" "} {"{{#items}}"}) and are rendered by{" "} render-template.js.

) : null} {form.kind === "response" ? ( <> setForm({ ...form, status: e.target.value })} min={100} max={599} required /> ) : null}