From 9fc41fffb9fc876f31086aa67dd8edd5c557e515 Mon Sep 17 00:00:00 2001 From: nmemmert Date: Mon, 19 Jan 2026 08:11:21 -0500 Subject: [PATCH] Remove unused components from redesign - Admin, ClientLayout, EmailTemplatesManager, LoadingSkeleton, Navbar, PrayerChain, PrayerGoalsManager, PrayerTemplatesManager, Profile, SharePrayer --- src/app/page.tsx | 1 - src/components/Admin.tsx | 422 ---------------------- src/components/ClientLayout.tsx | 55 --- src/components/EmailTemplatesManager.tsx | 288 --------------- src/components/LoadingSkeleton.tsx | 9 - src/components/Navbar.tsx | 207 ----------- src/components/PrayerChain.tsx | 54 --- src/components/PrayerGoalsManager.tsx | 316 ---------------- src/components/PrayerTemplatesManager.tsx | 258 ------------- src/components/Profile.tsx | 244 ------------- src/components/SharePrayer.tsx | 74 ---- 11 files changed, 1928 deletions(-) delete mode 100644 src/components/Admin.tsx delete mode 100644 src/components/ClientLayout.tsx delete mode 100644 src/components/EmailTemplatesManager.tsx delete mode 100644 src/components/LoadingSkeleton.tsx delete mode 100644 src/components/Navbar.tsx delete mode 100644 src/components/PrayerChain.tsx delete mode 100644 src/components/PrayerGoalsManager.tsx delete mode 100644 src/components/PrayerTemplatesManager.tsx delete mode 100644 src/components/Profile.tsx delete mode 100644 src/components/SharePrayer.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 57cfb96..1222377 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,6 @@ import { useState, useEffect } from 'react'; import { useAuth } from '@/context/AuthContext'; import Login from '@/components/Login'; -import LoadingSkeleton from '@/components/LoadingSkeleton'; import BottomNav from '@/components/BottomNav'; import ReminderBanner from '@/components/ReminderBanner'; import DailyEntry from '@/components/DailyEntry'; diff --git a/src/components/Admin.tsx b/src/components/Admin.tsx deleted file mode 100644 index 6331b38..0000000 --- a/src/components/Admin.tsx +++ /dev/null @@ -1,422 +0,0 @@ -'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. -

