Fix verse hover functionality with improved visibility and better UX
This commit is contained in:
@@ -49,6 +49,7 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
|
|
||||||
const verseFavorites = new Set<string>(favoriteStrings);
|
const verseFavorites = new Set<string>(favoriteStrings);
|
||||||
setFavorites(verseFavorites);
|
setFavorites(verseFavorites);
|
||||||
|
console.log('Loaded verse favorites:', favoriteStrings);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load favorites:', error);
|
console.error('Failed to load favorites:', error);
|
||||||
@@ -76,16 +77,19 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (verseFavorite) {
|
if (verseFavorite) {
|
||||||
await fetch(`/api/favorites/${verseFavorite.id}`, {
|
const deleteResponse = await fetch(`/api/favorites/${verseFavorite.id}`, {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
credentials: 'include'
|
credentials: 'include'
|
||||||
});
|
});
|
||||||
|
|
||||||
setFavorites(prev => {
|
if (deleteResponse.ok) {
|
||||||
const newFavorites = new Set(prev);
|
setFavorites(prev => {
|
||||||
newFavorites.delete(verseNumber);
|
const newFavorites = new Set(prev);
|
||||||
return newFavorites;
|
newFavorites.delete(verseNumber);
|
||||||
});
|
return newFavorites;
|
||||||
|
});
|
||||||
|
console.log('Removed verse favorite:', verseNumber);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -105,6 +109,11 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
setFavorites(prev => new Set(prev).add(verseNumber));
|
setFavorites(prev => new Set(prev).add(verseNumber));
|
||||||
|
console.log('Added verse favorite:', verseNumber);
|
||||||
|
} else if (response.status === 409) {
|
||||||
|
// 409 means it already exists, which is fine - just update the UI
|
||||||
|
setFavorites(prev => new Set(prev).add(verseNumber));
|
||||||
|
console.log('Verse favorite already exists, updated UI:', verseNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -211,12 +220,16 @@ 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 group">
|
<div key={`verse-${verseNumber}`} className="mb-4 flex items-start hover:bg-gray-50 dark:hover:bg-gray-800 p-2 rounded transition-colors group">
|
||||||
{/* Star button - only show for authenticated users */}
|
{/* Star button - only show for authenticated users */}
|
||||||
{user && (
|
{user && (
|
||||||
<button
|
<button
|
||||||
onClick={() => toggleFavorite(verseNumber)}
|
onClick={() => toggleFavorite(verseNumber)}
|
||||||
className="mr-2 mt-1 p-1 opacity-0 group-hover:opacity-100 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-all"
|
className={`mr-2 mt-1 p-1 rounded transition-all ${
|
||||||
|
favorites.has(verseNumber)
|
||||||
|
? 'opacity-100'
|
||||||
|
: 'opacity-30 hover:opacity-100 group-hover:opacity-100'
|
||||||
|
} hover:bg-gray-200 dark:hover:bg-gray-600`}
|
||||||
title={favorites.has(verseNumber) ? 'Remove from favorites' : 'Add to favorites'}
|
title={favorites.has(verseNumber) ? 'Remove from favorites' : 'Add to favorites'}
|
||||||
>
|
>
|
||||||
<Star
|
<Star
|
||||||
@@ -229,7 +242,7 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<span className="verse-number">{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>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -238,14 +251,14 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
// Chapter header
|
// Chapter header
|
||||||
const headerText = line.replace(/^#+\s*/, '');
|
const headerText = line.replace(/^#+\s*/, '');
|
||||||
verses.push(
|
verses.push(
|
||||||
<h2 key={`header-${i}`} className="chapter-title">
|
<h2 key={`header-${i}`} className="chapter-title text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6 mt-8">
|
||||||
{headerText}
|
{headerText}
|
||||||
</h2>
|
</h2>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Regular text (continuation of previous verse or other content)
|
// Regular text (continuation of previous verse or other content)
|
||||||
verses.push(
|
verses.push(
|
||||||
<p key={`text-${i}`} className="bible-text mb-4">
|
<p key={`text-${i}`} className="bible-text mb-4 text-gray-700 dark:text-gray-300">
|
||||||
{line}
|
{line}
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
@@ -316,7 +329,7 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
|||||||
|
|
||||||
{/* Chapter Title */}
|
{/* Chapter Title */}
|
||||||
<div className="text-center mb-8">
|
<div className="text-center mb-8">
|
||||||
<h1 className="book-title">
|
<h1 className="text-3xl font-bold text-gray-900 dark:text-gray-100 mb-2">
|
||||||
{formatBookName(book)} {chapter}
|
{formatBookName(book)} {chapter}
|
||||||
</h1>
|
</h1>
|
||||||
{user && (
|
{user && (
|
||||||
|
|||||||
Reference in New Issue
Block a user