1import type { RootData } from '@www/lib/useRootData'
2import clsx from 'clsx'
3import { useFetcher } from 'react-router'
4import { Link, Form } from 'react-router'
5
6export default function UserMenu({ user }: { user?: RootData['user'] }) {
7 const avatar = user?.profile?.avatar
8 const handle = user?.identity.handle
9 const fetcher = useFetcher()
10
11 function logout() {
12 fetcher.submit(
13 { action: 'logout' },
14 {
15 action: '/login',
16 method: 'POST'
17 }
18 )
19 }
20
21 return user ? (
22 <div className="flex items-center">
23 <div className="dropdown dropdown-end">
24 <button
25 tabIndex={0}
26 className={clsx(
27 'avatar btn btn-ghost btn-circle border border-base-200',
28 {
29 'avatar-placeholder': !avatar
30 }
31 )}
32 >
33 {avatar ? (
34 <div className="w-10 rounded-full">
35 <img src={avatar} alt={handle ?? ''} className="w-10" />
36 </div>
37 ) : (
38 <div className="bg-accent text-base-content w-10 rounded-full">
39 <span className="uppercase">{(handle ?? '')[0]}</span>
40 </div>
41 )}
42 </button>
43 <ul
44 tabIndex={-1}
45 className="menu menu-sm dropdown-content bg-base-100 rounded-box z-10 mt-1 w-52 p-2 shadow"
46 >
47 <p className="mx-2 pt-2 pb-3">
48 <span className="text-neutral-400 mr-0.5">@</span>
49 {handle}
50 </p>
51 <li>
52 <Link to={`/profile/${handle}`}>Your profile</Link>
53 </li>
54 <li>
55 <Link to="/settings/account">Account settings</Link>
56 </li>
57 <li>
58 <Link to="/settings/delegation">Private posts setup</Link>
59 </li>
60 <li>
61 <button onClick={logout}>Logout</button>
62 </li>
63 </ul>
64 </div>
65 </div>
66 ) : (
67 <div className="flex flex-none gap-3">
68 <Link to="/login" className="btn btn-ghost">
69 Login
70 </Link>
71 <Form action="/login" method="POST">
72 <button className="btn btn-accent">Join us!</button>
73 </Form>
74 </div>
75 )
76}