import React from 'react'; import { EmailTemplate } from '../types'; import { Plus, Edit, Trash2, FileCode, Search, Database, ArrowRightCircle, Code, CopyPlus, Key } from 'lucide-react'; import { generateSelectSQL, generateN8nCode, generateTemplateKey } from '../services/storage'; interface Props { templates: EmailTemplate[]; onCreate: () => void; onEdit: (t: EmailTemplate) => void; onClone: (t: EmailTemplate) => void; onDelete: (id: string) => void; } const TemplateList: React.FC = ({ templates, onCreate, onEdit, onClone, onDelete }) => { const [search, setSearch] = React.useState(''); const filtered = templates.filter(t => t.name.toLowerCase().includes(search.toLowerCase()) || t.subject.toLowerCase().includes(search.toLowerCase()) ); const copySelectSQL = (t: EmailTemplate, e: React.MouseEvent) => { e.stopPropagation(); const sql = generateSelectSQL(t); navigator.clipboard.writeText(sql); alert('SELECT query copied! Use this in your n8n SQL node.'); }; const copyN8nCode = (t: EmailTemplate, e: React.MouseEvent) => { e.stopPropagation(); const code = generateN8nCode(t); navigator.clipboard.writeText(code); alert('JS Code copied! Paste this into your n8n Code node.'); }; const copyTemplateKey = (t: EmailTemplate, e: React.MouseEvent) => { e.stopPropagation(); const key = generateTemplateKey(t.name); navigator.clipboard.writeText(key); alert(`Template Key '${key}' copied to clipboard!`); }; return (

Email Templates

Manage HTML templates for your n8n workflows

setSearch(e.target.value)} className="pl-10 w-full md:w-96 px-4 py-2 border border-slate-200 rounded-lg focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none text-slate-700 bg-white shadow-sm" />
{filtered.length === 0 ? (

No templates found

Get started by creating your first HTML email template for automation.

) : (
{filtered.map(t => (
onEdit(t)} className="bg-white rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow cursor-pointer group flex flex-col h-60" >

{t.name}

{new Date(t.updatedAt).toLocaleDateString()}

{t.description || 'No description provided.'}

Subject:
{t.subject}
{t.variables.slice(0, 3).map(v => ( {/* Explicitly building the string to avoid rendering issues */} {'{{' + v + '}}'} ))} {t.variables.length > 3 && ( + {t.variables.length - 3} more )}
))}
)}
); }; export default TemplateList;