'use client'; import { useState, useEffect } from 'react'; import { doc, getDoc, setDoc, collection, getDocs, deleteDoc } from 'firebase/firestore'; import { db } from '@/lib/firebase'; import { useAuth } from '@/context/AuthContext'; interface SMTPConfig { host: string; port: number; secure: boolean; user: string; pass: string; from: string; } interface AdminConfig { adminEmails: string[]; } export default function Admin() { const { user, isAdmin } = useAuth(); const [config, setConfig] = useState({ host: '', port: 587, secure: false, user: '', pass: '', from: '', }); const [adminConfig, setAdminConfig] = useState({ adminEmails: [], }); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(''); const [newAdminEmail, setNewAdminEmail] = useState(''); const [metrics, setMetrics] = useState({ totalUsers: 0, totalPrayers: 0, totalSharedPrayers: 0, }); useEffect(() => { loadConfig(); }, []); const loadConfig = async () => { try { // Load SMTP config const smtpDoc = await getDoc(doc(db, 'config', 'smtp')); if (smtpDoc.exists()) { setConfig(smtpDoc.data() as SMTPConfig); } // Load admin config const adminDoc = await getDoc(doc(db, 'config', 'admin')); if (adminDoc.exists()) { setAdminConfig(adminDoc.data() as AdminConfig); } else { // Default admin config setAdminConfig({ adminEmails: ['your-admin-email@example.com'] }); } // Load metrics const usersSnapshot = await getDocs(collection(db, 'users')); const prayersSnapshot = await getDocs(collection(db, 'prayers')); const sharedPrayersSnapshot = await getDocs(collection(db, 'sharedPrayers')); setMetrics({ totalUsers: usersSnapshot.size, totalPrayers: prayersSnapshot.size, totalSharedPrayers: sharedPrayersSnapshot.size, }); } catch (error) { console.error('Error loading config:', error); } finally { setLoading(false); } }; const saveConfig = async () => { // Validate required fields if (!config.host.trim()) { setMessage('SMTP host is required.'); return; } if (!config.user.trim()) { setMessage('SMTP username is required.'); return; } if (!config.pass.trim()) { setMessage('SMTP password is required.'); return; } if (!config.from.trim()) { setMessage('From email is required.'); return; } if (isNaN(config.port) || config.port < 1 || config.port > 65535) { setMessage('Port must be a valid number between 1 and 65535.'); return; } setSaving(true); setMessage(''); try { await setDoc(doc(db, 'config', 'smtp'), config); setMessage('SMTP configuration saved successfully!'); } catch (error: unknown) { console.error('Error saving config:', error); const err = error as { code?: string; message?: string }; if (err.code === 'permission-denied') { setMessage('Permission denied. Please check your authentication and Firestore security rules.'); } else if (err.code === 'unavailable') { setMessage('Firestore is currently unavailable. Please try again later.'); } else { setMessage(`Error saving configuration: ${err.message || 'Unknown error'}`); } } finally { setSaving(false); } }; const saveAdminConfig = async () => { setSaving(true); setMessage(''); try { await setDoc(doc(db, 'config', 'admin'), adminConfig); setMessage('Admin configuration saved successfully!'); } catch (error) { console.error('Error saving admin config:', error); setMessage('Error saving admin configuration.'); } finally { setSaving(false); } }; const addAdminEmail = async () => { if (!newAdminEmail.trim()) return; const updatedEmails = [...adminConfig.adminEmails, newAdminEmail.trim()]; const updatedConfig = { ...adminConfig, adminEmails: updatedEmails }; try { await setDoc(doc(db, 'config', 'admin'), updatedConfig); setAdminConfig(updatedConfig); setNewAdminEmail(''); setMessage('Admin email added successfully!'); } catch (error) { console.error('Error adding admin email:', error); setMessage('Error adding admin email.'); } }; const removeAdminEmail = async (email: string) => { const updatedEmails = adminConfig.adminEmails.filter(e => e !== email); const updatedConfig = { ...adminConfig, adminEmails: updatedEmails }; try { await setDoc(doc(db, 'config', 'admin'), updatedConfig); setAdminConfig(updatedConfig); setMessage('Admin email removed successfully!'); } catch (error) { console.error('Error removing admin email:', error); setMessage('Error removing admin email.'); } }; const clearCommunityPrayers = async () => { if (!confirm('Are you sure you want to delete ALL community prayers? This action cannot be undone.')) { return; } setSaving(true); setMessage(''); try { const sharedRef = collection(db, 'sharedPrayers'); const querySnapshot = await getDocs(sharedRef); const deletePromises = querySnapshot.docs.map(doc => deleteDoc(doc.ref)); await Promise.all(deletePromises); // Reload metrics to update the count await loadConfig(); setMessage(`Successfully deleted ${querySnapshot.docs.length} community prayers.`); } catch (error) { console.error('Error clearing community prayers:', error); setMessage('Error clearing community prayers.'); } finally { setSaving(false); } }; if (!isAdmin) { return (

Access Denied

You don't have permission to access the admin panel.

); } if (loading) { return
Loading admin settings...
; } return (

Admin Settings

Analytics Dashboard

{metrics.totalUsers}
Total Users
{metrics.totalPrayers}
Total Prayers
{metrics.totalSharedPrayers}
Shared Prayers

SMTP Configuration

setConfig(prev => ({ ...prev, host: e.target.value }))} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="smtp.gmail.com" />
{ const value = parseInt(e.target.value); setConfig(prev => ({ ...prev, port: isNaN(value) ? 587 : value })); }} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" min="1" max="65535" />
setConfig(prev => ({ ...prev, user: e.target.value }))} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="your-email@gmail.com" />
setConfig(prev => ({ ...prev, pass: e.target.value }))} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="your-app-password" />
setConfig(prev => ({ ...prev, from: e.target.value }))} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="noreply@yourapp.com" />
setConfig(prev => ({ ...prev, secure: e.target.checked }))} className="mr-2" />
{message && (

{message}

)}

Admin Configuration

setAdminConfig(prev => ({ ...prev, adminEmails: e.target.value.split(',').map(email => email.trim()) }))} className="w-full p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="admin1@example.com, admin2@example.com" />
setNewAdminEmail(e.target.value)} className="flex-1 p-2 bg-gray-700 border border-gray-600 rounded text-white" placeholder="new-admin@example.com" />

Admin Email Management

{adminConfig.adminEmails.map((email, index) => (
{email}
))}
setNewAdminEmail(e.target.value)} placeholder="new-admin@example.com" className="flex-1 p-2 bg-gray-700 border border-gray-600 rounded text-white" />

Community Management

Clear Community Prayers

Remove all prayers that have been shared to the community. This action cannot be undone.

); }