From 44831a096f142391b652fb839dc2f1707e3a1414 Mon Sep 17 00:00:00 2001 From: Andrei Date: Mon, 29 Sep 2025 20:14:51 +0000 Subject: [PATCH] fix: improve Bible reader loading UX with skeleton states MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove full-screen loading backdrop that hides entire UI - Add skeleton loading components for chapter headers and verses - Implement smooth content transitions without UI disappearance - Change initial loading state to prevent immediate UI hide - Enhance Suspense fallbacks with better loading messages - Keep Bible reader interface visible during all loading states Fixes issue where: - Entire reader disappeared during chapter changes - Users saw only header/footer during loading - Poor perceived performance with jarring transitions Now provides professional skeleton loading within the reader interface for a smooth, responsive user experience. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../bible/[version]/[book]/[chapter]/page.tsx | 13 +- app/[locale]/bible/page.tsx | 11 +- app/[locale]/bible/reader.tsx | 115 ++++++++++++++---- 3 files changed, 114 insertions(+), 25 deletions(-) diff --git a/app/[locale]/bible/[version]/[book]/[chapter]/page.tsx b/app/[locale]/bible/[version]/[book]/[chapter]/page.tsx index 0f90376..0385913 100644 --- a/app/[locale]/bible/[version]/[book]/[chapter]/page.tsx +++ b/app/[locale]/bible/[version]/[book]/[chapter]/page.tsx @@ -120,8 +120,17 @@ export default async function BibleChapterPage({ params }: PageProps) { // Pass the parameters as props instead of URLSearchParams return ( - Loading...}> - + Loading Bible reader... + + }> + Loading...}> + + Loading Bible reader... + + }> ) diff --git a/app/[locale]/bible/reader.tsx b/app/[locale]/bible/reader.tsx index f8451b7..1e269d2 100644 --- a/app/[locale]/bible/reader.tsx +++ b/app/[locale]/bible/reader.tsx @@ -175,7 +175,7 @@ export default function BibleReaderNew({ initialVersion, initialBook, initialCha const [selectedBook, setSelectedBook] = useState('') const [selectedChapter, setSelectedChapter] = useState(1) const [verses, setVerses] = useState([]) - const [loading, setLoading] = useState(true) + const [loading, setLoading] = useState(false) const [versionsLoading, setVersionsLoading] = useState(true) const [showAllVersions, setShowAllVersions] = useState(false) @@ -1382,13 +1382,7 @@ export default function BibleReaderNew({ initialVersion, initialBook, initialCha ) - if (loading && books.length === 0) { - return ( - - - - ) - } + // Always render the UI - loading will be handled within components return ( {/* Chapter Header */} - - {currentBook?.name} {selectedChapter} - - - {(loading && previousVerses.length > 0 ? previousVerses : verses).length} {t('verses')} - + {loading && !currentBook ? ( + // Skeleton loading for chapter header + <> + + + + ) : ( + <> + + {currentBook?.name} {selectedChapter} + + + {(loading && previousVerses.length > 0 ? previousVerses : verses).length} {t('verses')} + + + )} {/* Verses */} - {(loading && previousVerses.length > 0 ? previousVerses : verses).map(renderVerse)} + {loading && verses.length === 0 && previousVerses.length === 0 ? ( + // Skeleton loading for verses + <> + {Array.from({ length: 8 }).map((_, index) => ( + + + + + + {Math.random() > 0.5 && ( + + )} + + + ))} + + ) : ( + (loading && previousVerses.length > 0 ? previousVerses : verses).map(renderVerse) + )} {/* Chapter Navigation */}