diff --git a/index.html b/index.html index 95501ad4..2332fc24 100644 --- a/index.html +++ b/index.html @@ -3,12 +3,12 @@ - thrilltrack-explorer - + ThrillWiki - Theme Park & Roller Coaster Database + - - + + diff --git a/src/hooks/useDocumentTitle.ts b/src/hooks/useDocumentTitle.ts new file mode 100644 index 00000000..1f944b86 --- /dev/null +++ b/src/hooks/useDocumentTitle.ts @@ -0,0 +1,12 @@ +import { useEffect } from 'react'; + +export function useDocumentTitle(title: string, suffix: string = 'ThrillWiki') { + useEffect(() => { + const fullTitle = title ? `${title} | ${suffix}` : suffix; + document.title = fullTitle; + + return () => { + document.title = suffix; + }; + }, [title, suffix]); +} diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx index 014fd97c..44ce9d4d 100644 --- a/src/pages/Admin.tsx +++ b/src/pages/Admin.tsx @@ -13,8 +13,10 @@ import { UserManagement } from '@/components/admin/UserManagement'; import { AdminHeader } from '@/components/layout/AdminHeader'; import { useModerationStats } from '@/hooks/useModerationStats'; import { useAdminSettings } from '@/hooks/useAdminSettings'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Admin() { + useDocumentTitle('Admin Panel'); const isMobile = useIsMobile(); const { user, loading: authLoading } = useAuth(); const { isModerator, loading: roleLoading } = useUserRole(); diff --git a/src/pages/AdminBlog.tsx b/src/pages/AdminBlog.tsx index 304e2475..55fd3e04 100644 --- a/src/pages/AdminBlog.tsx +++ b/src/pages/AdminBlog.tsx @@ -19,6 +19,7 @@ import { extractCloudflareImageId } from '@/lib/cloudflareImageUtils'; import { Edit, Trash2, Eye, Plus } from 'lucide-react'; import { toast } from 'sonner'; import { formatDistanceToNow } from 'date-fns'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; interface BlogPost { id: string; @@ -34,6 +35,7 @@ interface BlogPost { } export default function AdminBlog() { + useDocumentTitle('Blog Management - Admin'); const { user } = useAuth(); const { isAdmin, loading } = useUserRole(); const navigate = useNavigate(); diff --git a/src/pages/AdminDashboard.tsx b/src/pages/AdminDashboard.tsx index f9d927cd..72d7ed8c 100644 --- a/src/pages/AdminDashboard.tsx +++ b/src/pages/AdminDashboard.tsx @@ -18,8 +18,10 @@ import { supabase } from '@/integrations/supabase/client'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Skeleton } from '@/components/ui/skeleton'; import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminDashboard() { + useDocumentTitle('Dashboard - Admin'); const { user, loading: authLoading } = useAuth(); const { isModerator, loading: roleLoading } = useUserRole(); const { needsEnrollment, loading: mfaLoading } = useRequireMFA(); diff --git a/src/pages/AdminModeration.tsx b/src/pages/AdminModeration.tsx index de929f8c..fb1906c5 100644 --- a/src/pages/AdminModeration.tsx +++ b/src/pages/AdminModeration.tsx @@ -6,8 +6,10 @@ import { ModerationQueue, ModerationQueueRef } from '@/components/moderation/Mod import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { useModerationStats } from '@/hooks/useModerationStats'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminModeration() { + useDocumentTitle('Moderation Queue - Admin'); const { isLoading, isAuthorized, needsMFA, user } = useAdminGuard(); const moderationQueueRef = useRef(null); diff --git a/src/pages/AdminReports.tsx b/src/pages/AdminReports.tsx index 93e9055d..785c3cc9 100644 --- a/src/pages/AdminReports.tsx +++ b/src/pages/AdminReports.tsx @@ -6,8 +6,10 @@ import { ReportsQueue, ReportsQueueRef } from '@/components/moderation/ReportsQu import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { useModerationStats } from '@/hooks/useModerationStats'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminReports() { + useDocumentTitle('Reports Queue - Admin'); const { isLoading, isAuthorized, needsMFA } = useAdminGuard(); const reportsQueueRef = useRef(null); diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index d824fbed..b6ed9727 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -14,8 +14,10 @@ import { useAdminSettings } from '@/hooks/useAdminSettings'; import { NovuMigrationUtility } from '@/components/admin/NovuMigrationUtility'; import { TestDataGenerator } from '@/components/admin/TestDataGenerator'; import { Loader2, Save, Clock, Users, Bell, Shield, Settings, Trash2, Plug, AlertTriangle, Lock } from 'lucide-react'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminSettings() { + useDocumentTitle('Settings - Admin'); const { user } = useAuth(); const { isSuperuser, loading: roleLoading } = useUserRole(); const { diff --git a/src/pages/AdminSystemLog.tsx b/src/pages/AdminSystemLog.tsx index 50dc5148..a2847997 100644 --- a/src/pages/AdminSystemLog.tsx +++ b/src/pages/AdminSystemLog.tsx @@ -6,6 +6,7 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Card, CardContent } from '@/components/ui/card'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { AlertCircle } from 'lucide-react'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; interface ErrorBoundaryProps { children: ReactNode; @@ -48,6 +49,7 @@ class ErrorBoundary extends Component { } export default function AdminSystemLog() { + useDocumentTitle('System Activity Log - Admin'); const { isLoading, isAuthorized } = useAdminGuard(false); // No MFA required for viewing logs if (isLoading) { diff --git a/src/pages/AdminUsers.tsx b/src/pages/AdminUsers.tsx index 2d96460d..d5bc9cc6 100644 --- a/src/pages/AdminUsers.tsx +++ b/src/pages/AdminUsers.tsx @@ -4,8 +4,10 @@ import { AdminLayout } from '@/components/layout/AdminLayout'; import { UserManagement } from '@/components/admin/UserManagement'; import { Skeleton } from '@/components/ui/skeleton'; import { Card, CardContent } from '@/components/ui/card'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminUsers() { + useDocumentTitle('User Management - Admin'); const { isLoading, isAuthorized, needsMFA } = useAdminGuard(); if (isLoading) { diff --git a/src/pages/Auth.tsx b/src/pages/Auth.tsx index 6b8a99c1..7d3af131 100644 --- a/src/pages/Auth.tsx +++ b/src/pages/Auth.tsx @@ -19,8 +19,10 @@ import { StorageWarning } from '@/components/auth/StorageWarning'; import { MFAChallenge } from '@/components/auth/MFAChallenge'; import { verifyMfaUpgrade } from '@/lib/authService'; import { setAuthMethod } from '@/lib/sessionFlags'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Auth() { + useDocumentTitle('Sign In'); const [searchParams] = useSearchParams(); const navigate = useNavigate(); const { diff --git a/src/pages/AuthCallback.tsx b/src/pages/AuthCallback.tsx index d3d4a843..123e768c 100644 --- a/src/pages/AuthCallback.tsx +++ b/src/pages/AuthCallback.tsx @@ -13,8 +13,10 @@ import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { getErrorMessage } from '@/lib/errorHandler'; import { MFAStepUpModal } from '@/components/auth/MFAStepUpModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AuthCallback() { + useDocumentTitle('Sign In - Processing'); const navigate = useNavigate(); const { toast } = useToast(); const [status, setStatus] = useState<'processing' | 'success' | 'error' | 'mfa_required'>('processing'); diff --git a/src/pages/BlogIndex.tsx b/src/pages/BlogIndex.tsx index dd6c3f74..25e1c391 100644 --- a/src/pages/BlogIndex.tsx +++ b/src/pages/BlogIndex.tsx @@ -8,10 +8,12 @@ import { Search, ChevronLeft, ChevronRight } from 'lucide-react'; import { Skeleton } from '@/components/ui/skeleton'; import { Header } from '@/components/layout/Header'; import { Footer } from '@/components/layout/Footer'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const POSTS_PER_PAGE = 9; export default function BlogIndex() { + useDocumentTitle('Blog'); const [page, setPage] = useState(1); const [searchQuery, setSearchQuery] = useState(''); diff --git a/src/pages/BlogPost.tsx b/src/pages/BlogPost.tsx index 42c57131..f2a9a1d3 100644 --- a/src/pages/BlogPost.tsx +++ b/src/pages/BlogPost.tsx @@ -11,6 +11,7 @@ import { getCloudflareImageUrl } from '@/lib/cloudflareImageUtils'; import { Skeleton } from '@/components/ui/skeleton'; import { Header } from '@/components/layout/Header'; import { Footer } from '@/components/layout/Footer'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function BlogPost() { const { slug } = useParams<{ slug: string }>(); @@ -31,6 +32,9 @@ export default function BlogPost() { }, enabled: !!slug, }); + + // Update document title when post changes + useDocumentTitle(post?.title || 'Blog Post'); useEffect(() => { if (slug) { diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx index a6f1746c..39b78cf5 100644 --- a/src/pages/Contact.tsx +++ b/src/pages/Contact.tsx @@ -5,8 +5,10 @@ import { ContactFAQ } from '@/components/contact/ContactFAQ'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Link } from 'react-router-dom'; import { Header } from '@/components/layout/Header'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Contact() { + useDocumentTitle('Contact Us'); return (
diff --git a/src/pages/DesignerDetail.tsx b/src/pages/DesignerDetail.tsx index 2e882d5f..bd09075a 100644 --- a/src/pages/DesignerDetail.tsx +++ b/src/pages/DesignerDetail.tsx @@ -24,6 +24,7 @@ import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { trackPageView } from '@/lib/viewTracking'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function DesignerDetail() { const { slug } = useParams<{ slug: string }>(); @@ -37,6 +38,9 @@ export default function DesignerDetail() { const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); + + // Update document title when designer changes + useDocumentTitle(designer?.name || 'Designer Details'); useEffect(() => { if (slug) { diff --git a/src/pages/DesignerRides.tsx b/src/pages/DesignerRides.tsx index 4c4ec019..13215e3a 100644 --- a/src/pages/DesignerRides.tsx +++ b/src/pages/DesignerRides.tsx @@ -15,6 +15,7 @@ import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { useAuth } from '@/hooks/useAuth'; import { toast } from '@/hooks/use-toast'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function DesignerRides() { const { designerSlug } = useParams<{ designerSlug: string }>(); @@ -28,6 +29,9 @@ export default function DesignerRides() { const [sortBy, setSortBy] = useState('name'); const [filterCategory, setFilterCategory] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); + + // Update document title when designer changes + useDocumentTitle(designer ? `${designer.name} - Rides` : 'Designer Rides'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const fetchData = useCallback(async () => { diff --git a/src/pages/Designers.tsx b/src/pages/Designers.tsx index abc9768c..9ee1c1b0 100644 --- a/src/pages/Designers.tsx +++ b/src/pages/Designers.tsx @@ -23,8 +23,10 @@ import { toast } from '@/hooks/use-toast'; import { submitCompanyCreation } from '@/lib/companyHelpers'; import { useAuthModal } from '@/hooks/useAuthModal'; import { getErrorMessage } from '@/lib/errorHandler'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Designers() { + useDocumentTitle('Designers'); const navigate = useNavigate(); const { user } = useAuth(); const { isModerator } = useUserRole(); diff --git a/src/pages/ForceLogout.tsx b/src/pages/ForceLogout.tsx index 1d021b09..690e2519 100644 --- a/src/pages/ForceLogout.tsx +++ b/src/pages/ForceLogout.tsx @@ -2,6 +2,7 @@ import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { supabase } from "@/integrations/supabase/client"; import { authStorage } from "@/lib/authStorage"; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; /** * ForceLogout - Hidden endpoint for completely clearing auth session @@ -9,6 +10,7 @@ import { authStorage } from "@/lib/authStorage"; * Not linked anywhere in the UI - for manual navigation only */ const ForceLogout = () => { + useDocumentTitle('Signing Out'); const navigate = useNavigate(); useEffect(() => { diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 278f66d8..3c207938 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,8 +1,11 @@ import { Header } from '@/components/layout/Header'; import { SimpleHeroSearch } from '@/components/homepage/SimpleHeroSearch'; import { ContentTabs } from '@/components/homepage/ContentTabs'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const Index = () => { + useDocumentTitle('Home'); + return (
diff --git a/src/pages/ManufacturerDetail.tsx b/src/pages/ManufacturerDetail.tsx index d7659e82..90d45836 100644 --- a/src/pages/ManufacturerDetail.tsx +++ b/src/pages/ManufacturerDetail.tsx @@ -24,6 +24,7 @@ import { submitCompanyUpdate } from '@/lib/companyHelpers'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function ManufacturerDetail() { const { slug } = useParams<{ slug: string }>(); @@ -38,6 +39,9 @@ export default function ManufacturerDetail() { const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); + + // Update document title when manufacturer changes + useDocumentTitle(manufacturer?.name || 'Manufacturer Details'); useEffect(() => { if (slug) { diff --git a/src/pages/ManufacturerModels.tsx b/src/pages/ManufacturerModels.tsx index cfe6200a..bdafa48e 100644 --- a/src/pages/ManufacturerModels.tsx +++ b/src/pages/ManufacturerModels.tsx @@ -15,6 +15,7 @@ import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { useAuth } from '@/hooks/useAuth'; import { toast } from '@/hooks/use-toast'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; interface RideModelWithCount extends RideModel { ride_count: number; @@ -28,6 +29,9 @@ export default function ManufacturerModels() { const [manufacturer, setManufacturer] = useState(null); const [models, setModels] = useState([]); const [loading, setLoading] = useState(true); + + // Update document title when manufacturer changes + useDocumentTitle(manufacturer ? `${manufacturer.name} - Models` : 'Manufacturer Models'); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); const [filterCategory, setFilterCategory] = useState('all'); diff --git a/src/pages/ManufacturerRides.tsx b/src/pages/ManufacturerRides.tsx index 7282862e..be1a8d3a 100644 --- a/src/pages/ManufacturerRides.tsx +++ b/src/pages/ManufacturerRides.tsx @@ -15,6 +15,7 @@ import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { useAuth } from '@/hooks/useAuth'; import { toast } from '@/hooks/use-toast'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function ManufacturerRides() { const { manufacturerSlug } = useParams<{ manufacturerSlug: string }>(); @@ -28,6 +29,9 @@ export default function ManufacturerRides() { const [sortBy, setSortBy] = useState('name'); const [filterCategory, setFilterCategory] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); + + // Update document title when manufacturer changes + useDocumentTitle(manufacturer ? `${manufacturer.name} - Rides` : 'Manufacturer Rides'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const fetchData = useCallback(async () => { diff --git a/src/pages/Manufacturers.tsx b/src/pages/Manufacturers.tsx index 45257e9c..b81a1ed8 100644 --- a/src/pages/Manufacturers.tsx +++ b/src/pages/Manufacturers.tsx @@ -23,8 +23,10 @@ import { toast } from '@/hooks/use-toast'; import { submitCompanyCreation } from '@/lib/companyHelpers'; import { useAuthModal } from '@/hooks/useAuthModal'; import { getErrorMessage } from '@/lib/errorHandler'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Manufacturers() { + useDocumentTitle('Manufacturers'); const navigate = useNavigate(); const { user } = useAuth(); const { isModerator } = useUserRole(); diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx index f9cf7c5a..dc7ada83 100644 --- a/src/pages/NotFound.tsx +++ b/src/pages/NotFound.tsx @@ -1,7 +1,9 @@ import { useLocation } from "react-router-dom"; import { useEffect } from "react"; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const NotFound = () => { + useDocumentTitle('404 - Page Not Found'); const location = useLocation(); useEffect(() => { diff --git a/src/pages/OperatorDetail.tsx b/src/pages/OperatorDetail.tsx index 138b3fc7..9ad211dd 100644 --- a/src/pages/OperatorDetail.tsx +++ b/src/pages/OperatorDetail.tsx @@ -25,6 +25,7 @@ import { submitCompanyUpdate } from '@/lib/companyHelpers'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function OperatorDetail() { const { slug } = useParams<{ slug: string }>(); @@ -41,6 +42,9 @@ export default function OperatorDetail() { const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); + + // Update document title when operator changes + useDocumentTitle(operator?.name || 'Operator Details'); useEffect(() => { if (slug) { diff --git a/src/pages/OperatorParks.tsx b/src/pages/OperatorParks.tsx index c693f4b1..6b76f911 100644 --- a/src/pages/OperatorParks.tsx +++ b/src/pages/OperatorParks.tsx @@ -15,6 +15,7 @@ import { ParkFilters } from '@/components/parks/ParkFilters'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Grid3X3, List } from 'lucide-react'; import { FilterState, SortState } from './Parks'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const initialFilters: FilterState = { search: '', @@ -44,6 +45,9 @@ export default function OperatorParks() { const [sort, setSort] = useState(initialSort); const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); const [showFilters, setShowFilters] = useState(false); + + // Update document title when operator changes + useDocumentTitle(operator ? `${operator.name} - Parks` : 'Operator Parks'); useEffect(() => { if (operatorSlug) { diff --git a/src/pages/Operators.tsx b/src/pages/Operators.tsx index b930cdeb..e6972deb 100644 --- a/src/pages/Operators.tsx +++ b/src/pages/Operators.tsx @@ -24,8 +24,10 @@ import { toast } from '@/hooks/use-toast'; import { submitCompanyCreation } from '@/lib/companyHelpers'; import { useAuthModal } from '@/hooks/useAuthModal'; import { getErrorMessage } from '@/lib/errorHandler'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const Operators = () => { + useDocumentTitle('Operators'); const navigate = useNavigate(); const { user } = useAuth(); const { isModerator } = useUserRole(); diff --git a/src/pages/OwnerParks.tsx b/src/pages/OwnerParks.tsx index 2b981465..3dc1f237 100644 --- a/src/pages/OwnerParks.tsx +++ b/src/pages/OwnerParks.tsx @@ -15,6 +15,7 @@ import { ParkFilters } from '@/components/parks/ParkFilters'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Grid3X3, List } from 'lucide-react'; import { FilterState, SortState } from './Parks'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const initialFilters: FilterState = { search: '', @@ -44,6 +45,9 @@ export default function OwnerParks() { const [sort, setSort] = useState(initialSort); const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); const [showFilters, setShowFilters] = useState(false); + + // Update document title when owner changes + useDocumentTitle(owner ? `${owner.name} - Parks` : 'Owner Parks'); useEffect(() => { if (ownerSlug) { diff --git a/src/pages/ParkDetail.tsx b/src/pages/ParkDetail.tsx index 2d88af1e..c0ee50b9 100644 --- a/src/pages/ParkDetail.tsx +++ b/src/pages/ParkDetail.tsx @@ -29,6 +29,7 @@ import { Edit } from 'lucide-react'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function ParkDetail() { const { @@ -47,6 +48,10 @@ export default function ParkDetail() { const [photoCount, setPhotoCount] = useState(0); const [statsLoading, setStatsLoading] = useState(true); const { isModerator } = useUserRole(); + + // Update document title when park changes + useDocumentTitle(park?.name || 'Park Details'); + const fetchPhotoCount = useCallback(async (parkId: string) => { try { const { count, error } = await supabase diff --git a/src/pages/ParkOwners.tsx b/src/pages/ParkOwners.tsx index 49848caf..4e4e3048 100644 --- a/src/pages/ParkOwners.tsx +++ b/src/pages/ParkOwners.tsx @@ -18,8 +18,10 @@ import { toast } from '@/hooks/use-toast'; import { submitCompanyCreation } from '@/lib/companyHelpers'; import { useAuthModal } from '@/hooks/useAuthModal'; import { getErrorMessage } from '@/lib/errorHandler'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; const ParkOwners = () => { + useDocumentTitle('Property Owners'); const navigate = useNavigate(); const { user } = useAuth(); const { isModerator } = useUserRole(); diff --git a/src/pages/ParkRides.tsx b/src/pages/ParkRides.tsx index 14e1258c..6bd725b4 100644 --- a/src/pages/ParkRides.tsx +++ b/src/pages/ParkRides.tsx @@ -16,6 +16,7 @@ import { useAuth } from '@/hooks/useAuth'; import { toast } from '@/hooks/use-toast'; import { getErrorMessage } from '@/lib/errorHandler'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function ParkRides() { const { parkSlug } = useParams<{ parkSlug: string }>(); @@ -28,6 +29,9 @@ export default function ParkRides() { const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); const [filterCategory, setFilterCategory] = useState('all'); + + // Update document title when park changes + useDocumentTitle(park ? `${park.name} - Rides` : 'Park Rides'); const [filterStatus, setFilterStatus] = useState('all'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); diff --git a/src/pages/Privacy.tsx b/src/pages/Privacy.tsx index a5da07ec..f462cd04 100644 --- a/src/pages/Privacy.tsx +++ b/src/pages/Privacy.tsx @@ -1,6 +1,8 @@ import { Header } from '@/components/layout/Header'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Privacy() { + useDocumentTitle('Privacy Policy'); return (
diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index fa9fae3c..06c497bf 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -30,6 +30,7 @@ import { LocationDisplay } from '@/components/profile/LocationDisplay'; import { UserBlockButton } from '@/components/profile/UserBlockButton'; import { PersonalLocationDisplay } from '@/components/profile/PersonalLocationDisplay'; import { useUserRole } from '@/hooks/useUserRole'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; // Activity type definitions interface SubmissionActivity { @@ -155,6 +156,9 @@ export default function Profile() { // User role checking const { isModerator, loading: rolesLoading } = useUserRole(); + + // Update document title when profile changes + useDocumentTitle(profile?.username ? `${profile.username}'s Profile` : 'Profile'); // Username validation const usernameValidation = useUsernameValidation(editForm.username, profile?.username); diff --git a/src/pages/PropertyOwnerDetail.tsx b/src/pages/PropertyOwnerDetail.tsx index 201e6a69..b12a891e 100644 --- a/src/pages/PropertyOwnerDetail.tsx +++ b/src/pages/PropertyOwnerDetail.tsx @@ -25,6 +25,7 @@ import { submitCompanyUpdate } from '@/lib/companyHelpers'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function PropertyOwnerDetail() { const { slug } = useParams<{ slug: string }>(); @@ -41,6 +42,9 @@ export default function PropertyOwnerDetail() { const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); + + // Update document title when owner changes + useDocumentTitle(owner?.name || 'Property Owner Details'); useEffect(() => { if (slug) { diff --git a/src/pages/RideDetail.tsx b/src/pages/RideDetail.tsx index fbf14924..35bf99be 100644 --- a/src/pages/RideDetail.tsx +++ b/src/pages/RideDetail.tsx @@ -52,6 +52,7 @@ import { getErrorMessage } from '@/lib/errorHandler'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; // Extended Ride type with additional properties for easier access interface RideWithParkId extends Ride { @@ -70,6 +71,9 @@ export default function RideDetail() { const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [photoCount, setPhotoCount] = useState(0); const [statsLoading, setStatsLoading] = useState(true); + + // Update document title when ride changes + useDocumentTitle(ride?.name || 'Ride Details'); useEffect(() => { if (parkSlug && rideSlug) { diff --git a/src/pages/RideModelDetail.tsx b/src/pages/RideModelDetail.tsx index 8de434d0..a9ea51dd 100644 --- a/src/pages/RideModelDetail.tsx +++ b/src/pages/RideModelDetail.tsx @@ -22,6 +22,7 @@ import { ManufacturerPhotoGallery } from '@/components/companies/ManufacturerPho const RideModelForm = lazy(() => import('@/components/admin/RideModelForm').then(m => ({ default: m.RideModelForm }))); import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityVersionHistory } from '@/components/versioning/EntityVersionHistory'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function RideModelDetail() { const { manufacturerSlug, modelSlug } = useParams<{ manufacturerSlug: string; modelSlug: string }>(); @@ -33,6 +34,9 @@ export default function RideModelDetail() { const [rides, setRides] = useState([]); const [loading, setLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); + + // Update document title when model changes + useDocumentTitle(model?.name || 'Ride Model Details'); const [statistics, setStatistics] = useState({ rideCount: 0, photoCount: 0 }); // Fetch technical specifications from relational table diff --git a/src/pages/RideModelRides.tsx b/src/pages/RideModelRides.tsx index 60425b81..eea2c954 100644 --- a/src/pages/RideModelRides.tsx +++ b/src/pages/RideModelRides.tsx @@ -16,6 +16,7 @@ import { useAuthModal } from '@/hooks/useAuthModal'; import { toast } from '@/hooks/use-toast'; import { getErrorMessage } from '@/lib/errorHandler'; import type { Ride, Company, RideModel } from "@/types/database"; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function RideModelRides() { const { manufacturerSlug, modelSlug } = useParams<{ manufacturerSlug: string; modelSlug: string }>(); @@ -28,6 +29,9 @@ export default function RideModelRides() { const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); + + // Update document title when model changes + useDocumentTitle(model ? `${model.name} - Rides` : 'Model Rides'); const [filterCategory, setFilterCategory] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); diff --git a/src/pages/Rides.tsx b/src/pages/Rides.tsx index 086f42a2..ac5b400e 100644 --- a/src/pages/Rides.tsx +++ b/src/pages/Rides.tsx @@ -22,8 +22,10 @@ import { useUserRole } from '@/hooks/useUserRole'; import { toast } from '@/hooks/use-toast'; import { getErrorMessage } from '@/lib/errorHandler'; import { useAuthModal } from '@/hooks/useAuthModal'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Rides() { + useDocumentTitle('Rides & Attractions'); const navigate = useNavigate(); const { user } = useAuth(); const { isModerator } = useUserRole(); diff --git a/src/pages/SubmissionGuidelines.tsx b/src/pages/SubmissionGuidelines.tsx index f23bcfd6..795ee77c 100644 --- a/src/pages/SubmissionGuidelines.tsx +++ b/src/pages/SubmissionGuidelines.tsx @@ -2,8 +2,10 @@ import { Header } from '@/components/layout/Header'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { CheckCircle, AlertTriangle, Camera, Star, MapPin, Settings, Building2, Globe } from 'lucide-react'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function SubmissionGuidelines() { + useDocumentTitle('Submission Guidelines'); return (
diff --git a/src/pages/Terms.tsx b/src/pages/Terms.tsx index dbdd902e..7502daad 100644 --- a/src/pages/Terms.tsx +++ b/src/pages/Terms.tsx @@ -1,6 +1,8 @@ import { Header } from '@/components/layout/Header'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Terms() { + useDocumentTitle('Terms of Service'); return (
diff --git a/src/pages/admin/AdminContact.tsx b/src/pages/admin/AdminContact.tsx index 2982b197..82f26598 100644 --- a/src/pages/admin/AdminContact.tsx +++ b/src/pages/admin/AdminContact.tsx @@ -131,6 +131,7 @@ interface EmailThread { } export default function AdminContact() { + useDocumentTitle('Contact Submissions - Admin'); const queryClient = useQueryClient(); const { theme } = useTheme(); const { isAdmin, loading: rolesLoading } = useUserRole(); diff --git a/src/pages/admin/AdminEmailSettings.tsx b/src/pages/admin/AdminEmailSettings.tsx index 5d84c317..f67531cb 100644 --- a/src/pages/admin/AdminEmailSettings.tsx +++ b/src/pages/admin/AdminEmailSettings.tsx @@ -16,8 +16,10 @@ import { AdminLayout } from '@/components/layout/AdminLayout'; import { useUserRole } from '@/hooks/useUserRole'; import { handleError, handleSuccess } from '@/lib/errorHandler'; import { Alert, AlertDescription } from '@/components/ui/alert'; +import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function AdminEmailSettings() { + useDocumentTitle('Email Settings - Admin'); const queryClient = useQueryClient(); const { isSuperuser, loading: rolesLoading } = useUserRole(); const [signature, setSignature] = useState('');