From 996e448b0343b14b8c61aa3aef3c5197bb77a500 Mon Sep 17 00:00:00 2001 From: 0xBuooy Date: Mon, 18 May 2026 16:34:06 +0800 Subject: [PATCH] Add HTML signature settings Add a mailbox settings UI for enabling HTML email signatures, editing the signature markup, and previewing the sanitized rendered output. Persist the signature through the existing mailbox settings shape and initialize new mailboxes with an explicit html signature field so compose flows can use the existing getSignatureBlock support. --- app/routes/settings.tsx | 53 +++++++++++++++++++++++++++++++++++++++++ workers/index.ts | 2 +- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/routes/settings.tsx b/app/routes/settings.tsx index a4634cda..5274bb0a 100644 --- a/app/routes/settings.tsx +++ b/app/routes/settings.tsx @@ -4,6 +4,7 @@ import { Badge, Button, Input, Loader, useKumoToastManager } from "@cloudflare/kumo"; import { RobotIcon, ArrowCounterClockwiseIcon } from "@phosphor-icons/react"; +import DOMPurify from "dompurify"; import { useEffect, useState } from "react"; import { useParams } from "react-router"; import { useMailbox, useUpdateMailbox } from "~/queries/mailboxes"; @@ -20,12 +21,16 @@ export default function SettingsRoute() { const [displayName, setDisplayName] = useState(""); const [agentPrompt, setAgentPrompt] = useState(""); + const [signatureEnabled, setSignatureEnabled] = useState(false); + const [signatureHtml, setSignatureHtml] = useState(""); const [isSaving, setIsSaving] = useState(false); useEffect(() => { if (mailbox) { setDisplayName(mailbox.settings?.fromName || mailbox.name || ""); setAgentPrompt(mailbox.settings?.agentSystemPrompt || ""); + setSignatureEnabled(mailbox.settings?.signature?.enabled || false); + setSignatureHtml(mailbox.settings?.signature?.html || ""); } }, [mailbox]); @@ -36,6 +41,12 @@ export default function SettingsRoute() { ...mailbox.settings, fromName: displayName, agentSystemPrompt: agentPrompt.trim() || undefined, + signature: { + ...mailbox.settings?.signature, + enabled: signatureEnabled, + text: mailbox.settings?.signature?.text || "", + html: signatureHtml.trim() || undefined, + }, }; try { await updateMailboxMutation.mutateAsync({ mailboxId, settings }); @@ -63,6 +74,7 @@ export default function SettingsRoute() { } const isCustomPrompt = agentPrompt.trim().length > 0; + const signaturePreviewHtml = DOMPurify.sanitize(signatureHtml); return (
@@ -84,6 +96,47 @@ export default function SettingsRoute() {
+ {/* Signature */} +
+
+ Signature +
+
+ +
+ +