import { BookOpen, CircleHalfSolid, EllipsisHorizontal, Keyboard, OpenRectArrowOut, TimelineVertical, User as UserIcon, XMark, } from "@medusajs/icons" import { Avatar, DropdownMenu, Heading, IconButton, Input, Kbd, Text, clx, } from "@medusajs/ui" import { Dialog as RadixDialog } from "radix-ui" import { useTranslation } from "react-i18next" import { Skeleton } from "../../common/skeleton" import { useState } from "react" import { Link, useLocation, useNavigate } from "react-router-dom" import { useLogout, useMe } from "../../../hooks/api" import { queryClient } from "../../../lib/query-client" import { useGlobalShortcuts } from "../../../providers/keybind-provider/hooks" import { useTheme } from "../../../providers/theme-provider" import { useDocumentDirection } from "../../../hooks/use-document-direction" export const UserMenu = () => { const { t } = useTranslation() const location = useLocation() const direction = useDocumentDirection() const [openMenu, setOpenMenu] = useState(false) const [openModal, setOpenModal] = useState(false) const toggleModal = () => { setOpenMenu(false) setOpenModal(!openModal) } return (
{t("app.menus.user.profileSettings")} {t("app.menus.user.documentation")} {t("app.menus.user.changelog")} {t("app.menus.user.shortcuts")}
) } const UserBadge = () => { const { user, isPending, isError, error } = useMe() const name = [user?.first_name, user?.last_name].filter(Boolean).join(" ") const displayName = name || user?.email const fallback = displayName ? displayName[0].toUpperCase() : null if (isPending) { return ( ) } if (isError) { throw error } return (
{fallback ? ( ) : ( )}
{displayName ? ( {displayName} ) : ( )}
) } const ThemeToggle = () => { const { t } = useTranslation() const { theme, setTheme } = useTheme() return ( {t("app.menus.user.theme.label")} { e.preventDefault() setTheme("system") }} > {t("app.menus.user.theme.system")} { e.preventDefault() setTheme("light") }} > {t("app.menus.user.theme.light")} { e.preventDefault() setTheme("dark") }} > {t("app.menus.user.theme.dark")} ) } const Logout = () => { const { t } = useTranslation() const navigate = useNavigate() const { mutateAsync: logoutMutation } = useLogout() const handleLogout = async () => { await logoutMutation(undefined, { onSuccess: () => { /** * When the user logs out, we want to clear the query cache */ queryClient.clear() navigate("/login") }, }) } return (
{t("app.menus.actions.logout")}
) } const GlobalKeybindsModal = (props: { open: boolean onOpenChange: (open: boolean) => void }) => { const { t } = useTranslation() const globalShortcuts = useGlobalShortcuts() const [searchValue, onSearchValueChange] = useState("") const searchResults = searchValue ? globalShortcuts.filter((shortcut) => { return shortcut.label.toLowerCase().includes(searchValue?.toLowerCase()) }) : globalShortcuts return (
{t("app.menus.user.shortcuts")}
esc
onSearchValueChange(e.target.value)} />
{searchResults.map((shortcut, index) => { return (
{shortcut.label}
{shortcut.keys.Mac?.map((key, index) => { return (
{key} {index < (shortcut.keys.Mac?.length || 0) - 1 && ( {t("app.keyboardShortcuts.then")} )}
) })}
) })}
) } const UserItem = () => { const { user, isPending, isError, error } = useMe() const loaded = !isPending && !!user if (!loaded) { return
} const name = [user.first_name, user.last_name].filter(Boolean).join(" ") const email = user.email const fallback = name ? name[0].toUpperCase() : email[0].toUpperCase() const avatar = user.avatar_url if (isError) { throw error } return (
{name || email} {!!name && ( {email} )}
) }