/** * @ai-summary Admin Email Templates mobile screen for managing notification email templates * @ai-context Mobile-optimized version with touch-friendly UI */ import React, { useState, useCallback } from 'react'; import { Navigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Edit, Visibility, Close, Send } from '@mui/icons-material'; import toast from 'react-hot-toast'; import { useAdminAccess } from '../../../core/auth/useAdminAccess'; import { MobileContainer } from '../../../shared-minimal/components/mobile/MobileContainer'; import { GlassCard } from '../../../shared-minimal/components/mobile/GlassCard'; import { adminApi } from '../api/admin.api'; import { EmailTemplate, UpdateEmailTemplateRequest } from '../types/admin.types'; const SAMPLE_VARIABLES: Record = { userName: 'John Doe', vehicleName: '2024 Toyota Camry', category: 'Routine Maintenance', subtypes: 'Oil Change, Air Filter', dueDate: '2025-01-15', dueMileage: '50,000', documentType: 'Insurance', documentTitle: 'State Farm Policy', expirationDate: '2025-02-28', }; export const AdminEmailTemplatesMobileScreen: React.FC = () => { const { loading: authLoading, isAdmin } = useAdminAccess(); const queryClient = useQueryClient(); // State const [editingTemplate, setEditingTemplate] = useState(null); const [previewTemplate, setPreviewTemplate] = useState(null); const [editSubject, setEditSubject] = useState(''); const [editBody, setEditBody] = useState(''); const [editIsActive, setEditIsActive] = useState(true); const [previewSubject, setPreviewSubject] = useState(''); const [previewBody, setPreviewBody] = useState(''); // Queries const { data: templates, isLoading } = useQuery({ queryKey: ['admin', 'emailTemplates'], queryFn: () => adminApi.emailTemplates.list(), enabled: isAdmin, }); // Mutations const updateMutation = useMutation({ mutationFn: ({ key, data }: { key: string; data: UpdateEmailTemplateRequest }) => adminApi.emailTemplates.update(key, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'emailTemplates'] }); toast.success('Template updated'); handleCloseEdit(); }, onError: () => { toast.error('Failed to update template'); }, }); const previewMutation = useMutation({ mutationFn: ({ key, variables }: { key: string; variables: Record }) => adminApi.emailTemplates.preview(key, variables), onSuccess: (data) => { setPreviewSubject(data.subject); setPreviewBody(data.body); }, onError: () => { toast.error('Failed to generate preview'); }, }); const sendTestMutation = useMutation({ mutationFn: (key: string) => adminApi.emailTemplates.sendTest(key), onSuccess: (data) => { if (data.error) { toast.error(`Test email failed: ${data.error}`); } else if (data.message) { toast.success(data.message); } }, onError: () => { toast.error('Failed to send test email'); }, }); // Handlers const handleEditClick = useCallback((template: EmailTemplate) => { setEditingTemplate(template); setEditSubject(template.subject); setEditBody(template.body); setEditIsActive(template.isActive); }, []); const handlePreviewClick = useCallback((template: EmailTemplate) => { setPreviewTemplate(template); previewMutation.mutate({ key: template.templateKey, variables: SAMPLE_VARIABLES, }); }, [previewMutation]); const handleSendTestClick = useCallback((template: EmailTemplate) => { sendTestMutation.mutate(template.templateKey); }, [sendTestMutation]); const handleCloseEdit = useCallback(() => { setEditingTemplate(null); setEditSubject(''); setEditBody(''); setEditIsActive(true); }, []); const handleClosePreview = useCallback(() => { setPreviewTemplate(null); setPreviewSubject(''); setPreviewBody(''); }, []); const handleSave = useCallback(() => { if (!editingTemplate) return; const data: UpdateEmailTemplateRequest = { subject: editSubject !== editingTemplate.subject ? editSubject : undefined, body: editBody !== editingTemplate.body ? editBody : undefined, isActive: editIsActive !== editingTemplate.isActive ? editIsActive : undefined, }; // Only update if there are changes if (data.subject || data.body || data.isActive !== undefined) { updateMutation.mutate({ key: editingTemplate.templateKey, data, }); } else { handleCloseEdit(); } }, [editingTemplate, editSubject, editBody, editIsActive, updateMutation, handleCloseEdit]); // Auth loading if (authLoading) { return (
Loading admin access...
); } // Not admin if (!isAdmin) { return ; } // Edit view if (editingTemplate) { return (
{/* Header */}

Edit Template

{editingTemplate.name}

{/* Edit Form */}
{/* Active Toggle */}
Active
{/* Subject */}
setEditSubject(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent min-h-[44px]" placeholder="Email subject" />

Use variables like {editingTemplate.variables.map((v) => `{{${v}}}`).join(', ')}

{/* Body */}