// Account-level pages: Support (live API), Settings (live API) const { useState: useStateO, useEffect: useEffectO } = React; function SupportPage({ ctx }) { const { t } = ctx; const [tickets, setTickets] = useStateO([]); const [loading, setLoading] = useStateO(true); const [creating, setCreating] = useStateO(false); const [subject, setSubject] = useStateO(""); const [body, setBody] = useStateO(""); const [viewing, setViewing] = useStateO(null); const [messages, setMessages] = useStateO([]); const [replyBody, setReplyBody] = useStateO(""); useEffectO(() => { loadTickets(); }, []); async function loadTickets() { try { const data = await ww.get("/tickets"); setTickets(data); } catch {} setLoading(false); } async function handleCreate(e) { e.preventDefault(); if (!subject.trim() || !body.trim()) return; try { await ww.post("/tickets", { subject: subject.trim(), body: body.trim() }); setSubject(""); setBody(""); setCreating(false); loadTickets(); } catch (err) { alert(err.message); } } async function openTicket(tk) { setViewing(tk); try { const data = await ww.get("/tickets/" + tk.id); setMessages(data.messages || []); } catch (err) { alert(err.message); } } async function handleReply() { if (!replyBody.trim() || !viewing) return; try { const msg = await ww.post("/tickets/" + viewing.id + "/reply", { body: replyBody.trim() }); setMessages([...messages, msg]); setReplyBody(""); loadTickets(); } catch (err) { alert(err.message); } } function fmtDate(ts) { return new Date(ts * 1000).toISOString().slice(0, 10); } function fmtTime(ts) { return new Date(ts * 1000).toISOString().replace("T", " ").slice(0, 19); } if (viewing) { return (
{ setViewing(null); setMessages([]); setReplyBody(""); }}>← {t.common.back || "Back"}

{viewing.subject}

{viewing.state}
{messages.map((msg, i) => (
0 ? "1px solid var(--line-2)" : "none", }}>
{msg.sender === "user" ? (t.support.you || "You") : (t.support.supportTeam || "Support")} {fmtTime(msg.created_at)}
{msg.body}
))} {messages.length === 0 &&
No messages.
}
{viewing.state === "open" && (
{t.support.reply || "Reply"}