import { useState, useEffect, useRef } from "react" import { useNavigate } from "react-router-dom" import { useTranslation } from "../hooks/useTranslation" import { Button } from "./ui/button" import { SettingsMenu } from "./SettingsMenu" import { FlaskConical, LogOut, User, Moon, Sun, Globe, Command, Menu, RefreshCcw } from "lucide-react" import { useTheme } from "./ThemeProvider" import { logoutUser, getUserProfile } from "../api/users" import { WorkspaceSelector } from "./WorkspaceSelector" import { toast } from "sonner" import { NotificationBell } from "./notifications/NotificationBell" import { clearSessionTokens, getAccessToken, getRefreshToken, setDemoSessionMeta, setSessionTokens } from "../lib/session" import { startDemo } from "../api/demo" type NavbarProps = { onOpenSidebar?: () => void } export function Navbar({ onOpenSidebar }: NavbarProps) { const { t, lang, setLanguage } = useTranslation() const { theme, setTheme } = useTheme() const navigate = useNavigate() const [showLogoutModal, setShowLogoutModal] = useState(false) const [isDropdownOpen, setIsDropdownOpen] = useState(false) const [isResettingDemo, setIsResettingDemo] = useState(false) const [user, setUser] = useState(null) const dropdownRef = useRef(null) const isFa = lang === "fa" const isDarkMode = theme === "dark" || (theme === "system" && document.documentElement.classList.contains("dark")) const isDemoUser = Boolean(user?.is_demo) const demoExpiryLabel = user?.demo_expires_at ? new Intl.DateTimeFormat(isFa ? "fa-IR" : "en-US", { dateStyle: "medium", timeStyle: "short", }).format(new Date(user.demo_expires_at)) : null useEffect(() => { const handleProfileUpdated = ((e: CustomEvent) => { if (e.detail) { setUser((prev: any) => (prev ? { ...prev, ...e.detail } : e.detail)) } }) as EventListener window.addEventListener("profile_updated", handleProfileUpdated) return () => window.removeEventListener("profile_updated", handleProfileUpdated) }, []) useEffect(() => { const fetchUser = async () => { const token = getAccessToken() if (!token) return try { const userData = await getUserProfile() setUser(userData) } catch (error) { console.error("Failed to fetch user profile:", error) } } void fetchUser() }, []) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsDropdownOpen(false) } } document.addEventListener("mousedown", handleClickOutside) return () => document.removeEventListener("mousedown", handleClickOutside) }, []) const handleLogout = async () => { try { const refreshToken = getRefreshToken() if (refreshToken) { await logoutUser(refreshToken) } } catch (error) { console.error("Logout API failed:", error) } finally { clearSessionTokens() setUser(null) setShowLogoutModal(false) toast.success(t.logoutToast || "Successfully logged out!") navigate("/auth") } } const handleResetDemo = async () => { if (isResettingDemo) return setIsResettingDemo(true) try { const demo = await startDemo() setSessionTokens(demo.access, demo.refresh) setDemoSessionMeta(demo.expires_at) toast.success(t.demo?.reset || "Fresh demo environment is ready.") window.location.href = "/timesheet" } catch (error) { console.error("Demo reset failed:", error) toast.error(t.demo?.startError || "Could not start the demo environment.") } finally { setIsResettingDemo(false) } } const toggleTheme = () => { setTheme(isDarkMode ? "light" : "dark") } const toggleLanguage = () => { const newLang = isFa ? "en" : "fa" if (setLanguage) { setLanguage(newLang) } else { localStorage.setItem("language", newLang) window.location.reload() } } return ( <>
navigate("/")} > Qlockify.ir
{/* Mobile navbar: theme toggle + notification bell */}
{user && }
{/* Desktop navbar: keep the old controls here */}
{user && } {isDemoUser && (
{t.demo?.badge || "Demo environment"}
)} {user ? ( <>
{isDropdownOpen && (

{user.first_name || user.last_name ? `${user.first_name || ""} ${user.last_name || ""}`.trim() : user.email}

{isDemoUser && demoExpiryLabel && (

{(t.demo?.expiresAt || "Expires at")}: {demoExpiryLabel}

)}
{isDemoUser && ( )}
)}
) : ( <> )}
{showLogoutModal && (
setShowLogoutModal(false)} >
e.stopPropagation()} >

{t.confirmLogoutTitle || "Confirm Logout"}

{t.confirmLogoutMessage || "Are you sure you want to log out of your account?"}

)} ) }