import React, { useState, useEffect } from "react"; import { UseFormReturn } from "react-hook-form"; import { FormField, FormItem, FormLabel, FormControl, FormMessage, FormDescription, } from "@/components/ui/form"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Trash2, Plus } from "lucide-react"; import { ListmonkTemplate } from "@/lib/types"; import Link from "next/link"; interface TransactionalEmailActionFieldsProps { form: UseFormReturn; index: number; templates: ListmonkTemplate[]; } interface Header { key: string; value: string; } interface EditingField { key: string; newKey: string; value: string; } export function TransactionalEmailActionFields({ form, index, templates, }: TransactionalEmailActionFieldsProps) { const [localData, setLocalData] = useState>({}); const [editingField, setEditingField] = useState(null); useEffect(() => { const formData = form.getValues(`actions.${index}.parameters.data`); if (formData && Object.keys(formData).length > 0) { setLocalData(formData); } }, [form, index]); const addDataField = () => { const newKey = `newField${Object.keys(localData).length}`; setLocalData((prev) => ({ ...prev, [newKey]: "" })); setEditingField({ key: newKey, newKey: newKey, value: "" }); }; const removeDataField = (keyToRemove: string) => { setLocalData((prev) => { const newData = { ...prev }; delete newData[keyToRemove]; return newData; }); setEditingField(null); }; const handleKeyChange = (oldKey: string, newKey: string) => { setEditingField((prev) => (prev ? { ...prev, newKey } : null)); }; const handleValueChange = (key: string, value: string) => { setLocalData((prev) => ({ ...prev, [key]: value })); }; const handleKeyBlur = () => { if (editingField && editingField.key !== editingField.newKey) { setLocalData((prev) => { const newData = { ...prev }; delete newData[editingField.key]; newData[editingField.newKey] = editingField.value; return newData; }); } setEditingField(null); }; useEffect(() => { form.setValue(`actions.${index}.parameters.data`, localData); }, [localData, form, index]); return ( <> {/* Template selection field remains unchanged */} ( Template Check the available template expressions in this link -{" "} https://listmonk.app/docs/templating )} /> ( Headers
{((field.value as Header[]) || []).map((header, headerIndex) => (
) => { const newHeaders = [...(field.value as Header[])]; newHeaders[headerIndex].key = e.target.value; field.onChange(newHeaders); }} /> ) => { const newHeaders = [...(field.value as Header[])]; newHeaders[headerIndex].value = e.target.value; field.onChange(newHeaders); }} />
))}
Headers will be added on the email, you can use this to track campaigns.
)} /> ( Additional Data
{Object.entries(localData).map(([key, value]) => (
) => handleKeyChange(key, e.target.value) } onFocus={() => setEditingField({ key, newKey: key, value })} onBlur={handleKeyBlur} /> ) => handleValueChange(key, e.target.value) } />
))}

Enter any additional data for the transactional email.

Available in the template as{" "} {{ .Tx.Data.* }}

)} /> ); }