Merge pull request #300 from ludovicm67/webui-display-current-identity

Michael Muré created

Webui: display current identity + improve app bar

Change summary

misc/logo/logo-alpha-flat-white.svg | 50 +++++++++++++++++++++++++++++++
webui/public/logo.svg               | 50 +++++++++++++++++++++++++++++++
webui/src/App.js                    | 32 +++++++++++++++++--
webui/src/CurrentIdentity.js        | 45 +++++++++++++++++++++++++++
4 files changed, 173 insertions(+), 4 deletions(-)

Detailed changes

misc/logo/logo-alpha-flat-white.svg 🔗

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 1024 1024"
+   version="1.1"
+   id="svg26"
+   sodipodi:docname="logo-alpha-flat-outline.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata30">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#000000"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="1"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     id="namedview28"
+     showgrid="false"
+     inkscape:zoom="0.4609375"
+     inkscape:cx="29.289416"
+     inkscape:cy="396.82507"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g24" />
+  <defs
+     id="defs10">
+    <path
+       id="b"

webui/public/logo.svg 🔗

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 1024 1024"
+   version="1.1"
+   id="svg26"
+   sodipodi:docname="logo.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata30">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#000000"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="1"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     id="namedview28"
+     showgrid="false"
+     inkscape:zoom="0.4609375"
+     inkscape:cx="-437.15126"
+     inkscape:cy="388.1471"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g24" />
+  <defs
+     id="defs10">
+    <path
+       id="b"

webui/src/App.js 🔗

@@ -1,5 +1,6 @@
 import AppBar from '@material-ui/core/AppBar';
 import CssBaseline from '@material-ui/core/CssBaseline';
+import { createMuiTheme, ThemeProvider } from '@material-ui/core/styles';
 import { makeStyles } from '@material-ui/styles';
 import Toolbar from '@material-ui/core/Toolbar';
 import React from 'react';
@@ -8,12 +9,31 @@ import { Link } from 'react-router-dom';
 
 import BugQuery from './bug/BugQuery';
 import ListQuery from './list/ListQuery';
+import CurrentIdentity from './CurrentIdentity';
+
+const theme = createMuiTheme({
+  palette: {
+    primary: {
+      main: '#263238',
+    },
+  },
+});
 
 const useStyles = makeStyles(theme => ({
+  offset: theme.mixins.toolbar,
+  filler: {
+    flexGrow: 1,
+  },
   appTitle: {
     ...theme.typography.h6,
     color: 'white',
     textDecoration: 'none',
+    display: 'flex',
+    alignItems: 'center',
+  },
+  logo: {
+    height: '42px',
+    marginRight: theme.spacing(2),
   },
 }));
 
@@ -21,19 +41,23 @@ export default function App() {
   const classes = useStyles();
 
   return (
-    <>
+    <ThemeProvider theme={theme}>
       <CssBaseline />
-      <AppBar position="static" color="primary">
+      <AppBar position="fixed" color="primary">
         <Toolbar>
           <Link to="/" className={classes.appTitle}>
-            git-bug webui
+            <img src="logo.svg" className={classes.logo} alt="git-bug" />
+            git-bug
           </Link>
+          <div className={classes.filler}></div>
+          <CurrentIdentity />
         </Toolbar>
       </AppBar>
+      <div className={classes.offset} />
       <Switch>
         <Route path="/" exact component={ListQuery} />
         <Route path="/bug/:id" exact component={BugQuery} />
       </Switch>
-    </>
+    </ThemeProvider>
   );
 }

webui/src/CurrentIdentity.js 🔗

@@ -0,0 +1,45 @@
+import React from 'react';
+import gql from 'graphql-tag';
+import { Query } from 'react-apollo';
+import Avatar from '@material-ui/core/Avatar';
+import { makeStyles } from '@material-ui/styles';
+
+const useStyles = makeStyles(theme => ({
+  displayName: {
+    marginLeft: theme.spacing(2),
+  },
+}));
+
+const QUERY = gql`
+  {
+    defaultRepository {
+      userIdentity {
+        displayName
+        avatarUrl
+      }
+    }
+  }
+`;
+
+const CurrentIdentity = () => {
+  const classes = useStyles();
+  return (
+    <Query query={QUERY}>
+      {({ loading, error, data }) => {
+        if (error || loading || !data.defaultRepository.userIdentity)
+          return null;
+        const user = data.defaultRepository.userIdentity;
+        return (
+          <>
+            <Avatar src={user.avatarUrl}>
+              {user.displayName.charAt(0).toUpperCase()}
+            </Avatar>
+            <div className={classes.displayName}>{user.displayName}</div>
+          </>
+        );
+      }}
+    </Query>
+  );
+};
+
+export default CurrentIdentity;