import { useState, useEffect } from 'react'; import { Box, Button, Paper, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Chip, CircularProgress, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Switch, FormControlLabel, Tabs, Tab, } from '@mui/material'; import { Add, Edit, Delete, Preview, ContentCopy, AutoAwesome, Send as SendIcon, } from '@mui/icons-material'; import { templateService } from '../services/templateService'; import { format } from 'date-fns'; import axios from 'axios'; const API_URL = import.meta.env.VITE_API_URL; const defaultForm = { name: '', template_type: '', subject_template: '', body_html: '', description: '', active: true, }; function Templates() { const [templates, setTemplates] = useState([]); const [loading, setLoading] = useState(true); const [form, setForm] = useState(defaultForm); const [activeTab, setActiveTab] = useState('form'); const [dialogOpen, setDialogOpen] = useState(false); const [previewOpen, setPreviewOpen] = useState(false); const [previewHtml, setPreviewHtml] = useState(''); const [previewUrl, setPreviewUrl] = useState(''); const [previewLoading, setPreviewLoading] = useState(false); const [selectedTemplate, setSelectedTemplate] = useState(null); const [companyPlaceholder, setCompanyPlaceholder] = useState('Örnek Şirket'); const [employeePlaceholder, setEmployeePlaceholder] = useState('Ahmet Yılmaz'); const [aiDialogOpen, setAiDialogOpen] = useState(false); const [aiGenerating, setAiGenerating] = useState(false); const [aiForm, setAiForm] = useState({ company_name: '', scenario: '', employee_info: '', custom_prompt: '', template_name: '', template_type: '', }); const [testMailDialogOpen, setTestMailDialogOpen] = useState(false); const [testMailAddress, setTestMailAddress] = useState(''); useEffect(() => { loadTemplates(); }, []); const loadTemplates = async () => { try { setLoading(true); const response = await templateService.getAll(); setTemplates(response.data || []); } catch (error) { console.error('Failed to load templates:', error); alert('Şablonlar yüklenemedi'); setTemplates([]); } finally { setLoading(false); } }; const handleOpenCreate = () => { setSelectedTemplate(null); setForm(defaultForm); setActiveTab('form'); setDialogOpen(true); }; const handleOpenEdit = async (template) => { setSelectedTemplate(template); setForm({ name: template.name, template_type: template.template_type, subject_template: template.subject_template || '', body_html: template.body_html, description: template.description || '', active: Boolean(template.active), }); setActiveTab('form'); setDialogOpen(true); }; const handleCloseDialog = () => { setDialogOpen(false); setSelectedTemplate(null); if (previewUrl) { URL.revokeObjectURL(previewUrl); setPreviewUrl(''); } setPreviewHtml(''); setActiveTab('form'); }; const handleSave = async () => { try { if (selectedTemplate) { await templateService.update(selectedTemplate.id, form); alert('Şablon güncellendi'); } else { await templateService.create(form); alert('Şablon oluşturuldu'); } handleCloseDialog(); loadTemplates(); } catch (error) { const message = error.response?.data?.error || 'Şablon kaydedilemedi'; alert(message); console.error('Failed to save template:', error); } }; const handleDelete = async (template) => { if (!window.confirm(`${template.name} şablonunu silmek istediğinizden emin misiniz?`)) { return; } try { await templateService.delete(template.id); alert('Şablon silindi'); loadTemplates(); } catch (error) { const message = error.response?.data?.error || 'Şablon silinemedi'; alert(message); console.error('Failed to delete template:', error); } }; const handleGenerateWithAI = async () => { if (!aiForm.company_name || !aiForm.scenario || !aiForm.template_name || !aiForm.template_type) { alert('Lütfen tüm zorunlu alanları doldurun'); return; } setAiGenerating(true); try { const response = await axios.post( `${API_URL}/api/ollama/generate-template`, aiForm, { withCredentials: true } ); alert(response.data.message); setAiDialogOpen(false); setAiForm({ company_name: '', scenario: '', employee_info: '', custom_prompt: '', template_name: '', template_type: '', }); loadTemplates(); } catch (error) { const message = error.response?.data?.error || 'AI ile şablon oluşturulamadı'; alert(message); console.error('AI generation failed:', error); } finally { setAiGenerating(false); } }; const handleSendTestMail = async () => { if (!testMailAddress || !selectedTemplate) { alert('Lütfen mail adresi girin'); return; } try { await axios.post( `${API_URL}/api/ollama/send-test-mail`, { test_email: testMailAddress, subject: selectedTemplate.subject_template, body: selectedTemplate.body_html, company_name: companyPlaceholder, employee_name: employeePlaceholder, }, { withCredentials: true } ); alert('Test maili gönderildi!'); setTestMailDialogOpen(false); setTestMailAddress(''); } catch (error) { const message = error.response?.data?.error || 'Test maili gönderilemedi'; alert(message); console.error('Test mail failed:', error); } }; const handlePreview = async (htmlOverride, options = { openModal: false }) => { try { setPreviewLoading(true); const htmlContent = htmlOverride ?? form.body_html; if (!htmlContent) { alert('Önizleme için HTML içeriği gerekli'); return; } const response = await templateService.preview({ template_html: htmlContent, company_name: companyPlaceholder, employee_name: employeePlaceholder, }); const renderedHtml = response.data.data.rendered_html; setPreviewHtml(renderedHtml); if (previewUrl) { URL.revokeObjectURL(previewUrl); } const blobUrl = URL.createObjectURL(new Blob([renderedHtml], { type: 'text/html' })); setPreviewUrl(blobUrl); setActiveTab('preview'); if (options.openModal) { setPreviewOpen(true); } } catch (error) { const message = error.response?.data?.error || 'Önizleme oluşturulamadı'; alert(message); console.error('Failed to preview template:', error); } finally { setPreviewLoading(false); } }; const copyTemplateType = (value) => { navigator.clipboard.writeText(value); alert(`Template Type panoya kopyalandı: ${value}`); }; useEffect(() => { return () => { if (previewUrl) { URL.revokeObjectURL(previewUrl); } }; }, [previewUrl]); if (loading) { return ( ); } return ( Mail Şablonları Şablon Adı Template Type Durum Güncelleme İşlemler {templates.map((template) => ( {template.name} {template.description && ( {template.description} )} {format(new Date(template.updated_at), 'dd/MM/yyyy HH:mm')} ))}
{selectedTemplate ? 'Şablonu Düzenle' : 'Yeni Şablon Oluştur'} setActiveTab(value)} sx={{ mb: 2 }} > {activeTab === 'form' && ( setForm({ ...form, name: e.target.value })} /> setForm({ ...form, template_type: e.target.value.trim().toLowerCase() })} /> setForm({ ...form, subject_template: e.target.value })} /> setForm({ ...form, description: e.target.value })} /> setForm({ ...form, body_html: e.target.value })} helperText="Handlebars değişkenleri: {{company_name}}, {{employee_name}}, {{tracking_url}}" /> setForm({ ...form, active: e.target.checked })} /> } label="Aktif" /> )} {activeTab === 'preview' && ( setCompanyPlaceholder(e.target.value)} /> setEmployeePlaceholder(e.target.value)} /> {previewHtml ? (