diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index fa38b21..2a8d583 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,16 +1,51 @@ -import { useState } from "react" +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 { LogOut } from "lucide-react" -import { logoutUser } from "../api/users" +import { LogOut, User, Moon, Sun, Globe } from "lucide-react" +import { logoutUser, getUserProfile } from "../api/users" import { toast } from "sonner" export function Navbar() { - const { t } = useTranslation() + const { t, lang, setLang } = useTranslation() const navigate = useNavigate() const [showLogoutModal, setShowLogoutModal] = useState(false) + const [isDropdownOpen, setIsDropdownOpen] = useState(false) + const [user, setUser] = useState(null) + const dropdownRef = useRef(null) + + const [isDarkMode, setIsDarkMode] = useState(() => + document.documentElement.classList.contains('dark') + ) + + const isFa = lang === 'fa' + + useEffect(() => { + const fetchUser = async () => { + const token = localStorage.getItem("accessToken") + if (!token) return + + try { + const userData = await getUserProfile() + setUser(userData) + } catch (error) { + console.error("Failed to fetch user profile:", error) + } + } + + 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 { @@ -23,33 +58,113 @@ export function Navbar() { } finally { localStorage.removeItem("accessToken") localStorage.removeItem("refreshToken") + setUser(null) setShowLogoutModal(false) toast.success(t.logoutToast || "Successfully logged out!") navigate("/login") } } + const toggleTheme = () => { + const isDark = document.documentElement.classList.toggle('dark') + setIsDarkMode(isDark) + localStorage.setItem('theme', isDark ? 'dark' : 'light') + } + + const toggleLanguage = () => { + const newLang = isFa ? 'en' : 'fa' + if (setLang) { + setLang(newLang) + } else { + localStorage.setItem('language', newLang) + window.location.reload() + } + } + return ( <>
-
+
navigate("/")} + >
Q
- Qlockify + + Qlockify +
- - + {user ? ( +
+ + + {isDropdownOpen && ( +
+ + + + + + +
+ + +
+ )} +
+ ) : ( + <> + + + + )}
diff --git a/src/locales/en.ts b/src/locales/en.ts index 8d8bece..1cd1bca 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -100,4 +100,6 @@ export const en = { confirmLogoutTitle: "Confirm Logout", confirmLogoutMessage: "Are you sure you want to log out of your account?", cancel: "Cancel", + lightMode: "Light Mode", + darkMode: "Dark Mode", } diff --git a/src/locales/fa.ts b/src/locales/fa.ts index 0e3a54a..8cabb57 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -101,4 +101,7 @@ export const fa = { confirmLogoutTitle: "تایید خروج", confirmLogoutMessage: "آیا مطمئن هستید که می‌خواهید از حساب خود خارج شوید؟", cancel: "لغو", + lightMode: "حالت روشن", + darkMode: "حالت تاریک", + }