import React, { useState, useEffect } from 'react'; import { Star, ChevronDown, ChevronUp, X, Book, FileText, Quote } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; interface Favorite { id: number; book: string; chapter?: string; verse_start?: number; verse_end?: number; note?: string; created_at: string; } interface FavoritesMenuProps { user: any; formatBookName: (bookName: string) => string; getBookUrlName: (bookName: string) => string; } const FavoritesMenu: React.FC = ({ user, formatBookName, getBookUrlName }) => { const [isOpen, setIsOpen] = useState(false); const [favorites, setFavorites] = useState([]); const [loading, setLoading] = useState(false); const navigate = useNavigate(); // Load favorites when user is available useEffect(() => { if (user) { loadFavorites(); } }, [user]); const loadFavorites = async () => { if (!user) return; setLoading(true); try { const response = await fetch('/api/favorites', { credentials: 'include' }); if (response.ok) { const data = await response.json(); setFavorites(data.favorites || []); } } catch (error) { console.error('Failed to load favorites:', error); } finally { setLoading(false); } }; const removeFavorite = async (favoriteId: number) => { try { const response = await fetch(`/api/favorites/${favoriteId}`, { method: 'DELETE', credentials: 'include' }); if (response.ok) { setFavorites(favorites.filter(f => f.id !== favoriteId)); } } catch (error) { console.error('Failed to remove favorite:', error); } }; const navigateToFavorite = (favorite: Favorite) => { const urlBookName = getBookUrlName(favorite.book); if (favorite.chapter) { // Navigate to chapter navigate(`/book/${urlBookName}/chapter/${favorite.chapter}`); } else { // Navigate to book navigate(`/book/${urlBookName}`); } setIsOpen(false); }; const getFavoriteDisplayText = (favorite: Favorite) => { const bookName = formatBookName(favorite.book); if (favorite.verse_start && favorite.verse_end) { return `${bookName} ${favorite.chapter}:${favorite.verse_start}-${favorite.verse_end}`; } else if (favorite.verse_start) { return `${bookName} ${favorite.chapter}:${favorite.verse_start}`; } else if (favorite.chapter) { return `${bookName} Chapter ${favorite.chapter}`; } else { return bookName; } }; // Organize favorites by type const organizedFavorites = { books: favorites.filter(f => !f.chapter), chapters: favorites.filter(f => f.chapter && !f.verse_start), verses: favorites.filter(f => f.verse_start) }; const renderFavoriteSection = (title: string, items: Favorite[], icon: React.ReactNode) => { if (items.length === 0) return null; return (
{icon} {title} ({items.length})
{items.map((favorite) => (
))}
); }; if (!user) { return null; // Don't show favorites menu for non-authenticated users } return (
{/* Favorites Toggle Button */} {/* Favorites Dropdown */} {isOpen && (

My Favorites

{loading ? (
Loading favorites...
) : favorites.length === 0 ? (

No favorites yet

Click the ★ next to books, chapters, or verses to add them here

) : (
{renderFavoriteSection( "Books", organizedFavorites.books, )} {renderFavoriteSection( "Chapters", organizedFavorites.chapters, )} {renderFavoriteSection( "Verses", organizedFavorites.verses, )}
)}
)}
); }; export default FavoritesMenu;