Testing implementation for private data in ATProto with ATPKeyserver and ATCute tools
at main 76 lines 2.2 kB view raw
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}