'use client'; import { useState, useEffect } from 'react'; import { useAuth } from '@/context/AuthContext'; import Login from '@/components/Login'; import Admin from '@/components/Admin'; import { db } from '@/lib/firebase'; import { doc, setDoc, collection, addDoc, getDocs, updateDoc, deleteDoc, query, where } from 'firebase/firestore'; interface Prayer { id: string; userId?: string; date: string; type: 'prayer' | 'praise'; text: string; journal: string; email: string; prayFor: string; archived?: boolean; reminderFrequency?: 'daily' | 'weekly' | 'monthly' | 'never'; includeActiveSummary?: boolean; } export default function Home() { const [prayers, setPrayers] = useState([]); const [form, setForm] = useState({ date: new Date().toISOString().split('T')[0], type: 'prayer' as 'prayer' | 'praise', text: '', journal: '', email: '', prayFor: '', reminderFrequency: 'never' as 'daily' | 'weekly' | 'monthly' | 'never', includeActiveSummary: false, }); const [showAdmin, setShowAdmin] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [activeTab, setActiveTab] = useState<'add' | 'active' | 'archived' | 'search'>('add'); const itemsPerPage = 10; const { user, loading, logout, isAdmin } = useAuth(); const [showLoadingScreen, setShowLoadingScreen] = useState(true); // Ensure loading screen shows for at least 5 seconds useEffect(() => { const timer = setTimeout(() => { setShowLoadingScreen(false); }, 5000); // 5 seconds minimum return () => clearTimeout(timer); }, []); // Load prayers from Firestore const loadPrayers = async () => { if (!user) return; try { const prayersRef = collection(db, 'prayers'); const q = query(prayersRef, where('userId', '==', user.uid)); const querySnapshot = await getDocs(q); const loadedPrayers: Prayer[] = []; querySnapshot.forEach((doc) => { loadedPrayers.push({ id: doc.id, ...doc.data() } as Prayer); }); setPrayers(loadedPrayers); } catch (error) { console.error('Error loading prayers:', error); } }; // Load prayers when user changes useEffect(() => { if (user) { loadPrayers(); } else { setPrayers([]); // Clear prayers when user logs out } }, [user]); // Auto-populate email field with user's email useEffect(() => { if (user?.email) { setForm(prev => ({ ...prev, email: user.email! })); } }, [user]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!user) { alert('Please log in to save prayers'); return; } try { const newPrayerData = { userId: user.uid, date: form.date, type: form.type, text: form.text, journal: form.journal, email: form.email, prayFor: form.prayFor, reminderFrequency: form.reminderFrequency, includeActiveSummary: form.includeActiveSummary, archived: false, }; // Save to Firestore const docRef = await addDoc(collection(db, 'prayers'), newPrayerData); // Add to local state with Firestore ID const newPrayer: Prayer = { id: docRef.id, ...newPrayerData, }; setPrayers(prev => [...prev, newPrayer]); // Store user reminder preferences in Firestore if (form.reminderFrequency !== 'never') { await setDoc(doc(db, 'users', user.uid), { email: form.email, reminderFrequency: form.reminderFrequency, includeActiveSummary: form.includeActiveSummary, lastEmailSent: null, }, { merge: true }); console.log('✅ Reminder preferences saved'); } // Reset form setForm({ date: new Date().toISOString().split('T')[0], type: 'prayer', text: '', journal: '', email: user.email || '', prayFor: '', reminderFrequency: 'never', includeActiveSummary: false, }); } catch (error) { console.error('Error saving prayer:', error); alert('Failed to save prayer. Please try again.'); } }; const activePrayers = prayers.filter(prayer => !prayer.archived); const archivedPrayers = prayers.filter(prayer => prayer.archived); // Filter prayers based on search term const filteredActivePrayers = activePrayers.filter(prayer => prayer.text.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.journal.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.type.toLowerCase().includes(searchTerm.toLowerCase()) ); const filteredArchivedPrayers = archivedPrayers.filter(prayer => prayer.text.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.journal.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.type.toLowerCase().includes(searchTerm.toLowerCase()) ); // For search tab, combine all filtered prayers const allPrayers = [...activePrayers, ...archivedPrayers]; const filteredSearchPrayers = allPrayers.filter(prayer => prayer.text.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.journal.toLowerCase().includes(searchTerm.toLowerCase()) || prayer.type.toLowerCase().includes(searchTerm.toLowerCase()) ); // Pagination logic const totalActivePages = Math.ceil(filteredActivePrayers.length / itemsPerPage); const totalArchivedPages = Math.ceil(filteredArchivedPrayers.length / itemsPerPage); const totalSearchPages = Math.ceil(filteredSearchPrayers.length / itemsPerPage); const paginatedActivePrayers = filteredActivePrayers.slice( (currentPage - 1) * itemsPerPage, currentPage * itemsPerPage ); const paginatedArchivedPrayers = filteredArchivedPrayers.slice( (currentPage - 1) * itemsPerPage, currentPage * itemsPerPage ); const paginatedSearchPrayers = filteredSearchPrayers.slice( (currentPage - 1) * itemsPerPage, currentPage * itemsPerPage ); const currentPrayers = activeTab === 'active' ? paginatedActivePrayers : activeTab === 'archived' ? paginatedArchivedPrayers : paginatedSearchPrayers; const currentTotalPages = activeTab === 'active' ? totalActivePages : activeTab === 'archived' ? totalArchivedPages : totalSearchPages; const groupedPrayers = currentPrayers.reduce((acc, prayer) => { if (!acc[prayer.date]) acc[prayer.date] = []; acc[prayer.date].push(prayer); return acc; }, {} as Record); const sharePrayer = async (prayer: Prayer) => { const shareText = `${prayer.type.toUpperCase()}: ${prayer.text}${prayer.journal ? `\n\nJournal: ${prayer.journal}` : ''}`; if (navigator.share) { try { await navigator.share({ title: `Shared ${prayer.type}`, text: shareText, }); // Show success feedback const button = document.activeElement as HTMLElement; if (button) { const originalText = button.textContent; button.textContent = '✅ Shared!'; button.classList.add('bg-green-600', 'hover:bg-green-700'); setTimeout(() => { button.textContent = originalText; button.classList.remove('bg-green-600', 'hover:bg-green-700'); }, 2000); } } catch (err) { console.log('Share cancelled'); } } else { // Fallback: copy to clipboard try { await navigator.clipboard.writeText(shareText); // Show success feedback const button = document.activeElement as HTMLElement; if (button) { const originalText = button.textContent; button.textContent = '📋 Copied!'; button.classList.add('bg-green-600', 'hover:bg-green-700'); setTimeout(() => { button.textContent = originalText; button.classList.remove('bg-green-600', 'hover:bg-green-700'); }, 2000); } } catch (clipboardErr) { alert('Prayer copied to clipboard!'); } } }; // Archive/unarchive prayers in Firestore const toggleArchivePrayer = async (prayerId: string, archived: boolean) => { try { await updateDoc(doc(db, 'prayers', prayerId), { archived: archived }); // Update local state setPrayers(prev => prev.map(p => p.id === prayerId ? { ...p, archived: archived } : p )); } catch (error) { console.error('Error updating prayer archive status:', error); alert('Failed to update prayer. Please try again.'); } }; if (loading || showLoadingScreen) { return (
{/* Animated prayer icon */}
{/* Outer ring */}
{/* Inner ring */}
{/* Center icon */}
🙏
{/* Floating particles */}
{/* Loading text */}

Prayer App

Preparing your spiritual journey...

{/* Inspirational quote */}
"Be anxious for nothing, but in everything by prayer and supplication, with thanksgiving, let your requests be made known to God."
— Philippians 4:6
{/* Progress dots */}
); } if (!user) { return ; } return (

Prayer App

{activeTab === 'add' ? 'Add New Prayer or Praise' : activeTab === 'search' ? 'Search Results' : `${activeTab.charAt(0).toUpperCase() + activeTab.slice(1)} Prayers`}

{isAdmin && ( )}
{showAdmin && } {activeTab === 'add' && (
setForm(prev => ({ ...prev, date: e.target.value }))} className="w-full p-3 bg-gray-800 border border-gray-600 rounded text-base" required />
setForm(prev => ({ ...prev, prayFor: e.target.value }))} className="w-full p-3 bg-gray-800 border border-gray-600 rounded text-base" placeholder="Name of person to pray for..." />