'use client'; import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Mail, Search, Filter, Reply, Archive, Trash2, Clock, User, CheckCircle, Circle, Send, X, RefreshCw, Eye, Calendar, AtSign } from 'lucide-react'; interface ContactMessage { id: string; name: string; email: string; subject: string; message: string; createdAt: string; read: boolean; responded: boolean; priority: 'low' | 'medium' | 'high'; } export const EmailManager: React.FC = () => { const [messages, setMessages] = useState([]); const [selectedMessage, setSelectedMessage] = useState(null); const [isLoading, setIsLoading] = useState(true); const [filter, setFilter] = useState<'all' | 'unread' | 'responded'>('all'); const [searchTerm, setSearchTerm] = useState(''); const [showReplyModal, setShowReplyModal] = useState(false); const [replyContent, setReplyContent] = useState(''); // Load messages from API const loadMessages = async () => { try { setIsLoading(true); const response = await fetch('/api/contacts', { headers: { 'x-admin-request': 'true' } }); if (response.ok) { const data = await response.json(); const formattedMessages = data.contacts.map((contact: any) => ({ id: contact.id.toString(), name: contact.name, email: contact.email, subject: contact.subject, message: contact.message, createdAt: contact.createdAt, read: false, responded: contact.responded || false, priority: 'medium' as const })); setMessages(formattedMessages); } } catch (error) { console.error('Error loading messages:', error); } finally { setIsLoading(false); } }; useEffect(() => { loadMessages(); }, []); const filteredMessages = messages.filter(message => { const matchesFilter = filter === 'all' || (filter === 'unread' && !message.read) || (filter === 'responded' && message.responded); const matchesSearch = searchTerm === '' || message.subject.toLowerCase().includes(searchTerm.toLowerCase()) || message.name.toLowerCase().includes(searchTerm.toLowerCase()) || message.email.toLowerCase().includes(searchTerm.toLowerCase()); return matchesFilter && matchesSearch; }); const handleMessageClick = (message: ContactMessage) => { setSelectedMessage(message); // Mark as read setMessages(prev => prev.map(msg => msg.id === message.id ? { ...msg, read: true } : msg )); }; const handleReply = async () => { if (!selectedMessage || !replyContent.trim()) return; try { const response = await fetch('/api/email/respond', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ to: selectedMessage.email, name: selectedMessage.name, template: 'reply', originalMessage: selectedMessage.message, response: replyContent }) }); if (response.ok) { setMessages(prev => prev.map(msg => msg.id === selectedMessage.id ? { ...msg, responded: true } : msg )); setShowReplyModal(false); setReplyContent(''); } } catch (error) { console.error('Error sending reply:', error); } }; const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); }; const getPriorityColor = (priority: string) => { switch (priority) { case 'high': return 'text-red-400'; case 'medium': return 'text-yellow-400'; case 'low': return 'text-green-400'; default: return 'text-blue-400'; } }; if (isLoading) { return (
); } return (
{/* Header */}

Email Manager

Manage your contact messages

{/* Filters and Search */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-blue-500" />
{['all', 'unread', 'responded'].map((filterType) => ( ))}
{/* Messages List */}
{filteredMessages.length === 0 ? (

No messages found

) : ( filteredMessages.map((message) => ( handleMessageClick(message)} >

{message.subject}

{!message.read && } {message.responded && }

{message.name}

{formatDate(message.createdAt)}

)) )}
{/* Message Detail */}
{selectedMessage ? (
{/* Message Header */}

{selectedMessage.subject}

{selectedMessage.name}
{selectedMessage.email}
{formatDate(selectedMessage.createdAt)}
{!selectedMessage.read && } {selectedMessage.responded && }
{/* Message Body */}

Message:

{selectedMessage.message}
{/* Actions */}
) : (

Select a message to view details

)}
{/* Reply Modal */} {showReplyModal && selectedMessage && ( setShowReplyModal(false)} > e.stopPropagation()} >

Reply to {selectedMessage.name}