- -
-
-
- ); -} \ No newline at end of file diff --git a/src/components/ClientLayout.tsx b/src/components/ClientLayout.tsx deleted file mode 100644 index bb44039..0000000 --- a/src/components/ClientLayout.tsx +++ /dev/null @@ -1,55 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; -import { ThemeProvider } from 'next-themes'; -import { AuthProvider } from '@/context/AuthContext'; -import { Toaster } from 'react-hot-toast'; - -export default function ClientLayout({ - children, -}: { - children: React.ReactNode; -}) { - useEffect(() => { - // Initialize theme from localStorage on mount - const stored = localStorage.getItem('theme-mode'); - const html = document.documentElement; - - if (stored === 'light') { - html.classList.remove('dark'); - html.style.colorScheme = 'light'; - } else if (stored === 'system') { - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - if (prefersDark) { - html.classList.add('dark'); - html.style.colorScheme = 'dark'; - } else { - html.classList.remove('dark'); - html.style.colorScheme = 'light'; - } - } else { - // Default to dark - html.classList.add('dark'); - html.style.colorScheme = 'dark'; - } - }, []); - - return ( - - - {children} - - - - ); -} \ No newline at end of file diff --git a/src/components/EmailTemplatesManager.tsx b/src/components/EmailTemplatesManager.tsx deleted file mode 100644 index 23d9697..0000000 --- a/src/components/EmailTemplatesManager.tsx +++ /dev/null @@ -1,288 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { db } from '../lib/firebase'; -import { collection, addDoc, updateDoc, deleteDoc, doc, getDocs, query, where } from 'firebase/firestore'; -import { useAuth } from '../context/AuthContext'; - -interface EmailTemplate { - id: string; - name: string; - subject: string; - body: string; - type: 'prayer_update' | 'reminder' | 'summary'; - createdAt: string; - updatedAt: string; -} - -interface EmailTemplatesManagerProps { - onTemplateSelect?: (templateId: string) => void; - selectedTemplateId?: string; -} - -export default function EmailTemplatesManager({ onTemplateSelect, selectedTemplateId }: EmailTemplatesManagerProps) { - const { user } = useAuth(); - const [templates, setTemplates] = useState([]); - const [loading, setLoading] = useState(true); - const [showForm, setShowForm] = useState(false); - const [editingTemplate, setEditingTemplate] = useState(null); - const [form, setForm] = useState({ - name: '', - subject: '', - body: '', - type: 'prayer_update' as EmailTemplate['type'] - }); - - useEffect(() => { - if (user) { - loadTemplates(); - } - }, [user]); - - const loadTemplates = async () => { - if (!user) return; - - try { - const q = query(collection(db, 'emailTemplates'), where('userId', '==', user.uid)); - const querySnapshot = await getDocs(q); - const templatesData = querySnapshot.docs.map(doc => ({ - id: doc.id, - ...doc.data() - })) as EmailTemplate[]; - setTemplates(templatesData); - } catch (error) { - console.error('Error loading email templates:', error); - } finally { - setLoading(false); - } - }; - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - if (!user) return; - - try { - const templateData = { - ...form, - userId: user.uid, - updatedAt: new Date().toISOString() - }; - - if (editingTemplate) { - await updateDoc(doc(db, 'emailTemplates', editingTemplate.id), templateData); - } else { - await addDoc(collection(db, 'emailTemplates'), { - ...templateData, - createdAt: new Date().toISOString() - }); - } - - setForm({ name: '', subject: '', body: '', type: 'prayer_update' }); - setShowForm(false); - setEditingTemplate(null); - loadTemplates(); - } catch (error) { - console.error('Error saving email template:', error); - } - }; - - const handleEdit = (template: EmailTemplate) => { - setEditingTemplate(template); - setForm({ - name: template.name, - subject: template.subject, - body: template.body, - type: template.type - }); - setShowForm(true); - }; - - const handleDelete = async (templateId: string) => { - if (!confirm('Are you sure you want to delete this email template?')) return; - - try { - await deleteDoc(doc(db, 'emailTemplates', templateId)); - loadTemplates(); - } catch (error) { - console.error('Error deleting email template:', error); - } - }; - - const handleCancel = () => { - setShowForm(false); - setEditingTemplate(null); - setForm({ name: '', subject: '', body: '', type: 'prayer_update' }); - }; - - const getTypeLabel = (type: EmailTemplate['type']) => { - switch (type) { - case 'prayer_update': return 'Prayer Update'; - case 'reminder': return 'Reminder'; - case 'summary': return 'Summary'; - default: return type; - } - }; - - const getTypeColor = (type: EmailTemplate['type']) => { - switch (type) { - case 'prayer_update': return 'bg-blue-600'; - case 'reminder': return 'bg-orange-600'; - case 'summary': return 'bg-green-600'; - default: return 'bg-gray-600'; - } - }; - - if (loading) { - return
Loading email templates...
; - } - - return ( -
-
-

📧 Email Templates

- -
- - {showForm && ( -
-

- {editingTemplate ? 'Edit Email Template' : 'Create New Email Template'} -

- -
-
- - setForm(prev => ({ ...prev, name: e.target.value }))} - className="w-full p-3 bg-gray-600 border border-gray-500 rounded-lg text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - placeholder="e.g., Weekly Prayer Update" - required - /> -
- -
- - -
-
- -
- - setForm(prev => ({ ...prev, subject: e.target.value }))} - className="w-full p-3 bg-gray-600 border border-gray-500 rounded-lg text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - placeholder="e.g., Your Weekly Prayer Update" - required - /> -
- -
- -