2024-02-28 21:49:44 +05:00
|
|
|
import {
|
|
|
|
AppBar as AppBarMui,
|
|
|
|
Box,
|
|
|
|
Button,
|
|
|
|
Menu,
|
|
|
|
MenuItem,
|
|
|
|
Toolbar,
|
|
|
|
Typography
|
|
|
|
} from '@mui/material'
|
2024-04-08 17:45:51 +05:00
|
|
|
|
2024-02-28 21:49:44 +05:00
|
|
|
import { useEffect, useState } from 'react'
|
2024-10-05 14:56:34 +02:00
|
|
|
import { useSelector } from 'react-redux'
|
2024-02-28 21:49:44 +05:00
|
|
|
import { State } from '../../store/rootReducer'
|
|
|
|
import Username from '../username'
|
|
|
|
|
2024-05-14 14:27:05 +05:00
|
|
|
import { Link, useNavigate } from 'react-router-dom'
|
2024-05-28 12:22:31 +03:00
|
|
|
import {
|
|
|
|
appPublicRoutes,
|
|
|
|
appPrivateRoutes,
|
|
|
|
getProfileRoute
|
|
|
|
} from '../../routes'
|
2024-10-05 14:56:34 +02:00
|
|
|
import { getProfileUsername, hexToNpub } from '../../utils'
|
2024-02-28 21:49:44 +05:00
|
|
|
import styles from './style.module.scss'
|
2024-07-29 11:22:04 +02:00
|
|
|
import { Container } from '../Container'
|
2024-07-29 14:39:30 +02:00
|
|
|
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'
|
2024-10-05 14:56:34 +02:00
|
|
|
import { useLogout } from '../../hooks/useLogout'
|
2024-05-16 16:45:00 +02:00
|
|
|
|
2024-10-07 15:36:29 +02:00
|
|
|
import { launch as launchNostrLoginDialog } from 'nostr-login'
|
|
|
|
|
2024-02-28 21:49:44 +05:00
|
|
|
export const AppBar = () => {
|
|
|
|
const navigate = useNavigate()
|
2024-10-05 14:56:34 +02:00
|
|
|
const logout = useLogout()
|
2024-02-28 21:49:44 +05:00
|
|
|
const [username, setUsername] = useState('')
|
2024-05-15 13:57:54 +02:00
|
|
|
const [userAvatar, setUserAvatar] = useState('')
|
2024-02-28 21:49:44 +05:00
|
|
|
const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null)
|
|
|
|
|
|
|
|
const authState = useSelector((state: State) => state.auth)
|
|
|
|
const metadataState = useSelector((state: State) => state.metadata)
|
2024-05-17 13:33:01 +02:00
|
|
|
const userRobotImage = useSelector((state: State) => state.userRobotImage)
|
2024-02-28 21:49:44 +05:00
|
|
|
|
|
|
|
useEffect(() => {
|
2024-05-16 16:45:00 +02:00
|
|
|
if (metadataState) {
|
|
|
|
if (metadataState.content) {
|
2024-09-19 14:46:22 +02:00
|
|
|
const profileMetadata = JSON.parse(metadataState.content)
|
|
|
|
const { picture } = profileMetadata
|
2024-05-17 13:35:37 +02:00
|
|
|
|
2024-05-17 13:33:01 +02:00
|
|
|
if (picture || userRobotImage) {
|
|
|
|
setUserAvatar(picture || userRobotImage)
|
2024-05-16 16:45:00 +02:00
|
|
|
}
|
2024-05-17 13:59:03 +05:00
|
|
|
|
2024-05-30 22:36:17 +05:00
|
|
|
const npub = authState.usersPubkey
|
|
|
|
? hexToNpub(authState.usersPubkey)
|
|
|
|
: ''
|
|
|
|
|
2024-09-19 14:46:22 +02:00
|
|
|
setUsername(getProfileUsername(npub, profileMetadata))
|
2024-05-15 13:57:54 +02:00
|
|
|
} else {
|
2024-05-17 13:33:01 +02:00
|
|
|
setUserAvatar(userRobotImage || '')
|
2024-05-16 16:45:00 +02:00
|
|
|
setUsername('')
|
2024-05-15 13:57:54 +02:00
|
|
|
}
|
2024-02-28 21:49:44 +05:00
|
|
|
}
|
2024-05-30 22:36:17 +05:00
|
|
|
}, [metadataState, userRobotImage, authState.usersPubkey])
|
2024-02-28 21:49:44 +05:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2024-02-28 21:49:44 +05:00
|
|
|
const handleLogout = () => {
|
2024-04-08 17:45:51 +05:00
|
|
|
handleCloseUserMenu()
|
2024-10-05 14:56:34 +02:00
|
|
|
logout()
|
2024-02-28 21:49:44 +05:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2024-02-28 21:49:44 +05:00
|
|
|
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 Alpha software (available for internal
|
|
|
|
testing), use at your own risk!
|
|
|
|
</p>
|
2024-07-25 15:05:47 +02:00
|
|
|
<Button
|
2024-09-19 09:54:19 +02:00
|
|
|
aria-label={`close banner`}
|
|
|
|
variant="text"
|
|
|
|
onClick={handleBannerHide}
|
2024-02-28 21:49:44 +05:00
|
|
|
>
|
2024-09-19 09:54:19 +02:00
|
|
|
<FontAwesomeIcon icon={faClose} />
|
2024-07-25 15:05:47 +02:00
|
|
|
</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={() => navigate('/')} />
|
|
|
|
</Box>
|
|
|
|
|
|
|
|
<Box className={styles.rightSideBox}>
|
|
|
|
{!isAuthenticated && (
|
|
|
|
<Button
|
|
|
|
startIcon={<ButtonIcon />}
|
|
|
|
onClick={() => {
|
2024-10-07 15:36:29 +02:00
|
|
|
launchNostrLoginDialog('welcome')
|
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-05-28 12:22:31 +03:00
|
|
|
|
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-07-25 15:05:47 +02:00
|
|
|
}}
|
2024-09-19 09:54:19 +02:00
|
|
|
keepMounted
|
|
|
|
transformOrigin={{
|
|
|
|
vertical: 'top',
|
|
|
|
horizontal: 'center'
|
2024-07-25 15:05:47 +02:00
|
|
|
}}
|
2024-09-19 09:54:19 +02:00
|
|
|
open={!!anchorElUser}
|
|
|
|
onClose={handleCloseUserMenu}
|
2024-07-25 15:05:47 +02:00
|
|
|
>
|
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-06-03 19:46:42 +05:00
|
|
|
|
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>
|
2024-07-25 15:05:47 +02:00
|
|
|
<MenuItem
|
2024-09-19 09:54:19 +02:00
|
|
|
onClick={handleLogout}
|
2024-07-25 15:05:47 +02:00
|
|
|
sx={{
|
|
|
|
justifyContent: 'center'
|
|
|
|
}}
|
|
|
|
>
|
2024-09-19 09:54:19 +02:00
|
|
|
Logout
|
2024-07-25 15:05:47 +02:00
|
|
|
</MenuItem>
|
2024-09-19 09:54:19 +02:00
|
|
|
</Menu>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</Box>
|
|
|
|
</Toolbar>
|
|
|
|
</Container>
|
|
|
|
</AppBarMui>
|
|
|
|
</>
|
2024-02-28 21:49:44 +05:00
|
|
|
)
|
|
|
|
}
|