import { ArchiveIcon, LogOutIcon, User2Icon, SquareUserIcon, SettingsIcon, BellIcon } from "lucide-react"; import { authServiceClient } from "@/grpcweb"; import useCurrentUser from "@/hooks/useCurrentUser"; import useNavigateTo from "@/hooks/useNavigateTo"; import { cn } from "@/lib/utils"; import { Routes } from "@/router"; import { useTranslate } from "@/utils/i18n"; import UserAvatar from "./UserAvatar"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"; interface Props { collapsed?: boolean; } const UserMenu = (props: Props) => { const { collapsed } = props; const t = useTranslate(); const navigateTo = useNavigateTo(); const currentUser = useCurrentUser(); const handleSignOut = async () => { await authServiceClient.deleteSession({}); // Clear user-specific localStorage items (e.g., drafts) // Preserve app-wide settings like theme const keysToPreserve = ["memos-theme", "tag-view-as-tree", "tag-tree-auto-expand", "viewStore"]; const keysToRemove: string[] = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key && !keysToPreserve.includes(key)) { keysToRemove.push(key); } } keysToRemove.forEach((key) => localStorage.removeItem(key)); window.location.href = Routes.AUTH; }; return (
{currentUser.avatarUrl ? ( ) : ( )} {!collapsed && ( {currentUser.displayName || currentUser.username} )}
navigateTo(`/u/${encodeURIComponent(currentUser.username)}`)}> {t("common.profile")} navigateTo(Routes.ARCHIVED)}> {t("common.archived")} navigateTo(Routes.INBOX)}> {t("common.inbox")} navigateTo(Routes.SETTING)}> {t("common.settings")} {t("common.sign-out")}
); }; export default UserMenu;