import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import logo from '../assets/logo.png' import { getUserAvatarUrl } from '../api/users' import { useAuth } from '../context/AuthContext' import { hashIndex } from '../lib/avatar' import { getPushSubscriptionStatus, isPushSupported, subscribeToPush, unsubscribeFromPush } from '../lib/push' import { ProfileModal } from './ProfileModal' import { UserAvatar } from './UserAvatar' import './TopBar.css' export function TopBar() { const { user, logout } = useAuth() const navigate = useNavigate() const [menuOpen, setMenuOpen] = useState(false) const [profileModalOpen, setProfileModalOpen] = useState(false) const [pushSubscribed, setPushSubscribed] = useState(false) const [pushBusy, setPushBusy] = useState(false) const [pushError, setPushError] = useState(null) useEffect(() => { getPushSubscriptionStatus().then(setPushSubscribed) }, []) async function handleTogglePush() { setPushBusy(true) setPushError(null) try { if (pushSubscribed) { await unsubscribeFromPush() setPushSubscribed(false) } else { await subscribeToPush() setPushSubscribed(true) } } catch (err) { setPushError(err instanceof Error ? err.message : String(err)) } finally { setPushBusy(false) } } if (!user) return null return (
DS Chat
{menuOpen && ( <>
setMenuOpen(false)} />
{user.display_name || user.username}
{user.is_site_admin && ( )} {isPushSupported() && ( )} {pushError &&
{pushError}
}
)}
{profileModalOpen && setProfileModalOpen(false)} />}
) }