"use client"
import { useEffect, type ReactNode } from "react"
import { useRouter, usePathname } from "next/navigation"
import { useAuthStatus, useGetGuestToken } from "@/lib/hooks/useAuth"
interface AuthWrapperProps {
children: ReactNode
requireAuth?: boolean
redirectTo?: string
locale: string
}
/**
* AuthWrapper - Protects routes and manages authentication state
*
* Usage:
* - Wrap protected pages: {content}
* - Wrap public pages: {content}
*/
export default function AuthWrapper({
children,
requireAuth = false,
redirectTo,
locale,
}: AuthWrapperProps) {
const router = useRouter()
const pathname = usePathname()
const { isAuthenticated, isLoading, user } = useAuthStatus()
const { mutate: getGuestToken, isPending: isGettingGuestToken } = useGetGuestToken()
useEffect(() => {
// Wait for auth check to complete
if (isLoading || isGettingGuestToken) return
// If auth required and user not authenticated
if (requireAuth && !isAuthenticated) {
const redirect = redirectTo || `/${locale}/login`
const returnUrl = pathname !== redirect ? `?returnUrl=${encodeURIComponent(pathname)}` : ""
router.push(`${redirect}${returnUrl}`)
return
}
// If already authenticated and trying to access login/register
if (isAuthenticated && (pathname.includes("/login") || pathname.includes("/register"))) {
router.push(`/${locale}`)
return
}
// Ensure guest token exists for non-authenticated users
if (!isAuthenticated && !requireAuth) {
const hasGuestToken = document.cookie
.split("; ")
.some((row) => row.startsWith("guestToken="))
if (!hasGuestToken) {
getGuestToken()
}
}
}, [isAuthenticated, isLoading, requireAuth, pathname, router, locale, redirectTo, getGuestToken, isGettingGuestToken])
// Show loading state
if (isLoading || (requireAuth && !isAuthenticated)) {
return (
)
}
return <>{children}>
}