import { Popover } from '@headlessui/react' import { ActionButton } from './ActionButton' import { faBars, faGear, faSignOutAlt } from '@fortawesome/free-solid-svg-icons' import { faGithub } from '@fortawesome/free-brands-svg-icons' import { useNavigate } from 'react-router-dom' import { useState } from 'react' import { paths } from '../Router' import makeUrlPathRelative from '../lib/makeUrlPathRelative' import { useAuthMachine } from '../hooks/useAuthMachine' import { Models } from '@kittycad/lib' type User = Models['User_type'] const UserSidebarMenu = ({ user }: { user?: User }) => { const displayedName = getDisplayName(user) const [imageLoadFailed, setImageLoadFailed] = useState(false) const navigate = useNavigate() const [_, send] = useAuthMachine() // Fallback logic for displaying user's "name": // 1. user.name // 2. user.first_name + ' ' + user.last_name // 3. user.first_name // 4. user.email function getDisplayName(user?: User) { if (!user) return null if (user.name) return user.name if (user.first_name) { if (user.last_name) return user.first_name + ' ' + user.last_name return user.first_name } return user.email } return ( {user?.image && !imageLoadFailed ? (
{user?.name setImageLoadFailed(true)} />
) : ( Menu )} {({ close }) => ( <> {user && (
{user.image && !imageLoadFailed && (
{user.name setImageLoadFailed(true)} />
)}

{displayedName || ''}

{displayedName !== user.email && (

{user.email}

)}
)}
{ // since /settings is a nested route the sidebar doesn't close // automatically when navigating to it close() navigate(makeUrlPathRelative(paths.SETTINGS)) }} > Settings Request a feature send('logout')} icon={{ icon: faSignOutAlt, bgClassName: 'bg-destroy-80', iconClassName: 'text-destroy-20 group-hover:text-destroy-10 hover:text-destroy-10', }} className="border-transparent dark:border-transparent hover:border-destroy-40 dark:hover:border-destroy-60" > Sign out
)}
) } export default UserSidebarMenu