import api from 'api/api'; import { useSnackbar } from 'notistack'; import React, { useEffect, useMemo, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useHistory, useLocation } from 'react-router-dom'; import styled from 'styled-components'; import { Avatar, Button, CircularProgress, IconButton, Tooltip, } from '@material-ui/core'; import { PersonOutline } from '@material-ui/icons'; import UserProfile from './UserProfile'; import { makeSignedInChange, selectIsSignedIn, selectLoading, selectProfile, selectUserRoles, } from './userSlice'; const StyledAvatar = styled(Avatar)` width: ${({ theme }) => theme.spacing(3)}px; height: ${({ theme }) => theme.spacing(3)}px; `; const StyledProgress = styled(CircularProgress)` position: absolute; top: ${({ theme }) => theme.spacing(1.1)}px; left: ${({ theme }) => theme.spacing(1.1)}px; z-index: 1; `; const Wrapper = styled.div` position: relative; `; const UserButton = () => { const isSignedIn = useSelector(selectIsSignedIn); const loading = useSelector(selectLoading); const profile = useSelector(selectProfile); const roles = useSelector(selectUserRoles); const [openDialog, setOpenDialog] = useState(false); const dispatch = useDispatch(); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const handleSignedInChange = useMemo( () => makeSignedInChange(enqueueSnackbar), [enqueueSnackbar], ); const { state, pathname } = useLocation<{ referrer: string } | undefined>(); const { replace } = useHistory(); const handleCloseDialog = (signOut?: boolean) => { setOpenDialog(false); if (signOut) { api.signOut(); enqueueSnackbar('You have been logged out', { key: 'user-logged-out', action: () => ( ), }); } }; useEffect(() => { if (isSignedIn && state?.referrer && pathname !== state?.referrer) replace(state.referrer); }, [state, pathname, isSignedIn, replace]); useEffect(() => { api.active.then(() => { api.attachListener(signedIn => dispatch(handleSignedInChange(signedIn))); }); }, [dispatch, handleSignedInChange]); return ( <> (isSignedIn ? setOpenDialog(true) : api.signIn())} > {isSignedIn && profile ? ( ) : ( )} {loading && } {isSignedIn && profile && roles ? ( ) : null} ); }; export default UserButton;