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) {

View File

@@ -50,6 +50,7 @@ interface BookmarkItem {
bookId: string
chapterNum: number
verseNum?: number
versionId: string
}
verse?: {
id: string
@@ -118,7 +119,8 @@ export default function BookmarksPage() {
const handleNavigateToBookmark = (bookmark: BookmarkItem) => {
const params = new URLSearchParams({
book: bookmark.navigation.bookId,
chapter: bookmark.navigation.chapterNum.toString()
chapter: bookmark.navigation.chapterNum.toString(),
version: bookmark.navigation.versionId
})
if (bookmark.navigation.verseNum) {

View File

@@ -50,20 +50,30 @@ export default function Contact() {
setIsSubmitting(true)
try {
// Simulate form submission
await new Promise(resolve => setTimeout(resolve, 1000))
// Here you would typically send the data to your API
console.log('Form submitted:', formData)
setFormData({
name: '',
email: '',
subject: '',
message: ''
const response = await fetch('/api/contact', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData)
})
setShowSuccess(true)
const data = await response.json()
if (response.ok && data.success) {
setFormData({
name: '',
email: '',
subject: '',
message: ''
})
setShowSuccess(true)
} else {
console.error('Contact form error:', data.error)
setShowError(true)
}
} catch (error) {
console.error('Contact form submission error:', error)
setShowError(true)
} finally {
setIsSubmitting(false)