"use client"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { usePathname } from "next/navigation"; import { useEffect, useState } from "react"; import { Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; import { DEMO_AUTH_EMAIL_COOKIE, DEMO_AUTH_ROLE_COOKIE } from "@/lib/auth/demoAuth"; import { supabaseBrowser } from "@/lib/supabase/browser"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; type NavLink = { href: string; label: string; }; const navLinks: NavLink[] = [ { href: "/courses", label: "Formación Académica" }, { href: "/case-studies", label: "Casos prácticos" }, { href: "/practice", label: "Retos" }, { href: "/eventos", label: "Eventos" }, { href: "/noticias", label: "Noticias" }, { href: "/comunidad", label: "Comunidad" }, { href: "/sobre-acve", label: "Sobre ACVE" }, ]; export default function Navbar() { const pathname = usePathname(); const router = useRouter(); const [userEmail, setUserEmail] = useState(null); const [isTeacher, setIsTeacher] = useState(false); const [mounted, setMounted] = useState(false); const { resolvedTheme, setTheme } = useTheme(); useEffect(() => { const client = supabaseBrowser(); if (!client) { const cookieMap = new Map( document.cookie .split(";") .map((entry) => entry.trim()) .filter(Boolean) .map((entry) => { const [key, ...rest] = entry.split("="); return [key, decodeURIComponent(rest.join("="))] as const; }), ); const email = cookieMap.get(DEMO_AUTH_EMAIL_COOKIE) ?? null; const role = cookieMap.get(DEMO_AUTH_ROLE_COOKIE) ?? ""; setUserEmail(email); setIsTeacher(role === "teacher"); return; } let mounted = true; const fetchSession = async () => { const { data: { user }, } = await client.auth.getUser(); if (!mounted) return; const email = user?.email ?? null; setUserEmail(email); if (!user) { setIsTeacher(false); return; } try { const res = await fetch("/api/auth/session"); if (!mounted) return; const data = await res.json(); setIsTeacher(data.isTeacher === true); } catch { if (!mounted) return; setIsTeacher(false); } }; fetchSession(); const { data: { subscription }, } = client.auth.onAuthStateChange(() => { fetchSession(); }); return () => { mounted = false; subscription.unsubscribe(); }; }, []); useEffect(() => { setMounted(true); }, []); const handleLogout = async () => { const loginSwitchUrl = "/auth/login?switchUser=1&redirectTo=/courses"; document.cookie = `${DEMO_AUTH_EMAIL_COOKIE}=; path=/; max-age=0`; document.cookie = `${DEMO_AUTH_ROLE_COOKIE}=; path=/; max-age=0`; const client = supabaseBrowser(); if (!client) { setUserEmail(null); setIsTeacher(false); router.replace(loginSwitchUrl); router.refresh(); return; } await client.auth.signOut(); setUserEmail(null); setIsTeacher(false); router.replace(loginSwitchUrl); router.refresh(); }; const isDark = resolvedTheme === "dark"; const loginHref = userEmail ? "/profile" : "/auth/login"; const loginLabel = userEmail ? "Mi cuenta" : "Ingresa"; const isNavActive = (href: string) => { return pathname === href || pathname?.startsWith(`${href}/`); }; return (
Únete {loginLabel} Contáctanos
{userEmail ? ( <> {userEmail} ) : ( )}
ACVE logo
ACVE Centro de Estudios
Empowering Lawyer one word at a time
{isTeacher ? ( ) : null}
); }