'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; import { ThemeToggle } from '@/components/theme-toggle'; import { Menu, User } from 'lucide-react'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; import SidebarContent from '@/components/ui/SidebarContent'; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useToast } from '@/components/ui/use-toast'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; const Navbar = () => { const [isLoggedIn, setIsLoggedIn] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [loginData, setLoginData] = useState({ nim: '', password: '' }); const [registerData, setRegisterData] = useState({ username: '', nim: '', password: '', confirmPassword: '' }); const [userData, setUserData] = useState(null); const { toast } = useToast(); const router = useRouter(); // Check login status on component mount and when route changes useEffect(() => { const checkAuth = async () => { try { const response = await fetch('/api/auth/check'); const data = await response.json(); if (response.ok && data.user) { setUserData(data.user); setIsLoggedIn(true); } else { setUserData(null); setIsLoggedIn(false); } } catch (error) { console.error('Auth check failed:', error); setUserData(null); setIsLoggedIn(false); } }; checkAuth(); }, [router]); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); // Validate input if (!loginData.nim || !loginData.password) { toast({ variant: "destructive", title: "Login gagal", description: "NIM dan password harus diisi", }); return; } console.log('Login attempt with data:', { nim: loginData.nim, password: '***' }); try { const response = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ nim: loginData.nim.trim(), password: loginData.password }), }); console.log('Login response status:', response.status); const data = await response.json(); console.log('Login response data:', data); if (!response.ok) { throw new Error(data.error || 'Login gagal'); } toast({ title: "Login berhasil", description: "Selamat datang kembali!", }); setUserData(data.user); setIsLoggedIn(true); setDialogOpen(false); router.refresh(); } catch (error) { console.error('Login error:', error); toast({ variant: "destructive", title: "Login gagal", description: error instanceof Error ? error.message : 'Terjadi kesalahan saat login', }); } }; const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); // Validate passwords match if (registerData.password !== registerData.confirmPassword) { toast({ variant: "destructive", title: "Registrasi gagal", description: "Password dan konfirmasi password tidak cocok", }); return; } try { const response = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username: registerData.username, nim: registerData.nim, password: registerData.password, }), }); const data = await response.json(); if (!response.ok) { throw new Error(data.error || 'Registrasi gagal'); } toast({ title: "Registrasi berhasil", description: "Silakan login dengan akun Anda", }); // Reset form and switch to login tab setRegisterData({ username: '', nim: '', password: '', confirmPassword: '' }); const tabsList = document.querySelector('[role="tablist"]'); if (tabsList) { const loginTab = tabsList.querySelector('[value="login"]'); if (loginTab) { (loginTab as HTMLElement).click(); } } } catch (error) { toast({ variant: "destructive", title: "Registrasi gagal", description: error instanceof Error ? error.message : 'Terjadi kesalahan saat registrasi', }); } }; const handleLogout = async () => { try { const response = await fetch('/api/auth/logout', { method: 'POST', }); if (!response.ok) { throw new Error('Logout gagal'); } toast({ title: "Logout berhasil", description: "Sampai jumpa lagi!", }); setUserData(null); setIsLoggedIn(false); router.push('/'); router.refresh(); } catch (error) { toast({ variant: "destructive", title: "Logout gagal", description: error instanceof Error ? error.message : 'Terjadi kesalahan saat logout', }); } }; const handleProfileClick = async () => { try { const response = await fetch('/api/auth/check'); const data = await response.json(); if (response.ok && data.user) { router.push('/mahasiswa/profile'); } else { toast({ variant: "destructive", title: "Akses Ditolak", description: "Silakan login terlebih dahulu untuk mengakses profil", }); setDialogOpen(true); router.push('/'); // Redirect to home if not logged in } } catch (error) { console.error('Error checking auth status:', error); toast({ variant: "destructive", title: "Error", description: "Terjadi kesalahan saat memeriksa status login", }); router.push('/'); } }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; if (name.startsWith('login')) { const loginField = name.replace('login', '').toLowerCase(); setLoginData(prev => ({ ...prev, [loginField]: value })); } else { setRegisterData(prev => ({ ...prev, [name]: value })); } }; return (
{/* Mobile Menu Button */}
Menu Navigasi
PODIF Logo PODIF
{isLoggedIn ? ( My Account Profile Logout ) : ( Portal Data Informatika Masuk atau daftar untuk mengakses portal Login Register
)}
); }; export default Navbar;