Spaces:
Sleeping
Sleeping
| "use client"; | |
| import { useEffect, useState } from "react"; | |
| import { auth } from "@/lib/firebase"; | |
| import { onAuthStateChanged } from "firebase/auth"; | |
| import { useRouter, usePathname } from "next/navigation"; | |
| import { motion, AnimatePresence } from "framer-motion"; | |
| export default function AuthGuard({ children }: { children: React.ReactNode }) { | |
| const [loading, setLoading] = useState(true); | |
| const [user, setUser] = useState<any>(null); | |
| const router = useRouter(); | |
| const pathname = usePathname(); | |
| useEffect(() => { | |
| const unsubscribe = onAuthStateChanged(auth, (user) => { | |
| setUser(user); | |
| setLoading(false); | |
| if (!user && pathname !== "/login") { | |
| router.push("/login"); | |
| } | |
| }); | |
| return () => unsubscribe(); | |
| }, [pathname, router]); | |
| if (loading) { | |
| return ( | |
| <div className="fixed inset-0 bg-[#0f172a] flex items-center justify-center z-[200]"> | |
| <motion.div | |
| animate={{ rotate: 360 }} | |
| transition={{ duration: 1, repeat: Infinity, ease: "linear" }} | |
| className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full shadow-lg shadow-blue-500/20" | |
| /> | |
| </div> | |
| ); | |
| } | |
| // If not logged in and not on login page, don't show children (redirecting) | |
| if (!user && pathname !== "/login") { | |
| return null; | |
| } | |
| return <>{children}</>; | |
| } | |