import React, { useState, useEffect, useCallback } from 'react'; import { EmailTemplate } from '../types'; import { saveTemplate, generateSQL, generateSelectSQL, getTemplates, generateTemplateKey, generateN8nCode } from '../services/storage'; import { generateEmailContent } from '../services/geminiService'; import RichTextEditor from './RichTextEditor'; import { Save, ArrowLeft, Eye, Database, Wand2, Copy, Check, Code } from 'lucide-react'; interface Props { templateId?: string; initialTemplate?: EmailTemplate; onBack: () => void; onSave: () => void; } const DEFAULT_HEADER = `

La Mia Azienda

`; const DEFAULT_BODY = `

Gentile {{first_name}},

Questo è un messaggio di default.

`; const DEFAULT_FOOTER = `

© 2024 La Mia Azienda. Tutti i diritti riservati.

`; const Editor: React.FC = ({ initialTemplate, onBack, onSave }) => { const [name, setName] = useState(initialTemplate?.name || 'Nuovo Template'); const [description, setDescription] = useState(initialTemplate?.description || ''); const [subject, setSubject] = useState(initialTemplate?.subject || 'Benvenuti nel nostro servizio'); const [header, setHeader] = useState(initialTemplate?.header || DEFAULT_HEADER); const [body, setBody] = useState(initialTemplate?.body || DEFAULT_BODY); const [footer, setFooter] = useState(initialTemplate?.footer || DEFAULT_FOOTER); const [activeTab, setActiveTab] = useState<'header' | 'body' | 'footer'>('body'); const [showSqlModal, setShowSqlModal] = useState(false); const [detectedVars, setDetectedVars] = useState([]); const [isGenerating, setIsGenerating] = useState(false); const [isSaving, setIsSaving] = useState(false); const [aiPrompt, setAiPrompt] = useState(''); const [showAiModal, setShowAiModal] = useState(false); const [nameError, setNameError] = useState(''); // Variable detection logic const detectVariables = useCallback(() => { const regex = /\{\{([\w\d_-]+)\}\}/g; const allText = `${subject} ${header} ${body} ${footer}`; const matches = [...allText.matchAll(regex)]; const uniqueVars = Array.from(new Set(matches.map(m => m[1]))); setDetectedVars(uniqueVars); }, [header, body, footer, subject]); useEffect(() => { detectVariables(); }, [detectVariables]); // Clear name error when typing useEffect(() => { if (nameError) setNameError(''); }, [name]); const handleSave = async () => { const newKey = generateTemplateKey(name); if (!newKey) { setNameError('Il nome del template non può essere vuoto o contenere solo simboli.'); alert('Il nome del template non può essere vuoto.'); return; } setIsSaving(true); try { // Check for duplicates const allTemplates = await getTemplates(); const isDuplicate = allTemplates.some(t => { // Exclude current template if we are editing if (initialTemplate && t.id === initialTemplate.id) return false; return generateTemplateKey(t.name) === newKey; }); if (isDuplicate) { setNameError('Esiste già un template con questo nome.'); alert('Un template con questo nome (o ID risultante) esiste già. Per favore scegli un nome univoco.'); setIsSaving(false); return; } const newTemplate: EmailTemplate = { id: initialTemplate?.id || crypto.randomUUID(), name, description, subject, header, body, footer, variables: detectedVars, updatedAt: new Date().toISOString() }; await saveTemplate(newTemplate); onSave(); } catch (e) { alert("Impossibile salvare il template. Controlla i log del server."); } finally { setIsSaving(false); } }; const handleAiGenerate = async () => { if (!aiPrompt.trim()) return; setIsGenerating(true); try { const generated = await generateEmailContent(aiPrompt, activeTab); if (activeTab === 'header') setHeader(generated); if (activeTab === 'body') setBody(generated); if (activeTab === 'footer') setFooter(generated); setShowAiModal(false); setAiPrompt(''); } catch (e) { alert("Errore nella generazione del contenuto. Controlla la configurazione della API Key."); } finally { setIsGenerating(false); } }; const tempTemplateObj = { id: initialTemplate?.id || 'ANTEPRIMA', name, description, subject, header, body, footer, variables: detectedVars, updatedAt: '' }; const currentInsertSql = showSqlModal ? generateSQL(tempTemplateObj) : ''; const currentSelectSql = showSqlModal ? generateSelectSQL(tempTemplateObj) : ''; const currentN8nCode = showSqlModal ? generateN8nCode(tempTemplateObj) : ''; const getActiveContent = () => { switch (activeTab) { case 'header': return header; case 'body': return body; case 'footer': return footer; } }; const setActiveContent = (val: string) => { switch (activeTab) { case 'header': setHeader(val); break; case 'body': setBody(val); break; case 'footer': setFooter(val); break; } }; // Maps internal tab keys to Italian display names const tabNames: Record = { header: 'Testata', body: 'Corpo', footer: 'Piè di pagina' }; return (
{/* Top Bar */}

{initialTemplate ? 'Modifica Template' : 'Crea Template'}

{/* Left: Inputs */}
{/* Metadata */}
setName(e.target.value)} className={`w-full px-3 py-2 border rounded-md focus:ring-2 focus:ring-brand-500 outline-none bg-white ${nameError ? 'border-red-500 focus:border-red-500' : 'border-slate-300 focus:border-brand-500'}`} placeholder="es. Email di Benvenuto" /> {nameError &&

{nameError}

}

Deve essere univoco. Usato per generare la chiave DB: {generateTemplateKey(name) || '...'}