Add real-time favorites refresh and improve mobile layout - favorites menu updates instantly when favorites change
This commit is contained in:
@@ -267,6 +267,11 @@ function App() {
|
||||
navigate(`/book/${bookName}`);
|
||||
};
|
||||
|
||||
const handleFavoriteChange = () => {
|
||||
// This will trigger a re-render of the FavoritesMenu
|
||||
setUser(prev => ({ ...prev }));
|
||||
};
|
||||
|
||||
if (!bookName || !chapterNumber || !actualBookName) {
|
||||
return <div>Chapter not found</div>;
|
||||
}
|
||||
@@ -278,6 +283,7 @@ function App() {
|
||||
onBack={handleBack}
|
||||
formatBookName={formatBookName}
|
||||
user={user}
|
||||
onFavoriteChange={handleFavoriteChange}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -8,9 +8,10 @@ interface BibleReaderProps {
|
||||
onBack: () => void;
|
||||
formatBookName: (bookName: string) => string;
|
||||
user?: any;
|
||||
onFavoriteChange?: () => void;
|
||||
}
|
||||
|
||||
const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, formatBookName, user }) => {
|
||||
const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, formatBookName, user, onFavoriteChange }) => {
|
||||
const [content, setContent] = useState<string>('');
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [chapters, setChapters] = useState<string[]>([]);
|
||||
@@ -89,6 +90,7 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
||||
return newFavorites;
|
||||
});
|
||||
console.log('Removed verse favorite:', verseNumber);
|
||||
onFavoriteChange?.(); // Notify parent to refresh favorites menu
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,10 +112,12 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
||||
if (response.ok) {
|
||||
setFavorites(prev => new Set(prev).add(verseNumber));
|
||||
console.log('Added verse favorite:', verseNumber);
|
||||
onFavoriteChange?.(); // Notify parent to refresh favorites menu
|
||||
} 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);
|
||||
onFavoriteChange?.(); // Notify parent to refresh favorites menu
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -276,48 +280,53 @@ const BibleReader: React.FC<BibleReaderProps> = ({ book, chapter, onBack, format
|
||||
return (
|
||||
<div>
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between mb-8">
|
||||
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between mb-8 space-y-4 sm:space-y-0">
|
||||
<button
|
||||
onClick={onBack}
|
||||
className="flex items-center space-x-2 text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors"
|
||||
>
|
||||
<ArrowLeft className="h-5 w-5" />
|
||||
<span>Back to Chapters</span>
|
||||
<span className="hidden sm:inline">Back to Chapters</span>
|
||||
<span className="sm:hidden">Back</span>
|
||||
</button>
|
||||
|
||||
{/* Font Size Controls */}
|
||||
<div className="flex items-center space-x-2">
|
||||
<span className="text-sm text-gray-600 dark:text-gray-400">Font Size:</span>
|
||||
<span className="hidden sm:inline text-sm text-gray-600 dark:text-gray-400">Font Size:</span>
|
||||
<span className="sm:hidden text-xs text-gray-600 dark:text-gray-400">Size:</span>
|
||||
<div className="flex space-x-1">
|
||||
<button
|
||||
onClick={() => handleFontSizeChange('small')}
|
||||
className={`px-3 py-1 text-xs rounded ${
|
||||
className={`px-2 sm:px-3 py-1 text-xs rounded ${
|
||||
fontSize === 'small'
|
||||
? 'bg-blue-600 text-white'
|
||||
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600'
|
||||
} transition-colors`}
|
||||
>
|
||||
Small
|
||||
<span className="hidden sm:inline">Small</span>
|
||||
<span className="sm:hidden">S</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleFontSizeChange('medium')}
|
||||
className={`px-3 py-1 text-xs rounded ${
|
||||
className={`px-2 sm:px-3 py-1 text-xs rounded ${
|
||||
fontSize === 'medium'
|
||||
? 'bg-blue-600 text-white'
|
||||
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600'
|
||||
} transition-colors`}
|
||||
>
|
||||
Medium
|
||||
<span className="hidden sm:inline">Medium</span>
|
||||
<span className="sm:hidden">M</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleFontSizeChange('large')}
|
||||
className={`px-3 py-1 text-xs rounded ${
|
||||
className={`px-2 sm:px-3 py-1 text-xs rounded ${
|
||||
fontSize === 'large'
|
||||
? 'bg-blue-600 text-white'
|
||||
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600'
|
||||
} transition-colors`}
|
||||
>
|
||||
Large
|
||||
<span className="hidden sm:inline">Large</span>
|
||||
<span className="sm:hidden">L</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user