diff --git a/app/[locale]/search/page.tsx b/app/[locale]/search/page.tsx index cee22d4..b4f4f1c 100644 --- a/app/[locale]/search/page.tsx +++ b/app/[locale]/search/page.tsx @@ -3,7 +3,7 @@ import { useState, useEffect, useRef, useCallback } from 'react' import { useTranslations, useLocale } from 'next-intl' import { useAuth } from '@/hooks/use-auth' -import { useRouter } from 'next/navigation' +import { useRouter, useSearchParams } from 'next/navigation' import { Box, Container, @@ -106,6 +106,7 @@ export default function SearchPage() { const t = useTranslations('pages.search') const locale = useLocale() const router = useRouter() + const searchParams = useSearchParams() const { user } = useAuth() // Core search state @@ -114,6 +115,7 @@ export default function SearchPage() { const [loading, setLoading] = useState(false) const [totalResults, setTotalResults] = useState(0) const [currentPage, setCurrentPage] = useState(1) + const [shouldSearchFromUrl, setShouldSearchFromUrl] = useState(false) // UI state const [filtersOpen, setFiltersOpen] = useState(false) @@ -173,6 +175,28 @@ export default function SearchPage() { } }, [user]) + // Load search parameters from URL (run only once on mount) + useEffect(() => { + const urlQuery = searchParams.get('q') + const urlTestament = searchParams.get('testament') + const urlSearchType = searchParams.get('type') + const urlBooks = searchParams.get('books') + + if (urlQuery) { + setSearchQuery(urlQuery) + setShouldSearchFromUrl(true) + } + + if (urlTestament || urlSearchType || urlBooks) { + setFilters(prev => ({ + ...prev, + ...(urlTestament && { testament: urlTestament as any }), + ...(urlSearchType && { searchType: urlSearchType as any }), + ...(urlBooks && { bookKeys: urlBooks.split(',').filter(Boolean) }) + })) + } + }, []) // Empty dependency array to run only once + // Load versions and books useEffect(() => { const loadVersions = async () => { @@ -275,6 +299,17 @@ export default function SearchPage() { setResults(data.results || []) setTotalResults(data.total || 0) + // Update URL with search parameters for sharing and tracking + const urlParams = new URLSearchParams({ + q: searchTerm, + ...(filters.testament !== 'all' && { testament: filters.testament }), + ...(filters.searchType !== 'words' && { type: filters.searchType }), + ...(filters.bookKeys.length > 0 && { books: filters.bookKeys.join(',') }) + }) + + const newUrl = `${window.location.pathname}?${urlParams.toString()}` + window.history.replaceState({}, '', newUrl) + // Scroll to results on mobile if (isMobile && resultsRef.current) { resultsRef.current.scrollIntoView({ behavior: 'smooth' }) @@ -320,6 +355,14 @@ export default function SearchPage() { } }, [searchQuery, filters, searchHistory, locale, isMobile]) + // Trigger search from URL after handleSearch is defined + useEffect(() => { + if (shouldSearchFromUrl && searchQuery) { + handleSearch(searchQuery, 1) + setShouldSearchFromUrl(false) + } + }, [shouldSearchFromUrl, searchQuery, handleSearch]) + const handleVerseBookmark = useCallback(async (result: SearchResult) => { if (!user) return