frontend/app/Login/LoginStatusComponent.tsx (79 lines of code) (raw):

import React, {useContext, useState} from 'react'; import {Redirect} from "react-router-dom"; import axios from 'axios'; import {createStyles, makeStyles, withStyles} from "@material-ui/core"; import {UserContext} from "../Context/UserContext"; interface LoginStatusComponentProps { userLoggedOutCb: ()=>void; } interface LoginStatusComponentState { opened?: boolean; redirecting?: boolean; } const useStyles = makeStyles({ loginInfoContainer: { float: "right", position: "absolute", top: 0, right: "1em", height: "max-content", padding: "0.4em", overflow: "hidden", cursor: "pointer" }, loginUserAvatar: { height: "40px", borderRadius: "8px", verticalAlign: "middle", }, loginInfoText: { color: "#AAAAAA", margin: "0.5em" }, discreetList: { textAlign: "right", listStyle: "none" } }); const LoginStatusComponent:React.FC<LoginStatusComponentProps> = (props) => { const classes = useStyles(); const [opened, setOpened] = useState(false); const [redirecting, setRedirecting] = useState(false); const userContext = useContext(UserContext); const trackedOut = () => { window.setTimeout(()=>setOpened(false), 200); } const doLogout = async () => { window.location.href = "/logout"; } if(redirecting) return <Redirect to="/"/>; const displayName = ()=>{ if(userContext.profile && userContext.profile?.firstName!="" && userContext.profile?.lastName!="") { return `${userContext.profile?.firstName} ${userContext.profile?.lastName}`; } else if(userContext.profile) { return userContext.profile.email; } else { return "unknown user"; } } return <div className={classes.loginInfoContainer} onMouseEnter={()=>setOpened(true)} onMouseLeave={trackedOut}> { userContext.profile ? <span className={classes.loginInfoText}>{displayName()}</span> : <span className={classes.loginInfoText}>Not logged in</span> } { userContext.profile ? <img className={classes.loginUserAvatar} src={userContext.profile.avatarUrl}/> : undefined } <div style={{width: "100%", display: opened ? "block" : "none"}}> <ul className={classes.discreetList}> <li onClick={doLogout}>Log out</li> </ul> </div> </div> } export default LoginStatusComponent;