Add scroll-to-verse functionality - verses now have IDs and clicking verse favorites automatically scrolls to the specific verse

This commit is contained in:
Ryderjj89
2025-09-14 12:52:03 -04:00
parent f46db34329
commit 57e3f4e26c
2 changed files with 27 additions and 3 deletions

View File

@@ -27,6 +27,26 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
loadChapters(); loadChapters();
}, [book, chapter]); }, [book, chapter]);
// Scroll to verse if specified in URL hash
useEffect(() => {
if (!loading && content) {
// Check if there's a verse hash in the URL
const hash = window.location.hash;
if (hash.startsWith('#verse-')) {
const verseElement = document.getElementById(hash.substring(1));
if (verseElement) {
// Small delay to ensure content is rendered
setTimeout(() => {
verseElement.scrollIntoView({
behavior: 'smooth',
block: 'center'
});
}, 100);
}
}
}
}, [loading, content]);
// Load favorites when user is available // Load favorites when user is available
useEffect(() => { useEffect(() => {
if (user) { if (user) {
@@ -224,7 +244,7 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
const verseText = verseMatch[2]; const verseText = verseMatch[2];
verses.push( verses.push(
<div key={`verse-${verseNumber}`} className="mb-4 flex items-start p-2 rounded transition-colors"> <div key={`verse-${verseNumber}`} id={`verse-${verseNumber}`} className="mb-4 flex items-start p-2 rounded transition-colors">
<div className="flex-1"> <div className="flex-1">
<span className="verse-number font-semibold text-blue-600 dark:text-blue-400 mr-2">{verseNumber}</span> <span className="verse-number font-semibold text-blue-600 dark:text-blue-400 mr-2">{verseNumber}</span>
<span className="bible-text">{verseText}</span> <span className="bible-text">{verseText}</span>

View File

@@ -70,8 +70,12 @@ const FavoritesMenu: React.FC<FavoritesMenuProps> = ({ user, formatBookName, get
const urlBookName = getBookUrlName(favorite.book); const urlBookName = getBookUrlName(favorite.book);
if (favorite.chapter) { if (favorite.chapter) {
// Navigate to chapter // Navigate to chapter, with verse hash if it's a verse favorite
navigate(`/book/${urlBookName}/chapter/${favorite.chapter}`); let url = `/book/${urlBookName}/chapter/${favorite.chapter}`;
if (favorite.verse_start) {
url += `#verse-${favorite.verse_start}`;
}
navigate(url);
} else { } else {
// Navigate to book // Navigate to book
navigate(`/book/${urlBookName}`); navigate(`/book/${urlBookName}`);