From df0eb6661f41cade1e36cfb0fec538d13a463dd3 Mon Sep 17 00:00:00 2001 From: andupetcu <47487320+andupetcu@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:13:13 +0300 Subject: [PATCH] Add version selector to /[locale]/search: new /api/bible/versions endpoint; fetch versions per locale; refetch books on version change; pass version to search API; localized label. --- app/[locale]/search/page.tsx | 40 +++++++++++++++++++++++++++++++-- app/api/bible/versions/route.ts | 33 +++++++++++++++++++++++++++ messages/en.json | 1 + messages/ro.json | 1 + 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 app/api/bible/versions/route.ts diff --git a/app/[locale]/search/page.tsx b/app/[locale]/search/page.tsx index cabf100..59a9416 100644 --- a/app/[locale]/search/page.tsx +++ b/app/[locale]/search/page.tsx @@ -69,6 +69,8 @@ export default function SearchPage() { const [searchHistory, setSearchHistory] = useState([]) const [filters, setFilters] = useState({ testament: 'all', bookKeys: [], exactMatch: false }) const [booksData, setBooksData] = useState([]) + const [versions, setVersions] = useState>([]) + const [selectedVersion, setSelectedVersion] = useState('') const oldTestamentBooks = booksData.filter(b => b.orderNum <= 39) const newTestamentBooks = booksData.filter(b => b.orderNum > 39) @@ -84,8 +86,26 @@ export default function SearchPage() { }, []) useEffect(() => { + // Fetch available versions for locale + fetch(`/api/bible/versions?locale=${locale}`) + .then(res => res.json()) + .then(data => { + const list = (data.versions || []) as Array<{ id: string; name: string; abbreviation: string; isDefault: boolean }> + setVersions(list) + const def = list.find(v => v.isDefault) || list[0] + setSelectedVersion(def?.abbreviation || '') + }) + .catch(() => { + setVersions([]) + setSelectedVersion('') + }) + }, [locale]) + + useEffect(() => { + if (!selectedVersion && versions.length === 0) return // Fetch available books for current locale/version - fetch(`/api/bible/books?locale=${locale}`) + const qs = new URLSearchParams({ locale, ...(selectedVersion ? { version: selectedVersion } : {}) }) + fetch(`/api/bible/books?${qs}`) .then(res => res.json()) .then(data => { const mapped: BookOption[] = (data.books || []).map((b: any) => ({ @@ -98,7 +118,7 @@ export default function SearchPage() { setBooksData(mapped) }) .catch(() => setBooksData([])) - }, [locale]) + }, [locale, selectedVersion, versions.length]) const handleSearch = async () => { if (!searchQuery.trim()) return @@ -117,6 +137,7 @@ export default function SearchPage() { exactMatch: filters.exactMatch.toString(), bookKeys: filters.bookKeys.join(','), locale, + ...(selectedVersion ? { version: selectedVersion } : {}), }) const response = await fetch(`/api/search/verses?${params}`) @@ -231,6 +252,21 @@ export default function SearchPage() { + + {t('filters.version')} + + + }> {t('filters.specificBooks')} diff --git a/app/api/bible/versions/route.ts b/app/api/bible/versions/route.ts new file mode 100644 index 0000000..8407bdf --- /dev/null +++ b/app/api/bible/versions/route.ts @@ -0,0 +1,33 @@ +import { NextRequest, NextResponse } from 'next/server' +import { prisma } from '@/lib/db' + +export const runtime = 'nodejs' + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url) + const locale = (searchParams.get('locale') || 'ro').toLowerCase() + + const langCandidates = Array.from(new Set([locale, locale.toLowerCase(), locale.toUpperCase()])) + + const versions = await prisma.bibleVersion.findMany({ + where: { language: { in: langCandidates } }, + orderBy: [{ isDefault: 'desc' }, { name: 'asc' }] + }) + + return NextResponse.json({ + success: true, + versions: versions.map(v => ({ + id: v.id, + name: v.name, + abbreviation: v.abbreviation, + language: v.language, + isDefault: v.isDefault, + })) + }) + } catch (error) { + console.error('Error fetching versions:', error) + return NextResponse.json({ success: false, versions: [] }, { status: 500 }) + } +} + diff --git a/messages/en.json b/messages/en.json index 0046aad..f7c0310 100644 --- a/messages/en.json +++ b/messages/en.json @@ -155,6 +155,7 @@ "title": "Filters", "clear": "Clear", "testament": "Testament", + "version": "Version", "options": { "all": "Whole Bible", "old": "Old Testament", diff --git a/messages/ro.json b/messages/ro.json index 1a79333..93187b5 100644 --- a/messages/ro.json +++ b/messages/ro.json @@ -155,6 +155,7 @@ "title": "Filtre", "clear": "Șterge", "testament": "Testament", + "version": "Versiune", "options": { "all": "Toată Biblia", "old": "Vechiul Testament",