import { useEffect, useMemo, useState } from 'react'; import { DataPanel } from './DataPanel'; import { approveTemplateByAdmin, deleteTemplate, listTemplates, rejectTemplateByAdmin, saveTemplate, } from '../services/templateService'; const fieldStyle = { width: '100%', border: '1px solid var(--color-border)', borderRadius: '14px', padding: '0.75rem 0.85rem', background: '#fff', color: 'var(--color-text)', fontWeight: 600, }; const statusMeta = { approved: { label: 'Aprovado pela Meta', background: 'rgba(34, 197, 94, 0.12)', color: '#15803d', }, meta_review: { label: 'Em análise pela Meta', background: 'rgba(229, 162, 42, 0.16)', color: '#8a5a00', }, admin_review: { label: 'Aguardando aprovação do admin', background: 'rgba(0, 49, 80, 0.1)', color: 'var(--color-primary)', }, rejected: { label: 'Reprovado pelo admin', background: 'rgba(181, 31, 31, 0.1)', color: 'var(--color-secondary)', }, }; const templateCategories = [ { id: 'UTILITY', label: 'UTILITY', detail: 'Confirmações, lembretes e atualizações', cost: 'Menor custo' }, { id: 'MARKETING', label: 'MARKETING', detail: 'Promoções, ofertas e engajamento', cost: 'Maior custo' }, { id: 'AUTHENTICATION', label: 'AUTHENTICATION', detail: 'OTP e códigos de verificação', cost: 'Menor custo' }, ]; function getTemplateStatus(template) { return statusMeta[template.status] || statusMeta.approved; } function getRemainingMetaText(template) { if (template.status !== 'meta_review' || !template.meta_submitted_at) return ''; const submittedAt = new Date(template.meta_submitted_at).getTime(); const approvedAt = submittedAt + 15 * 60 * 1000; const remainingMs = approvedAt - Date.now(); if (remainingMs <= 0) return 'Aprovação disponível ao atualizar.'; const minutes = Math.ceil(remainingMs / 60000); return `Aprovação em aproximadamente ${minutes} min.`; } function renderTemplatePreview(content) { return String(content || 'Digite a mensagem do template...') .replace(/\{nome\}/gi, 'Ana Paula') .replace(/\{cliente\}/gi, 'Ana Paula') .replace(/\{data\}/gi, '26/05/2026') .replace(/\{link\}/gi, 'https://sothis.com.br/rh') .replace(/\{variavel\}/gi, 'informação personalizada') .replace(/\{variável\}/gi, 'informação personalizada'); } export function TemplateManagementPanel({ areas = [], mode = 'admin', managedAreaNames = [], isMobile = false, }) { const [templates, setTemplates] = useState([]); const [selectedArea, setSelectedArea] = useState('all'); const [form, setForm] = useState({ name: '', content: '', areaId: '', category: 'UTILITY' }); const [statusMessage, setStatusMessage] = useState(''); const [isLoading, setIsLoading] = useState(true); const isAdmin = mode === 'admin'; const visibleAreas = isAdmin ? areas : areas.filter((area) => managedAreaNames.includes(area.nome)); const filteredTemplates = useMemo(() => { return templates.filter((template) => { const areaMatches = selectedArea === 'all' || String(template.area_id || '') === selectedArea; const supervisorAreaMatches = isAdmin || !template.area_nome || managedAreaNames.includes(template.area_nome); return areaMatches && supervisorAreaMatches; }); }, [templates, selectedArea, isAdmin, managedAreaNames]); async function loadTemplates() { setIsLoading(true); try { const data = await listTemplates(); setTemplates(Array.isArray(data) ? data : []); setStatusMessage(''); } catch (error) { setStatusMessage(error.message); } finally { setIsLoading(false); } } useEffect(() => { loadTemplates(); }, []); async function submitTemplate(event) { event.preventDefault(); const name = form.name.trim(); const content = form.content.trim(); if (!name || !content) return; try { await saveTemplate({ name, content, category: form.category, areaId: Number(form.areaId) || null, requestedByRole: isAdmin ? 'admin' : 'supervisor', }); setForm({ name: '', content: '', areaId: '', category: 'UTILITY' }); setStatusMessage( isAdmin ? 'Template enviado para aprovação.' : 'Template enviado para aprovação do admin.', ); await loadTemplates(); } catch (error) { setStatusMessage(error.message); } } async function approveTemplate(templateId) { try { await approveTemplateByAdmin(templateId); setStatusMessage('Template aprovado pelo admin e enviado para análise da Meta.'); await loadTemplates(); } catch (error) { setStatusMessage(error.message); } } async function rejectTemplate(templateId) { try { await rejectTemplateByAdmin(templateId); setStatusMessage('Template reprovado pelo admin.'); await loadTemplates(); } catch (error) { setStatusMessage(error.message); } } async function removeTemplate(templateId) { try { await deleteTemplate(templateId); setStatusMessage('Template excluído.'); await loadTemplates(); } catch (error) { setStatusMessage(error.message); } } return (
setForm((current) => ({ ...current, name: event.target.value }))} placeholder="Identificador do template" style={fieldStyle} />
{['{nome}', '{data}', '{link}', '{variavel}'].map((variable) => ( ))}