246 lines
7.3 KiB
TypeScript
Raw Normal View History

import {
AppBar as AppBarMui,
Box,
Button,
Menu,
MenuItem,
Toolbar,
Typography
} from '@mui/material'
import { useEffect, useState } from 'react'
import { useAppSelector } from '../../hooks/store'
import Username from '../username'
2024-05-14 14:27:05 +05:00
import { Link, useNavigate } from 'react-router-dom'
import {
appPublicRoutes,
appPrivateRoutes,
getProfileRoute
} from '../../routes'
import { getProfileUsername, hexToNpub } from '../../utils'
import styles from './style.module.scss'
import { Container } from '../Container'
import { ButtonIcon } from '../ButtonIcon'
2024-09-19 09:54:19 +02:00
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faClose } from '@fortawesome/free-solid-svg-icons'
import useMediaQuery from '@mui/material/useMediaQuery'
import { useLogout } from '../../hooks/useLogout'
import { launch as launchNostrLoginDialog } from 'nostr-login'
export const AppBar = () => {
const navigate = useNavigate()
const logout = useLogout()
const [username, setUsername] = useState('')
const [userAvatar, setUserAvatar] = useState('')
const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null)
const authState = useAppSelector((state) => state.auth)
const metadataState = useAppSelector((state) => state.metadata)
const userRobotImage = useAppSelector((state) => state.userRobotImage)
useEffect(() => {
if (metadataState) {
if (metadataState.content) {
const profileMetadata = JSON.parse(metadataState.content)
const { picture } = profileMetadata
2024-05-17 13:35:37 +02:00
if (picture || userRobotImage) {
setUserAvatar(picture || userRobotImage)
}
2024-05-17 13:59:03 +05:00
const npub = authState.usersPubkey
? hexToNpub(authState.usersPubkey)
: ''
setUsername(getProfileUsername(npub, profileMetadata))
} else {
setUserAvatar(userRobotImage || '')
setUsername('')
}
}
}, [metadataState, userRobotImage, authState.usersPubkey])
const handleOpenUserMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElUser(event.currentTarget)
}
const handleCloseUserMenu = () => {
setAnchorElUser(null)
}
2024-03-01 15:16:35 +05:00
const handleProfile = () => {
const hexKey = authState?.usersPubkey
if (hexKey) navigate(getProfileRoute(hexKey))
setAnchorElUser(null)
}
const handleLogout = () => {
handleCloseUserMenu()
logout()
navigate('/')
}
const isAuthenticated = authState?.loggedIn === true
2024-09-19 09:54:19 +02:00
const matches = useMediaQuery('(max-width:767px)')
const [isBannerVisible, setIsBannerVisible] = useState(true)
const handleBannerHide = () => {
setIsBannerVisible(false)
}
return (
2024-09-19 09:54:19 +02:00
<>
{isAuthenticated && isBannerVisible && (
<div className={styles.banner}>
<Container>
<div className={styles.bannerInner}>
2024-09-20 11:29:35 +02:00
<p className={styles.bannerText}>
SIGit is currently Beta software (available for user experience
2024-09-20 11:29:35 +02:00
testing), use at your own risk!
</p>
<Button
2024-09-19 09:54:19 +02:00
aria-label={`close banner`}
variant="text"
onClick={handleBannerHide}
>
2024-09-19 09:54:19 +02:00
<FontAwesomeIcon icon={faClose} />
</Button>
2024-09-19 09:54:19 +02:00
</div>
</Container>
</div>
)}
<AppBarMui
position={matches ? 'sticky' : 'static'}
className={styles.AppBar}
sx={{
boxShadow: 'none'
}}
>
<Container>
<Toolbar className={styles.toolbar} disableGutters={true}>
<Box className={styles.logoWrapper}>
<img
src="/logo.svg"
alt="Logo"
onClick={() => {
if (['', '#/'].includes(window.location.hash)) {
location.reload()
} else {
navigate('/')
}
}}
/>
2024-09-19 09:54:19 +02:00
</Box>
<Box className={styles.rightSideBox}>
{!isAuthenticated && (
<Button
startIcon={<ButtonIcon />}
onClick={() => {
launchNostrLoginDialog()
2024-03-05 14:08:18 +05:00
}}
2024-09-19 09:54:19 +02:00
variant="contained"
2024-03-05 14:08:18 +05:00
>
2024-09-19 09:54:19 +02:00
LOGIN
</Button>
)}
2024-09-19 09:54:19 +02:00
{isAuthenticated && (
<>
<Username
username={username}
avatarContent={userAvatar}
handleClick={handleOpenUserMenu}
/>
<Menu
id="menu-appbar"
anchorEl={anchorElUser}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center'
}}
2024-09-19 09:54:19 +02:00
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center'
}}
2024-09-19 09:54:19 +02:00
open={!!anchorElUser}
onClose={handleCloseUserMenu}
>
2024-09-19 09:54:19 +02:00
<MenuItem
sx={{
justifyContent: 'center',
display: { md: 'none' },
fontWeight: 500,
fontSize: '14px',
color: 'var(--text-color)'
}}
>
<Typography variant="h6">{username}</Typography>
</MenuItem>
<MenuItem
onClick={handleProfile}
sx={{
justifyContent: 'center'
}}
>
Profile
</MenuItem>
<MenuItem
onClick={() => {
setAnchorElUser(null)
2024-09-19 09:54:19 +02:00
navigate(appPrivateRoutes.settings)
}}
sx={{
justifyContent: 'center'
}}
>
Settings
</MenuItem>
<MenuItem
onClick={() => {
setAnchorElUser(null)
navigate(appPublicRoutes.verify)
}}
sx={{
justifyContent: 'center'
}}
>
Verify
</MenuItem>
<Link
to={appPublicRoutes.source}
target="_blank"
style={{ color: 'inherit', textDecoration: 'inherit' }}
>
<MenuItem
sx={{
justifyContent: 'center'
}}
>
Source
</MenuItem>
</Link>
<MenuItem
2024-09-19 09:54:19 +02:00
onClick={handleLogout}
sx={{
justifyContent: 'center'
}}
>
2024-09-19 09:54:19 +02:00
Logout
</MenuItem>
2024-09-19 09:54:19 +02:00
</Menu>
</>
)}
</Box>
</Toolbar>
</Container>
</AppBarMui>
</>
)
}