"use client"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { usePathname } from "next/navigation"; import { useEffect, useMemo, useState } from "react"; import { ASSISTANT_TOGGLE_EVENT } from "@/components/AssistantDrawer"; import { DEMO_AUTH_EMAIL_COOKIE, DEMO_AUTH_ROLE_COOKIE } from "@/lib/auth/demoAuth"; import { isTeacherEmailAllowed, readTeacherEmailsBrowser } from "@/lib/auth/teacherAllowlist"; 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: "/", label: "Home" }, { href: "/courses", label: "Courses" }, { href: "/case-studies", label: "Case Studies" }, { href: "/practice", label: "Practice" }, ]; export default function Navbar() { const pathname = usePathname(); const router = useRouter(); const [userEmail, setUserEmail] = useState(null); const [isTeacher, setIsTeacher] = useState(false); const teacherEmails = useMemo(() => readTeacherEmailsBrowser(), []); 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" || isTeacherEmailAllowed(email, teacherEmails)); return; } let mounted = true; client.auth.getUser().then(({ data }) => { if (!mounted) return; const email = data.user?.email ?? null; setUserEmail(email); setIsTeacher(isTeacherEmailAllowed(email, teacherEmails)); }); const { data } = client.auth.onAuthStateChange((_event, session) => { const email = session?.user?.email ?? null; setUserEmail(email); setIsTeacher(isTeacherEmailAllowed(email, teacherEmails)); }); return () => { mounted = false; data.subscription.unsubscribe(); }; }, [teacherEmails]); const links = useMemo(() => { if (!isTeacher) return navLinks; return [...navLinks, { href: "/teacher", label: "Teacher Dashboard" }]; }, [isTeacher]); const authNode = useMemo(() => { if (!userEmail) { return (
); } return (
{userEmail} {!isTeacher ? ( Teacher area (Teacher only) ) : null}
); }, [isTeacher, router, userEmail]); return (
ACVE logo
ACVE
Centro de Estudios
{authNode}
); }