'use client' import { Container, Grid, Card, CardContent, Typography, Box, Select, MenuItem, FormControl, InputLabel, Paper, List, ListItem, ListItemButton, ListItemText, Divider, Button, Chip, useTheme, CircularProgress, Skeleton, IconButton, } from '@mui/material' import { MenuBook, NavigateBefore, NavigateNext, Bookmark, BookmarkBorder, Share, } from '@mui/icons-material' import { useState, useEffect } from 'react' import { useTranslations, useLocale } from 'next-intl' import { useAuth } from '@/hooks/use-auth' interface BibleVerse { id: string verseNum: number text: string } interface BibleChapter { id: string chapterNum: number verses: BibleVerse[] } interface BibleBook { id: string name: string testament: string orderNum: number bookKey: string chapters: BibleChapter[] } export default function BiblePage() { const theme = useTheme() const t = useTranslations('pages.bible') const locale = useLocale() const [books, setBooks] = useState([]) const [selectedBook, setSelectedBook] = useState('') const [selectedChapter, setSelectedChapter] = useState(1) const [verses, setVerses] = useState([]) const [loading, setLoading] = useState(true) const [isBookmarked, setIsBookmarked] = useState(false) const [bookmarkLoading, setBookmarkLoading] = useState(false) const [verseBookmarks, setVerseBookmarks] = useState<{[key: string]: any}>({}) const [verseBookmarkLoading, setVerseBookmarkLoading] = useState<{[key: string]: boolean}>({}) const { user } = useAuth() // Fetch available books useEffect(() => { fetch(`/api/bible/books?locale=${locale}`) .then(res => res.json()) .then(data => { setBooks(data.books || []) if (data.books && data.books.length > 0) { setSelectedBook(data.books[0].id) } setLoading(false) }) .catch(err => { console.error('Error fetching books:', err) setLoading(false) }) }, []) // Fetch verses when book/chapter changes useEffect(() => { if (selectedBook && selectedChapter) { setLoading(true) fetch(`/api/bible/verses?bookId=${selectedBook}&chapter=${selectedChapter}`) .then(res => res.json()) .then(data => { setVerses(data.verses || []) setLoading(false) }) .catch(err => { console.error('Error fetching verses:', err) setLoading(false) }) } }, [selectedBook, selectedChapter]) // Check if chapter is bookmarked useEffect(() => { if (selectedBook && selectedChapter && user) { const token = localStorage.getItem('authToken') if (token) { fetch(`/api/bookmarks/chapter/check?bookId=${selectedBook}&chapterNum=${selectedChapter}&locale=${locale}`, { headers: { 'Authorization': `Bearer ${token}` } }) .then(res => res.json()) .then(data => { setIsBookmarked(data.isBookmarked || false) }) .catch(err => { console.error('Error checking bookmark:', err) }) } } else { setIsBookmarked(false) } }, [selectedBook, selectedChapter, user, locale]) // Check verse bookmarks when verses change useEffect(() => { if (verses.length > 0 && user) { const token = localStorage.getItem('authToken') if (token) { const verseIds = verses.map(verse => verse.id) fetch(`/api/bookmarks/verse/bulk-check?locale=${locale}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ verseIds }) }) .then(res => res.json()) .then(data => { setVerseBookmarks(data.bookmarks || {}) }) .catch(err => { console.error('Error checking verse bookmarks:', err) }) } } else { setVerseBookmarks({}) } }, [verses, user, locale]) const currentBook = books.find(book => book.id === selectedBook) const maxChapters = currentBook?.chapters?.length || 50 // Default fallback const handlePreviousChapter = () => { if (selectedChapter > 1) { setSelectedChapter(selectedChapter - 1) } else if (selectedBook > 1) { setSelectedBook(selectedBook - 1) setSelectedChapter(50) // Will be adjusted by actual chapter count } } const handleNextChapter = () => { if (selectedChapter < maxChapters) { setSelectedChapter(selectedChapter + 1) } else { const nextBook = books.find(book => book.id === selectedBook + 1) if (nextBook) { setSelectedBook(selectedBook + 1) setSelectedChapter(1) } } } const handleBookmarkToggle = async () => { if (!user || !selectedBook || !selectedChapter) return setBookmarkLoading(true) const token = localStorage.getItem('authToken') if (!token) { setBookmarkLoading(false) return } try { if (isBookmarked) { // Remove bookmark const response = await fetch(`/api/bookmarks/chapter?bookId=${selectedBook}&chapterNum=${selectedChapter}&locale=${locale}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }) if (response.ok) { setIsBookmarked(false) } } else { // Add bookmark const response = await fetch(`/api/bookmarks/chapter?locale=${locale}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ bookId: selectedBook, chapterNum: selectedChapter }) }) if (response.ok) { setIsBookmarked(true) } } } catch (error) { console.error('Error toggling bookmark:', error) } finally { setBookmarkLoading(false) } } const handleVerseBookmarkToggle = async (verse: BibleVerse) => { if (!user) return setVerseBookmarkLoading(prev => ({ ...prev, [verse.id]: true })) const token = localStorage.getItem('authToken') if (!token) { setVerseBookmarkLoading(prev => ({ ...prev, [verse.id]: false })) return } try { const isCurrentlyBookmarked = !!verseBookmarks[verse.id] if (isCurrentlyBookmarked) { // Remove verse bookmark const response = await fetch(`/api/bookmarks/verse?verseId=${verse.id}&locale=${locale}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }) if (response.ok) { setVerseBookmarks(prev => { const newBookmarks = { ...prev } delete newBookmarks[verse.id] return newBookmarks }) } } else { // Add verse bookmark const response = await fetch(`/api/bookmarks/verse?locale=${locale}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ verseId: verse.id }) }) if (response.ok) { const data = await response.json() setVerseBookmarks(prev => ({ ...prev, [verse.id]: data.bookmark })) } } } catch (error) { console.error('Error toggling verse bookmark:', error) } finally { setVerseBookmarkLoading(prev => ({ ...prev, [verse.id]: false })) } } if (loading && books.length === 0) { return ( {t('loading')} ) } return ( {/* Header */} {t('title')} {t('subtitle')} {/* Left Sidebar - Book Selection */} {t('selectBook')} {t('book')} {t('chapter')} {/* Main Content - Bible Text */} {/* Chapter Header */} {currentBook?.name || 'Geneza'} {selectedChapter} {verses.length} {t('verses')} {/* Bible Verses */} {loading ? ( {Array.from({ length: 5 }).map((_, index) => ( ))} ) : verses.length > 0 ? ( {verses.map((verse) => { const isVerseBookmarked = !!verseBookmarks[verse.id] const isVerseLoading = !!verseBookmarkLoading[verse.id] return ( {verse.verseNum} {verse.text} {user && ( handleVerseBookmarkToggle(verse)} disabled={isVerseLoading} sx={{ opacity: isVerseBookmarked ? 1 : 0.3, transition: 'opacity 0.2s', color: isVerseBookmarked ? 'warning.main' : 'action.active' }} > {isVerseBookmarked ? : } )} ) })} ) : ( {t('noVerses')} )} {/* Navigation */} {currentBook?.name} {selectedChapter} ) }