Spaces:
Running
Running
import { useRef, useState } from "react"; | |
import classNames from "classnames"; | |
import { useClickAway } from "react-use"; | |
import { useUser } from "utils/auth"; | |
import { FormattedMessage } from "react-intl"; | |
export const UserMenu = ({ children }: any) => { | |
const { logout, user } = useUser(); | |
const [open, setOpen] = useState(false); | |
const ref = useRef(null); | |
useClickAway(ref, () => setOpen(false)); | |
return ( | |
<div ref={ref} className="relative"> | |
<div className="cursor-pointer" onClick={() => setOpen(!open)}> | |
{children} | |
</div> | |
<div | |
className={classNames( | |
"absolute bottom-0 right-0 transform translate-y-full max-w-[200px] pt-4 w-[200px] transition-all duration-100", | |
{ | |
"opacity-0 pointer-events-none translate-y-3/4": !open, | |
"translate-y-full": open, | |
} | |
)} | |
> | |
<div className="bg-dark-500 rounded-lg w-full shadow-lg"> | |
<div className="px-4 pt-4 pb-3 text-white font-title font-bold text-sm"> | |
{user.username}#{user.discriminator} | |
</div> | |
<div className="px-2 pb-4"> | |
<div | |
className="flex items-center justify-start gap-3 bg-[#f02727] text-white group transition-all duration-100 p-2 rounded-md cursor-pointer" | |
onClick={() => logout()} | |
> | |
<svg | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" | |
viewBox="0 0 24 24" | |
strokeWidth="1.5" | |
stroke="currentColor" | |
className="w-6 h-6 text-white transition-all duration-100" | |
> | |
<path | |
strokeLinecap="round" | |
strokeLinejoin="round" | |
d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75" | |
/> | |
</svg> | |
<p className="font-semibold tracking-wider text-sm"> | |
<FormattedMessage id="navigation.menus.logOut" /> | |
</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |