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 (
{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}
)}
)
}