diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 7498d90..dab3a24 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -19,10 +19,13 @@ 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 [user, setUser] = useState(null) + const dropdownRef = useRef(null) + const isFa = lang === "fa" const isDarkMode = theme === "dark" || @@ -61,6 +64,7 @@ export function Navbar({ onOpenSidebar }: NavbarProps) { setIsDropdownOpen(false) } } + document.addEventListener("mousedown", handleClickOutside) return () => document.removeEventListener("mousedown", handleClickOutside) }, []) @@ -88,6 +92,7 @@ export function Navbar({ onOpenSidebar }: NavbarProps) { const toggleLanguage = () => { const newLang = isFa ? "en" : "fa" + if (setLanguage) { setLanguage(newLang) } else { @@ -98,7 +103,7 @@ export function Navbar({ onOpenSidebar }: NavbarProps) { return ( <> -
+
-
navigate("/")}> - - - {t.title || "Qlockify"} - -
+ +
navigate("/")} + > + + + Qlockify.ir + +
-
+ {/* Mobile navbar: theme toggle + notification bell */} +
+ + + {user && } +
+ + {/* Desktop navbar: keep the old controls here */} +
{user && } + {user ? ( <> +
-
+
+ + + +
+ ) + } + + return ( +
+ + + + + +
+ ) + } return ( <> - + {/* Mobile sidebar */}
+
+
+

+ Qlockify.ir +

+ + +
+ +
+ {renderMobileTopSection()} +
+ + + +
+ {renderMobileFooterSection()} +
-
+ + {showLogoutModal && ( +
setShowLogoutModal(false)} + > +
e.stopPropagation()} + > +

+ {t.confirmLogoutTitle || "Confirm Logout"} +

+ +

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

+ +
+ + + +
+
+
+ )} - ); -}; + ) +} \ No newline at end of file diff --git a/src/components/WorkspaceSelector.tsx b/src/components/WorkspaceSelector.tsx index 9a99bb7..7f52618 100644 --- a/src/components/WorkspaceSelector.tsx +++ b/src/components/WorkspaceSelector.tsx @@ -6,7 +6,11 @@ import { useNavigate } from "react-router-dom"; import { fetchWorkspaces, type Workspace } from "../api/workspaces"; import { InfiniteScroll } from "./InfiniteScroll"; -export const WorkspaceSelector: React.FC = () => { +type WorkspaceSelectorProps = { + className?: string +} + +export const WorkspaceSelector: React.FC = ({ className = "" }) => { const { workspaces, activeWorkspace, setActiveWorkspace } = useWorkspace(); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); @@ -40,21 +44,21 @@ export const WorkspaceSelector: React.FC = () => { refreshWorkspacesList(); }) as EventListener; - const handleWorkspaceCreated = ((e: CustomEvent) => { - if (e.detail?.id) { - setActiveWorkspace(e.detail); - } - refreshWorkspacesList(); - }) as EventListener; + const handleWorkspaceCreated = ((e: CustomEvent) => { + if (e.detail?.id) { + setActiveWorkspace(e.detail); + } + refreshWorkspacesList(); + }) as EventListener; const handleWorkspaceEdited = ((e: CustomEvent) => { // آپدیت نام کارتابل در نوبار در صورتی که کارتابل فعال ویرایش شده باشد - if (activeWorkspace?.id === e.detail?.id) { - setActiveWorkspace({ - ...activeWorkspace, - ...e.detail, - } as Workspace); - } + if (activeWorkspace?.id === e.detail?.id) { + setActiveWorkspace({ + ...activeWorkspace, + ...e.detail, + } as Workspace); + } refreshWorkspacesList(); }) as EventListener; @@ -116,23 +120,23 @@ export const WorkspaceSelector: React.FC = () => { }, [offset, hasMore, isLoadingMore]); return ( -
+
{isOpen && ( @@ -162,13 +166,13 @@ export const WorkspaceSelector: React.FC = () => { className="w-full flex items-center justify-between px-3 py-2 text-sm text-slate-700 dark:text-slate-200 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors" >
-
- {ws.thumbnail ? ( - {ws.name} - ) : ( - ws.name.charAt(0).toUpperCase() - )} -
+
+ {ws.thumbnail ? ( + {ws.name} + ) : ( + ws.name.charAt(0).toUpperCase() + )} +
{ws.name}
{activeWorkspace?.id === ws.id && (