import { useMemo, useState } from "react" import { Badge } from "../../../components/ui/badge" import { cn } from "../../../lib/utils" import { renderEmailTemplatePreview, } from "../../../lib/emailTemplatePreview" import type { EmailTemplatePreviewSource } from "../../../types/emailTemplate.types" type PreviewMode = "rendered-html" | "rendered-text" | "source-html" | "source-text" export function EmailTemplatePreviewPanel({ source, }: { source: EmailTemplatePreviewSource }) { const [mode, setMode] = useState("rendered-html") const variables = source.variables ?? [] const renderedText = useMemo( () => renderEmailTemplatePreview(source.body_text, variables), [source.body_text, variables], ) const renderedHtml = useMemo( () => renderEmailTemplatePreview(source.body_html, variables), [source.body_html, variables], ) const renderedSubject = useMemo( () => renderEmailTemplatePreview(source.subject, variables), [source.subject, variables], ) const tabs: { id: PreviewMode; label: string }[] = [ { id: "rendered-html", label: "HTML preview" }, { id: "rendered-text", label: "Plain text preview" }, { id: "source-html", label: "HTML source" }, { id: "source-text", label: "Text source" }, ] return (

Subject

{renderedSubject}

Source: {source.subject}

Template variables

{variables.map((v) => ( {`{{.${v}}}`} ))}

HTML and text previews use sample placeholder values for variables (not live sends).

{tabs.map((tab) => ( ))}
{mode === "rendered-html" ? (