Fix bible reader version filtering and improve UI
- Fix API to show all 1416+ bible versions with language filtering toggle - Add default language-specific filtering with option to show all versions - Fix books API to work with cross-language version selection - Add toggle button with visual feedback and version count display - Improve dropdown scrolling and add language indicators - Maintain backward compatibility while fixing core functionality 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -137,6 +137,7 @@ export default function BibleReaderNew() {
|
||||
const [verses, setVerses] = useState<BibleVerse[]>([])
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [versionsLoading, setVersionsLoading] = useState(true)
|
||||
const [showAllVersions, setShowAllVersions] = useState(false)
|
||||
|
||||
// UI state
|
||||
const [settingsOpen, setSettingsOpen] = useState(false)
|
||||
@@ -216,18 +217,25 @@ export default function BibleReaderNew() {
|
||||
return () => window.removeEventListener('scroll', handleScroll)
|
||||
}, [])
|
||||
|
||||
// Fetch all bible versions
|
||||
// Fetch versions based on showAllVersions state and locale
|
||||
useEffect(() => {
|
||||
setVersionsLoading(true)
|
||||
fetch(`/api/bible/versions?all=true`)
|
||||
const url = showAllVersions
|
||||
? '/api/bible/versions?all=true'
|
||||
: `/api/bible/versions?language=${locale}`
|
||||
|
||||
fetch(url)
|
||||
.then(res => res.json())
|
||||
.then(data => {
|
||||
if (data.success && data.versions) {
|
||||
setVersions(data.versions)
|
||||
// Select default version or first available
|
||||
const defaultVersion = data.versions.find((v: BibleVersion) => v.isDefault) || data.versions[0]
|
||||
if (defaultVersion) {
|
||||
setSelectedVersion(defaultVersion.id)
|
||||
// Keep current selection if it exists in new list, otherwise select default/first
|
||||
const currentVersionExists = data.versions.some((v: BibleVersion) => v.id === selectedVersion)
|
||||
if (!currentVersionExists || !selectedVersion) {
|
||||
const defaultVersion = data.versions.find((v: BibleVersion) => v.isDefault) || data.versions[0]
|
||||
if (defaultVersion) {
|
||||
setSelectedVersion(defaultVersion.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
setVersionsLoading(false)
|
||||
@@ -236,7 +244,7 @@ export default function BibleReaderNew() {
|
||||
console.error('Error fetching versions:', err)
|
||||
setVersionsLoading(false)
|
||||
})
|
||||
}, [locale])
|
||||
}, [locale, showAllVersions, selectedVersion])
|
||||
|
||||
// Fetch books when version changes
|
||||
useEffect(() => {
|
||||
@@ -677,36 +685,50 @@ export default function BibleReaderNew() {
|
||||
<Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap', alignItems: 'center', justifyContent: 'center' }}>
|
||||
{/* Version Selection */}
|
||||
<Box sx={{ flex: { xs: '1 1 100%', sm: '1 1 auto' }, minWidth: { sm: 180, md: 200 } }}>
|
||||
<FormControl fullWidth size="small">
|
||||
<InputLabel>{t('version')}</InputLabel>
|
||||
<Select
|
||||
value={selectedVersion}
|
||||
label={t('version')}
|
||||
onChange={(e) => {
|
||||
setSelectedVersion(e.target.value)
|
||||
// Reset to first book when version changes
|
||||
if (books.length > 0) {
|
||||
setSelectedBook(books[0].id)
|
||||
setSelectedChapter(1)
|
||||
updateUrl(books[0].id, 1, e.target.value)
|
||||
}
|
||||
}}
|
||||
disabled={versionsLoading}
|
||||
MenuProps={{
|
||||
PaperProps: {
|
||||
style: {
|
||||
maxHeight: 400,
|
||||
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>
|
||||
<FormControl fullWidth size="small">
|
||||
<InputLabel>{t('version')}</InputLabel>
|
||||
<Select
|
||||
value={selectedVersion}
|
||||
label={t('version')}
|
||||
onChange={(e) => {
|
||||
setSelectedVersion(e.target.value)
|
||||
// Reset to first book when version changes
|
||||
if (books.length > 0) {
|
||||
setSelectedBook(books[0].id)
|
||||
setSelectedChapter(1)
|
||||
updateUrl(books[0].id, 1, e.target.value)
|
||||
}
|
||||
}}
|
||||
disabled={versionsLoading}
|
||||
MenuProps={{
|
||||
PaperProps: {
|
||||
style: {
|
||||
maxHeight: 400,
|
||||
},
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
{versions.map((version) => (
|
||||
<MenuItem key={version.id} value={version.id}>
|
||||
{version.abbreviation} - {version.name} ({version.language.toUpperCase()})
|
||||
</MenuItem>
|
||||
))}
|
||||
</Select>
|
||||
</FormControl>
|
||||
}}
|
||||
>
|
||||
{versions.map((version) => (
|
||||
<MenuItem key={version.id} value={version.id}>
|
||||
{version.abbreviation} - {version.name} ({version.language.toUpperCase()})
|
||||
</MenuItem>
|
||||
))}
|
||||
</Select>
|
||||
</FormControl>
|
||||
<Tooltip title={showAllVersions ? 'Show language versions only' : 'Show all versions'}>
|
||||
<IconButton
|
||||
size="small"
|
||||
onClick={() => setShowAllVersions(prev => !prev)}
|
||||
sx={{ color: showAllVersions ? 'primary.main' : 'inherit' }}
|
||||
>
|
||||
<Visibility />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</Box>
|
||||
<Typography variant="caption" color="text.secondary" sx={{ fontSize: '0.7em' }}>
|
||||
{showAllVersions ? `${versions.length} versions (all languages)` : `${versions.length} versions (${locale.toUpperCase()})`}
|
||||
</Typography>
|
||||
</Box>
|
||||
|
||||
{/* Books Selection */}
|
||||
|
||||
Reference in New Issue
Block a user