diff --git a/package.json b/package.json
index 009d2783..19f8ed01 100644
--- a/package.json
+++ b/package.json
@@ -4,10 +4,12 @@
"private": true,
"dependencies": {
"@material-ui/core": "^4.4.0",
+ "@material-ui/icons": "^4.4.1",
+ "@material-ui/lab": "^4.0.0-alpha.26",
"@types/jest": "24.0.18",
"@types/node": "12.7.4",
"@types/ramda": "^0.26.21",
- "@types/react": "16.9.2",
+ "@types/react": "^16.9.2",
"@types/react-dom": "16.9.0",
"firebase": "^6.6.0",
"ramda": "^0.26.1",
diff --git a/src/App.tsx b/src/App.tsx
index b79c652f..758527db 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,7 +1,22 @@
import React from "react";
+import { ThemeProvider } from "@material-ui/styles";
+import { createMuiTheme } from "@material-ui/core";
+import Navigation from "./components/Navigation";
+const theme = createMuiTheme({
+ spacing: 4,
+ palette: {
+ primary: {
+ main: "#007bff"
+ }
+ }
+});
const App: React.FC = () => {
- return
;
+ return (
+
+
+
+ );
};
export default App;
diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx
new file mode 100644
index 00000000..f270f549
--- /dev/null
+++ b/src/components/Navigation.tsx
@@ -0,0 +1,104 @@
+import React from "react";
+import { createStyles, Theme, makeStyles } from "@material-ui/core/styles";
+import AppBar from "@material-ui/core/AppBar";
+import CssBaseline from "@material-ui/core/CssBaseline";
+import Toolbar from "@material-ui/core/Toolbar";
+import Typography from "@material-ui/core/Typography";
+import IconButton from "@material-ui/core/IconButton";
+import Paper from "@material-ui/core/Paper";
+import Fab from "@material-ui/core/Fab";
+import MenuIcon from "@material-ui/icons/Menu";
+import AddIcon from "@material-ui/icons/Add";
+import Button from "@material-ui/core/Button";
+import Skeleton from "@material-ui/lab/Skeleton";
+import useSettings from "../hooks/useSettings";
+
+const useStyles = makeStyles((theme: Theme) =>
+ createStyles({
+ text: {
+ padding: theme.spacing(2, 2, 0)
+ },
+ paper: {
+ paddingBottom: 20,
+ paddingTop: 5
+ },
+
+ subheader: {
+ backgroundColor: theme.palette.background.paper
+ },
+ appBar: {
+ top: "auto",
+ bottom: 0
+ },
+ grow: {
+ flexGrow: 1
+ },
+ fabButton: {
+ position: "absolute",
+ zIndex: 1,
+ top: -30,
+ right: 20,
+ margin: "0 auto"
+ },
+ button: {
+ color: "#fff",
+ marginLeft: 8
+ },
+ skeleton: {
+ marginLeft: 8,
+ borderRadius: 5
+ }
+ })
+);
+
+export default function Navigation() {
+ const classes = useStyles();
+ const [settings] = useSettings();
+ console.log(settings);
+ return (
+
+
+
+
+ Founders
+
+
+
+
+
+
+
+ {settings.loading || !settings.doc ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+ {settings.tables.map(
+ (table: { name: string; collection: string }) => (
+
+ )
+ )}
+ >
+ )}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/hooks/useSettings.ts b/src/hooks/useSettings.ts
new file mode 100644
index 00000000..bb1264bd
--- /dev/null
+++ b/src/hooks/useSettings.ts
@@ -0,0 +1,49 @@
+import { db } from "../firebase";
+import { useEffect, useReducer } from "react";
+
+const documentReducer = (prevState: any, newProps: any) => {
+ return { ...prevState, ...newProps };
+};
+const documentIntialState = {
+ doc: null,
+ loading: false
+};
+
+const useSettings = () => {
+ const [settingsState, settingsDispatch] = useReducer(documentReducer, {
+ ...documentIntialState
+ });
+ const setSettingsListner = () => {
+ settingsDispatch({ loading: true });
+ const unsubscribe = db.doc("_FIRETABLE_/settings").onSnapshot(snapshot => {
+ if (snapshot.exists) {
+ const data = snapshot.data();
+ const doc = { tables: [], ...data };
+ const tables = doc.tables;
+ settingsDispatch({
+ doc,
+ tables,
+ loading: false
+ });
+ }
+ });
+ settingsDispatch({ unsubscribe });
+ };
+
+ useEffect(() => {
+ const { doc, loading } = settingsState;
+ if (!doc && !loading) {
+ //initialise listener
+ setSettingsListner();
+ }
+ }, [settingsState]);
+ useEffect(
+ () => () => {
+ if (settingsState.unsubscribe) settingsState.unsubscribe();
+ },
+ []
+ );
+ return [settingsState, settingsDispatch];
+};
+
+export default useSettings;
diff --git a/yarn.lock b/yarn.lock
index 83ed16a4..92f7ea3c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1289,6 +1289,24 @@
react-transition-group "^4.0.0"
warning "^4.0.1"
+"@material-ui/icons@^4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.4.1.tgz#a09d53275a5d73a77ee621f91c005a1793432df7"
+ integrity sha512-ilo6rSgsI3B5L7s1H3tBS1x77sJqPql3QJDYzVi2TVluZLCTfRKjpbYYDUwolEAQC0MzXLjVbXHqJ97VeJqpmQ==
+ dependencies:
+ "@babel/runtime" "^7.4.4"
+
+"@material-ui/lab@^4.0.0-alpha.26":
+ version "4.0.0-alpha.26"
+ resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.26.tgz#8db16de1ab46cda5d06afdd97578536989ed3c4e"
+ integrity sha512-23N43d2/DJkQKbJjg3J9DqORgmvxA9ebqpnqrA6JB8zIiDSoSuZmJu1hHUtINgMechxwWGTf73PMy9ihm0AAQA==
+ dependencies:
+ "@babel/runtime" "^7.4.4"
+ "@material-ui/utils" "^4.4.0"
+ clsx "^1.0.4"
+ prop-types "^15.7.2"
+ warning "^4.0.3"
+
"@material-ui/styles@^4.4.1":
version "4.4.1"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.4.1.tgz#a53fb39e373636bd2c296a78c54afecb80f68446"
@@ -1637,7 +1655,7 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@16.9.2":
+"@types/react@*", "@types/react@^16.9.2":
version "16.9.2"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.2.tgz#6d1765431a1ad1877979013906731aae373de268"
integrity sha512-jYP2LWwlh+FTqGd9v7ynUKZzjj98T8x7Yclz479QdRhHfuW9yQ+0jjnD31eXSXutmBpppj5PYNLYLRfnZJvcfg==
@@ -2909,7 +2927,7 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
-clsx@^1.0.2:
+clsx@^1.0.2, clsx@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.0.4.tgz#0c0171f6d5cb2fe83848463c15fcc26b4df8c2ec"
integrity sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==
@@ -10416,7 +10434,7 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
-warning@^4.0.1:
+warning@^4.0.1, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==