Add Mailgun admin tools and contact API

This commit is contained in:
2025-09-24 13:59:26 +00:00
parent 6329ad0618
commit 1054f5d817
13 changed files with 1459 additions and 29 deletions

View File

@@ -3,7 +3,7 @@
import { useState, useEffect, useRef, useCallback } from 'react'
import { useTranslations, useLocale } from 'next-intl'
import { useAuth } from '@/hooks/use-auth'
import { useSearchParams } from 'next/navigation'
import { useSearchParams, useRouter } from 'next/navigation'
import {
Box,
Typography,
@@ -126,6 +126,7 @@ export default function BibleReaderNew() {
const isMobile = useMediaQuery(theme.breakpoints.down('md'))
const t = useTranslations('pages.bible')
const locale = useLocale()
const router = useRouter()
const searchParams = useSearchParams()
const { user } = useAuth()
@@ -261,6 +262,68 @@ export default function BibleReaderNew() {
})
}, [locale, showAllVersions, selectedVersion])
// Handle URL parameters for bookmark navigation
useEffect(() => {
const urlVersion = searchParams.get('version')
const urlBook = searchParams.get('book')
const urlChapter = searchParams.get('chapter')
const urlVerse = searchParams.get('verse')
if (urlVersion && versions.length > 0) {
// Check if this version exists
const version = versions.find(v => v.id === urlVersion)
if (version && selectedVersion !== urlVersion) {
setSelectedVersion(urlVersion)
}
}
if (urlBook && books.length > 0) {
const book = books.find(b => b.id === urlBook)
if (book && selectedBook !== urlBook) {
setSelectedBook(urlBook)
}
}
if (urlChapter) {
const chapter = parseInt(urlChapter)
if (chapter && selectedChapter !== chapter) {
setSelectedChapter(chapter)
}
}
if (urlVerse && verses.length > 0) {
const verseNum = parseInt(urlVerse)
if (verseNum) {
// Highlight the verse
setTimeout(() => {
const verseElement = verseRefs.current[verseNum]
if (verseElement) {
verseElement.scrollIntoView({ behavior: 'smooth', block: 'center' })
setHighlightedVerse(verseNum)
}
}, 500)
}
}
}, [searchParams, versions, books, verses, selectedVersion, selectedBook, selectedChapter])
// Function to update URL without causing full page reload
const updateUrl = useCallback((bookId?: string, chapter?: number, versionId?: string) => {
const params = new URLSearchParams()
if (versionId || selectedVersion) {
params.set('version', versionId || selectedVersion)
}
if (bookId || selectedBook) {
params.set('book', bookId || selectedBook)
}
if (chapter || selectedChapter) {
params.set('chapter', String(chapter || selectedChapter))
}
const newUrl = `/${locale}/bible?${params.toString()}`
router.replace(newUrl, { scroll: false })
}, [locale, selectedVersion, selectedBook, selectedChapter, router])
// Fetch books when version changes
useEffect(() => {
if (selectedVersion) {
@@ -431,16 +494,6 @@ export default function BibleReaderNew() {
const currentBook = books.find(book => book.id === selectedBook)
const maxChapters = currentBook?.chapters?.length || 1
const updateUrl = (bookId: string, chapter: number, version?: string) => {
const url = new URL(window.location.href)
url.searchParams.set('book', bookId)
url.searchParams.set('chapter', chapter.toString())
if (version) {
url.searchParams.set('version', version)
}
window.history.replaceState({}, '', url.toString())
}
const scrollToVerse = (verseNum: number) => {
const verseElement = verseRefs.current[verseNum]
if (verseElement) {