diff options
author | Michael Muré <batolettre@gmail.com> | 2021-04-23 00:16:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-23 00:16:57 +0200 |
commit | a8f3b55986982db5f7c3918acaba2c214c919d11 (patch) | |
tree | 19706066a71c32684979b019aa62525481ff4891 /webui/src/pages/identity/Identity.tsx | |
parent | 271ca35d19a9649f6d0512760aed70c8778822fc (diff) | |
parent | 774bae6d432c13cfa0de3ddc2f111927743243fe (diff) | |
download | git-bug-a8f3b55986982db5f7c3918acaba2c214c919d11.tar.gz |
Merge pull request #605 from GlancingMind/upstream-12-allow-users-to-inspect-their-current-identity-details
WebUI: Add user profile
Diffstat (limited to 'webui/src/pages/identity/Identity.tsx')
-rw-r--r-- | webui/src/pages/identity/Identity.tsx | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/webui/src/pages/identity/Identity.tsx b/webui/src/pages/identity/Identity.tsx new file mode 100644 index 00000000..5170eeea --- /dev/null +++ b/webui/src/pages/identity/Identity.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import { Link as RouterLink } from 'react-router-dom'; + +import { Link, Paper, Typography } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; +import InfoIcon from '@material-ui/icons/Info'; +import MailOutlineIcon from '@material-ui/icons/MailOutline'; + +import { IdentityFragment } from '../../components/Identity/IdentityFragment.generated'; + +import { useGetUserStatisticQuery } from './GetUserStatistic.generated'; + +const useStyles = makeStyles((theme) => ({ + main: { + maxWidth: 1000, + margin: 'auto', + marginTop: theme.spacing(3), + }, + content: { + padding: theme.spacing(0.5, 2, 2, 2), + wordWrap: 'break-word', + }, + large: { + minWidth: 200, + minHeight: 200, + margin: 'auto', + maxWidth: '100%', + maxHeight: '100%', + }, + heading: { + marginTop: theme.spacing(3), + }, + header: { + ...theme.typography.h4, + wordBreak: 'break-word', + }, + infoIcon: { + verticalAlign: 'bottom', + }, +})); + +type Props = { + identity: IdentityFragment; +}; +const Identity = ({ identity }: Props) => { + const classes = useStyles(); + const user = identity; + + const { loading, error, data } = useGetUserStatisticQuery({ + variables: { + authorQuery: 'author:' + user?.id, + participantQuery: 'participant:' + user?.id, + actionQuery: 'actor:' + user?.id, + }, + }); + + if (loading) return <CircularProgress />; + if (error) return <p>Error: {error}</p>; + const statistic = data?.repository; + const authoredCount = statistic?.authored?.totalCount; + const participatedCount = statistic?.participated?.totalCount; + const actionCount = statistic?.actions?.totalCount; + + return ( + <main className={classes.main}> + <Paper elevation={3} className={classes.content}> + <Grid spacing={2} container direction="row"> + <Grid xs={12} sm={4} className={classes.heading} item> + <Avatar + src={user?.avatarUrl ? user.avatarUrl : undefined} + className={classes.large} + > + {user?.displayName.charAt(0).toUpperCase()} + </Avatar> + </Grid> + <Grid xs={12} sm={4} item> + <section> + <h1 className={classes.header}>{user?.name}</h1> + <Typography variant="subtitle1"> + Name: {user?.displayName ? user?.displayName : '---'} + </Typography> + <Typography variant="subtitle1"> + Id (truncated): {user?.humanId ? user?.humanId : '---'} + <InfoIcon + titleAccess={user?.id ? user?.id : '---'} + className={classes.infoIcon} + /> + </Typography> + {user?.email && ( + <Typography + variant="subtitle1" + style={{ + display: 'flex', + alignItems: 'center', + flexWrap: 'wrap', + }} + > + <MailOutlineIcon /> + <Link href={'mailto:' + user?.email} color={'inherit'}> + {user?.email} + </Link> + </Typography> + )} + </section> + </Grid> + <Grid xs={12} sm={4} item> + <section> + <h1 className={classes.header}>Statistics</h1> + <Link + component={RouterLink} + to={`/?q=author%3A${user?.id}+sort%3Acreation`} + color={'inherit'} + > + <Typography variant="subtitle1"> + Created {authoredCount} bugs. + </Typography> + </Link> + <Link + component={RouterLink} + to={`/?q=participant%3A${user?.id}+sort%3Acreation`} + color={'inherit'} + > + <Typography variant="subtitle1"> + Participated to {participatedCount} bugs. + </Typography> + </Link> + <Link + component={RouterLink} + to={`/?q=actor%3A${user?.id}+sort%3Acreation`} + color={'inherit'} + > + <Typography variant="subtitle1"> + Interacted with {actionCount} bugs. + </Typography> + </Link> + </section> + </Grid> + </Grid> + </Paper> + </main> + ); +}; + +export default Identity; |