/** * Component: Header Navigation * Documentation: documentation/frontend/components.md */ 'use client'; import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import Link from 'next/link'; import { useAuth } from '@/contexts/AuthContext'; import { Button } from '@/components/ui/Button'; import { VersionBadge } from '@/components/ui/VersionBadge'; import { ChangePasswordModal } from '@/components/ui/ChangePasswordModal'; import { useSmartDropdownPosition } from '@/hooks/useSmartDropdownPosition'; export function Header() { const { user, logout } = useAuth(); const [showUserMenu, setShowUserMenu] = useState(false); const [showMobileMenu, setShowMobileMenu] = useState(false); const [showBookDate, setShowBookDate] = useState(false); const [showChangePasswordModal, setShowChangePasswordModal] = useState(false); const { containerRef, dropdownRef, positionAbove, style } = useSmartDropdownPosition(showUserMenu); // Check if user can change password (local users only) const canChangePassword = user?.authProvider === 'local'; // Check if BookDate is configured useEffect(() => { async function checkBookDate() { if (!user) { setShowBookDate(false); return; } try { const accessToken = localStorage.getItem('accessToken'); if (!accessToken) { setShowBookDate(false); return; } const response = await fetch('/api/bookdate/config', { headers: { 'Authorization': `Bearer ${accessToken}`, }, }); const data = await response.json(); // Show BookDate to any user with verified and enabled configuration setShowBookDate( data.config && data.config.isVerified && data.config.isEnabled ); } catch (error) { console.error('Failed to check BookDate config:', error); setShowBookDate(false); } } checkBookDate(); }, [user]); const handleLogin = async () => { try { const response = await fetch('/api/auth/plex/login', { method: 'POST' }); const data = await response.json(); if (data.success) { // Open Plex OAuth in popup window.open(data.authUrl, 'plex-auth', 'width=600,height=700'); } } catch (error) { console.error('Login failed:', error); } }; // User menu dropdown (rendered via portal) const userMenuDropdown = showUserMenu && style && (