summaryrefslogtreecommitdiff
path: root/frontend/src/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/index.js')
-rw-r--r--frontend/src/index.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/frontend/src/index.js b/frontend/src/index.js
new file mode 100644
index 0000000..c2a2b74
--- /dev/null
+++ b/frontend/src/index.js
@@ -0,0 +1,66 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { BrowserRouter, Link, Switch, Route } from 'react-router-dom';
+import { Navbar, Nav, Container } from 'react-bootstrap';
+import { UserContext, Login, Logout, OauthCallback, AuthenticationProvider } from './auth.js';
+import { Flash } from './flash';
+import { ThemeContext, ThemeProvider, ThemeSwitcher } from './theme.js';
+import Main from './app';
+
+function LoginNavigation(props) {
+ if (!props.value.is_logged_in) {
+ return <Nav.Link as={Link} to="/login">Login</Nav.Link>
+ }
+ return <>
+ <Nav.Link as={Link} to="/logout">Logout [{props.value.username}]</Nav.Link>
+ </>;
+}
+
+function Navigation() {
+ return <ThemeContext.Consumer>
+ {theme => (
+ <Navbar bg={theme.bg} variant={theme.bg} expand="lg">
+ <Navbar.Brand as={Link} to="/">Inventory</Navbar.Brand>
+ <Navbar.Toggle aria-controls="navbar-content" />
+ <Navbar.Collapse id="navbar-content">
+ <Nav className="mr-auto">
+ <Nav.Link as={Link} to="/">Home</Nav.Link>
+ <UserContext.Consumer>
+ {value => <LoginNavigation value={value} />}
+ </UserContext.Consumer>
+ </Nav>
+ <ThemeSwitcher />
+ </Navbar.Collapse>
+ </Navbar>)}
+ </ThemeContext.Consumer>;
+}
+
+function Router() {
+ return <BrowserRouter>
+ <Navigation />
+ <Flash />
+ <Container fluid>
+ <Switch>
+ <Route path="/login" component={Login} />
+ <Route path="/logout" component={Logout} />
+ <Route path="/oauth-callback" component={OauthCallback} />
+ <Route path="/" component={Main} />
+ </Switch>
+ </Container>
+ </BrowserRouter>;
+}
+
+function Root() {
+ return <AuthenticationProvider>
+ <ThemeProvider>
+ <Router />
+ </ThemeProvider>
+ </AuthenticationProvider>;
+}
+
+ReactDOM.render(
+ <React.StrictMode>
+ <Root />
+ </React.StrictMode>,
+ document.getElementById('root')
+);