diff --git a/jam-ui/package-lock.json b/jam-ui/package-lock.json
index 77c271e73..3eb2365d2 100644
--- a/jam-ui/package-lock.json
+++ b/jam-ui/package-lock.json
@@ -1882,6 +1882,11 @@
"@babel/types": "^7.3.0"
}
},
+ "@types/cookie": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
+ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
+ },
"@types/eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
@@ -5831,9 +5836,9 @@
"integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
},
"dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
+ "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
"requires": {
"ip": "^1.1.0",
"safe-buffer": "^5.0.1"
@@ -5920,11 +5925,18 @@
}
},
"domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+ "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
"requires": {
- "domelementtype": "1"
+ "domelementtype": "^2.2.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+ }
}
},
"domutils": {
@@ -6168,9 +6180,9 @@
}
},
"ws": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
- "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true
}
}
@@ -6210,9 +6222,9 @@
"dev": true
},
"ws": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
- "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true
}
}
@@ -9033,22 +9045,40 @@
}
},
"htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
"requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
},
"dependencies": {
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ "dom-serializer": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+ "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+ },
+ "domutils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
+ "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
}
}
},
@@ -13031,9 +13061,9 @@
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
},
"postcss": {
- "version": "7.0.35",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
- "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "version": "7.0.36",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
+ "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
@@ -14357,6 +14387,16 @@
"prop-types": "^15.7.2"
}
},
+ "react-cookie": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.0.3.tgz",
+ "integrity": "sha512-cmi6IpdVgTSvjqssqIEvo779Gfqc4uPGHRrKMEdHcqkmGtPmxolGfsyKj95bhdLEKqMdbX8MLBCwezlnhkHK0g==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.0.1",
+ "hoist-non-react-statics": "^3.0.0",
+ "universal-cookie": "^4.0.0"
+ }
+ },
"react-countup": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/react-countup/-/react-countup-4.3.3.tgz",
@@ -14655,9 +14695,9 @@
}
},
"react-hook-form": {
- "version": "4.10.2",
- "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-4.10.2.tgz",
- "integrity": "sha512-Ule/KqHBwUvuubqGC4WDvOARS6VjlULSS+WHspgQ5FhFKR4ytHDc4AMpjVfnv+Wbz2TEbMp9/ZHmuZsUksPCiA=="
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.11.1.tgz",
+ "integrity": "sha512-lBt428oU03dNUF5qZy5xqEdANaH3L/ilKWQS2t8wD6zF7FypOv46kEkZmg+oHf3n2xgeGYJgbMIGtYExsfKJ8A=="
},
"react-image-lightbox": {
"version": "5.1.1",
@@ -15405,15 +15445,15 @@
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
},
"renderkid": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz",
- "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
+ "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
"requires": {
- "css-select": "^2.0.2",
- "dom-converter": "^0.2",
- "htmlparser2": "^3.10.1",
- "lodash": "^4.17.20",
- "strip-ansi": "^3.0.0"
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^3.0.1"
},
"dependencies": {
"ansi-regex": {
@@ -15421,6 +15461,56 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
+ "css-select": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
+ "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^5.0.0",
+ "domhandler": "^4.2.0",
+ "domutils": "^2.6.0",
+ "nth-check": "^2.0.0"
+ }
+ },
+ "css-what": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz",
+ "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg=="
+ },
+ "dom-serializer": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+ "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+ },
+ "domutils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
+ "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "nth-check": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+ "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -16724,9 +16814,9 @@
}
},
"ssri": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
- "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz",
+ "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==",
"requires": {
"figgy-pudding": "^3.5.1",
"minipass": "^3.1.1"
@@ -17916,6 +18006,15 @@
"through2-filter": "^3.0.0"
}
},
+ "universal-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz",
+ "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==",
+ "requires": {
+ "@types/cookie": "^0.3.3",
+ "cookie": "^0.4.0"
+ }
+ },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
diff --git a/jam-ui/package.json b/jam-ui/package.json
index 7dfec9472..3bd863d50 100644
--- a/jam-ui/package.json
+++ b/jam-ui/package.json
@@ -43,13 +43,14 @@
"react-bootstrap-table-next": "^3.3.5",
"react-bootstrap-table2-paginator": "^2.1.2",
"react-chartjs-2": "^2.10.0",
+ "react-cookie": "^4.0.3",
"react-countup": "^4.3.3",
"react-datetime": "^2.16.3",
"react-dom": "^16.13.1",
"react-dropzone": "^10.2.2",
"react-es6-progressbar.js": "^1.1.0",
"react-flatpickr": "^3.10.6",
- "react-hook-form": "^4.10.2",
+ "react-hook-form": "^7.11.1",
"react-image-lightbox": "^5.1.1",
"react-image-video-lightbox": "^2.0.1",
"react-leaflet": "^2.7.0",
@@ -72,7 +73,7 @@
"uuid": "^3.4.0"
},
"scripts": {
- "start": "react-scripts start",
+ "start": "HOST=beta.jamkazam.local react-scripts start",
"build": "react-scripts build",
"eject": "react-scripts eject",
"scss": "gulp",
diff --git a/jam-ui/public/index.html b/jam-ui/public/index.html
index 2b4255c89..d4c079ee6 100644
--- a/jam-ui/public/index.html
+++ b/jam-ui/public/index.html
@@ -12,7 +12,7 @@
href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700|Poppins:100,200,300,400,500,600,700,800,900&display=swap"
/>
-
Falcon React | ReactJS Dashboard & WebApp Template
+ JamKazam
diff --git a/jam-ui/src/App.js b/jam-ui/src/App.js
index 96fca6da8..74c430962 100644
--- a/jam-ui/src/App.js
+++ b/jam-ui/src/App.js
@@ -7,7 +7,8 @@ import 'react-datetime/css/react-datetime.css';
import 'react-image-lightbox/style.css';
const App = () => {
- return (
+
+ return (
diff --git a/jam-ui/src/Main.js b/jam-ui/src/Main.js
index 0fc8c7e55..7e8e06792 100644
--- a/jam-ui/src/Main.js
+++ b/jam-ui/src/Main.js
@@ -1,6 +1,7 @@
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import AppContext from './context/Context';
+import { AuthProvider } from "./context/AuthContext";
import { settings } from './config';
import toggleStylesheet from './helpers/toggleStylesheet';
import { getItemFromStore, setItemToStore, themeColors } from './helpers/utils';
@@ -18,7 +19,7 @@ const Main = props => {
const [currency, setCurrency] = useState(settings.currency);
const [showBurgerMenu, setShowBurgerMenu] = useState(settings.showBurgerMenu);
const [isLoaded, setIsLoaded] = useState(false);
- const [isOpenSidePanel, setIsOpenSidePanel] = useState(false);
+ const [isOpenSidePanel, setIsOpenSidePanel] = useState(true);
const [navbarCollapsed, setNavbarCollapsed] = useState(false);
const [navbarStyle, setNavbarStyle] = useState(getItemFromStore('navbarStyle', settings.navbarStyle));
@@ -114,7 +115,11 @@ const Main = props => {
);
}
- return {props.children};
+ return
+
+ {props.children}
+
+ ;
};
Main.propTypes = { children: PropTypes.node };
diff --git a/jam-ui/src/assets/img/icons/question_icon.svg b/jam-ui/src/assets/img/icons/question_icon.svg
new file mode 100644
index 000000000..238eebefe
--- /dev/null
+++ b/jam-ui/src/assets/img/icons/question_icon.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/jam-ui/src/assets/img/logos/JK_Logo_2c.png b/jam-ui/src/assets/img/logos/JK_Logo_2c.png
new file mode 100644
index 000000000..a35daa14b
Binary files /dev/null and b/jam-ui/src/assets/img/logos/JK_Logo_2c.png differ
diff --git a/jam-ui/src/assets/img/logos/JK_Logo_blue-2021.png b/jam-ui/src/assets/img/logos/JK_Logo_blue-2021.png
new file mode 100644
index 000000000..d30e220cf
Binary files /dev/null and b/jam-ui/src/assets/img/logos/JK_Logo_blue-2021.png differ
diff --git a/jam-ui/src/assets/scss/_user.scss b/jam-ui/src/assets/scss/_user.scss
index 150d9a3f9..4d41abaea 100644
--- a/jam-ui/src/assets/scss/_user.scss
+++ b/jam-ui/src/assets/scss/_user.scss
@@ -3,3 +3,5 @@
// user.scss
//
// Place your own theme CSS or SCSS rules below this line, these rules will override any Bootstrap and theme variables.
+
+@import './custom/user.css';
\ No newline at end of file
diff --git a/jam-ui/src/assets/scss/custom/user.css b/jam-ui/src/assets/scss/custom/user.css
new file mode 100644
index 000000000..03ee0c8f1
--- /dev/null
+++ b/jam-ui/src/assets/scss/custom/user.css
@@ -0,0 +1,66 @@
+
+/*# sourceMappingURL=user.min.css.map */
+:root {
+ --jk-good: #198754;
+ --jk-fair: #e0a500;
+ --jk-high: #990000;
+}
+
+.nav-active .nav-link-text{
+ color: --falcon-blue;
+}
+.nav-link-icon {
+ display: inline-block;
+ text-align: center;
+}
+
+.navbar-vertical {
+ z-index: 1031;
+}
+
+.latency-good {
+ background-color: var(--jk-good);
+ color: white;
+ min-width: 50px;
+}
+.latency-fair {
+ background-color: var(--jk-fair);
+ color: white;
+ min-width: 50px;
+}
+
+.latency-high {
+ background-color: var(--jk-high);
+ color: white;
+ min-width: 50px;
+}
+
+.swiper-button-prev:after,
+.swiper-button-next:after {
+ font-size: 25px !important;
+}
+
+/* Hover dropdown */
+
+.hover_drop_down.btn-group ul.dropdown-menu{margin-top:42px;}/*To avoid unwanted close*/
+.hover_drop_down:hover ul.dropdown-menu{
+ display: block;
+}
+
+.hover_drop_down.btn-group ul.dropdown-menu a {
+ display: block;
+ width: 100%;
+}
+
+.hover_drop_down.btn-group ul.dropdown-menu a:hover {
+ text-decoration: none;
+}
+
+.alert-top-fixed {
+ position: fixed;
+ width: 75%;
+ left: 50%;
+ transform: translateX(-50%);
+ top: 0;
+ z-index: 2000;
+}
\ No newline at end of file
diff --git a/jam-ui/src/components/auth/LoginForm.js b/jam-ui/src/components/auth/LoginForm.js
index 01eb99d04..ad2e2f6f1 100644
--- a/jam-ui/src/components/auth/LoginForm.js
+++ b/jam-ui/src/components/auth/LoginForm.js
@@ -1,11 +1,13 @@
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
-import { Link } from 'react-router-dom';
+import { Link, useHistory } from 'react-router-dom';
import { toast } from 'react-toastify';
import { Button, Form, Row, Col, FormGroup, Input, CustomInput, Label } from 'reactstrap';
import Divider from '../common/Divider';
import SocialAuthButtons from './SocialAuthButtons';
import withRedirect from '../../hoc/withRedirect';
+import { useAuth } from '../../context/AuthContext';
+import { signin } from '../../services/authService';
const LoginForm = ({ setRedirect, hasLabel, layout }) => {
// State
@@ -14,11 +16,24 @@ const LoginForm = ({ setRedirect, hasLabel, layout }) => {
const [remember, setRemember] = useState(true);
const [isDisabled, setIsDisabled] = useState(true);
+ const history = useHistory();
+ const { setCurrentUser} = useAuth();
+
// Handler
- const handleSubmit = e => {
+ const handleSubmit = async e => {
e.preventDefault();
- toast.success(`Logged in as ${email}`);
- setRedirect(true);
+ const credentials = {email, password}
+ const user = await signin(credentials)
+ console.log("handleSubmit", user);
+ if(user){
+ setCurrentUser(user)
+ localStorage.setItem('user', user)
+ toast.success(`Signed in as ${email}`);
+ setRedirect(true);
+ }else{
+ toast.error("Incorrect email or password");
+ }
+
};
useEffect(() => {
diff --git a/jam-ui/src/components/auth/LogoutContent.js b/jam-ui/src/components/auth/LogoutContent.js
index b679bc70c..b277c4cd7 100644
--- a/jam-ui/src/components/auth/LogoutContent.js
+++ b/jam-ui/src/components/auth/LogoutContent.js
@@ -1,20 +1,29 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Button } from 'reactstrap';
-import { Link } from 'react-router-dom';
+//import { Link } from 'react-router-dom';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import rocket from '../../assets/img/illustrations/rocket.png';
const LogoutContent = ({ layout, titleTag: TitleTag }) => {
+ const goToLogin = () => {
+ window.location.href = `${process.env.REACT_APP_LEGACY_BASE_URL}/signin`
+ }
return (
See you again!
- Thanks for using Falcon. You are
+ Thanks for using JamKazam. You are
now successfully signed out.
+ {process.env.REACT_APP_LEGACY_BASE_URL}
-
- {isTopNav ? (
+ {/* {isTopNav ? (
- )}
+ )} */}
diff --git a/jam-ui/src/components/navbar/NavbarVertical.js b/jam-ui/src/components/navbar/NavbarVertical.js
index 4cda11f59..c15950718 100644
--- a/jam-ui/src/components/navbar/NavbarVertical.js
+++ b/jam-ui/src/components/navbar/NavbarVertical.js
@@ -64,11 +64,11 @@ const NavbarVertical = ({ navbarStyle }) => {
light
>
-
-
+ /> */}
+
{
const [dropdownOpen, setDropdownOpen] = useState(false);
const toggle = () => setDropdownOpen(prevState => !prevState);
+ const {currentUser, setCurrentUser} = useAuth();
+ const history = useHistory();
+ //const [cookies, setCookie, removeCookie] = useCookies(['remember_token']);
+
+ const handleLogout = () => {
+ //setCurrentUser(null);
+ //localStorage.setItem('user', null);
+ // removeCookie("remember_token", {
+ // domain: ".jamkazam.local"
+ // });
+ history.push('/authentication/basic/logout');
+ console.log("signout...");
+ }
+
+
return (
+
+ //
{
}}
>
-
+ {currentUser && currentUser.name}
-
+ {/*
Go Pro
@@ -41,8 +59,11 @@ const ProfileDropdown = () => {
Settings
-
-
+ */}
+
+ My Profile
+
+
Logout
diff --git a/jam-ui/src/components/navbar/TopNavRightSideNavItem.js b/jam-ui/src/components/navbar/TopNavRightSideNavItem.js
index cee3325b6..ea2be7b4a 100644
--- a/jam-ui/src/components/navbar/TopNavRightSideNavItem.js
+++ b/jam-ui/src/components/navbar/TopNavRightSideNavItem.js
@@ -1,23 +1,24 @@
import React, { useContext } from 'react';
import { Nav, NavItem, NavLink, UncontrolledTooltip } from 'reactstrap';
-import ProfileDropdown from './ProfileDropdown';
-import NotificationDropdown from './NotificationDropdown';
-import SettingsAnimatedIcon from './SettingsAnimatedIcon';
-import CartNotification from './CartNotification';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { Link } from 'react-router-dom';
+// import ProfileDropdown from './ProfileDropdown';
+// import NotificationDropdown from './NotificationDropdown';
+// import SettingsAnimatedIcon from './SettingsAnimatedIcon';
+// import CartNotification from './CartNotification';
+// import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+// import { Link } from 'react-router-dom';
import AppContext from '../../context/Context';
-import classNames from 'classnames';
-import { navbarBreakPoint } from '../../config';
+// import classNames from 'classnames';
+// import { navbarBreakPoint } from '../../config';
+import JKNavbarTopProfile from './JKNavbarTopProfile';
const TopNavRightSideNavItem = () => {
const { isTopNav, isCombo } = useContext(AppContext);
return (
);
};
diff --git a/jam-ui/src/components/page/JKPeople.js b/jam-ui/src/components/page/JKPeople.js
new file mode 100644
index 000000000..3ceaaf874
--- /dev/null
+++ b/jam-ui/src/components/page/JKPeople.js
@@ -0,0 +1,99 @@
+import React, {useState, useEffect} from 'react';
+import PropTypes from 'prop-types';
+import { Alert, Card, CardBody, Col, Row, Button } from 'reactstrap';
+import Loader from '../common/Loader';
+import FalconCardHeader from '../common/FalconCardHeader';
+import { isIterableArray } from '../../helpers/utils';
+// import useFakeFetch from '../../hooks/useFakeFetch';
+// import rawPeople from '../../data/people/people';
+// import peopleCategories from '../../data/people/peopleCategories';
+// import apiFetch from '../../helpers/apiFetch';
+import JKPeopleSearch from "./JKPeopleSearch";
+import JKPeopleList from './JKPeopleList';
+import { getPeople } from "../../helpers/rest";
+
+const JKPeople = ({ className }) => {
+ //const { loading, data: people, setData: setPeople } = useFakeFetch(rawPeople);
+
+ const [people, setPeople] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [showSearch, setShowSearch] = useState(false);
+
+ const fetchPeople = React.useCallback( () => {
+ getPeople()
+ .then(response => {
+ if(!response.ok){
+ //TODO: handle failure
+ console.log(response);
+ throw new Error('Network response was not ok');
+ }
+ return response.json();
+ })
+ .then(data => {
+ console.log('people received', data);
+ setPeople(data.musicians);
+ })
+ .catch( error => {
+ //TODO: handle error
+ console.log(error);
+ }).finally(() => {
+ setLoading(false)
+ });
+ }, [])
+
+ useEffect(() => {
+ fetchPeople();
+ }, [fetchPeople])
+
+ const searchPeople = ({ target }) => {
+ const keyword = target.value.toLowerCase();
+ const filteredResult = people.filter(
+ person => person.name.toLowerCase().includes(keyword) || person.institution.toLowerCase().includes(keyword)
+ );
+
+ setPeople(keyword.length ? filteredResult : people);
+ };
+
+ return (
+
+
+
+
+ setShowSearch(!showSearch)}>Update Search
+ Reset Filters
+
+
+
+
+
+
+
+ {loading ? (
+
+ ) : isIterableArray(people) ? (
+ //Start Find Friends table hidden on small screens
+
+
+
+ ) : (
+
+
+
+ No Records!
+
+
+
+ )}
+
+ );
+}
+
+JKPeople.propTypes = {
+ className: PropTypes.string
+};
+
+JKPeople.defaultProps = {
+ className: 'col-6 col-md-4 col-lg-3 col-xxl-2'
+};
+
+export default JKPeople;
diff --git a/jam-ui/src/components/page/JKPeopleList.js b/jam-ui/src/components/page/JKPeopleList.js
new file mode 100644
index 000000000..67078f752
--- /dev/null
+++ b/jam-ui/src/components/page/JKPeopleList.js
@@ -0,0 +1,35 @@
+import React from "react";
+import { Table } from 'reactstrap';
+import JKPerson from './JKPerson';
+import PropTypes from "prop-types";
+
+const JKPeopleList = ({people}) => {
+ return (
+
+
+
+ | Name |
+ About |
+ Instruments |
+ Genres |
+ Action |
+
+
+
+ {people.map((person, index) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+JKPeopleList.propTypes = {
+ people: PropTypes.arrayOf(
+ PropTypes.instanceOf(Object)
+ )
+}
+
+export default JKPeopleList;
\ No newline at end of file
diff --git a/jam-ui/src/components/page/JKPeopleSearch.js b/jam-ui/src/components/page/JKPeopleSearch.js
new file mode 100644
index 000000000..41e5eae37
--- /dev/null
+++ b/jam-ui/src/components/page/JKPeopleSearch.js
@@ -0,0 +1,289 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
+import Select from 'react-select';
+import JKTooltip from '../common/JKTooltip';
+import PropTypes from 'prop-types';
+import { getGenres, getInstruments, postPeopleSearch } from '../../helpers/rest';
+import { useForm, Controller } from 'react-hook-form';
+
+const JKPeopleSearch = props => {
+ const { show, setShow, setPeople } = props;
+ const [instruments, setInstruments] = useState([]);
+ const [genres, setGenres] = useState([]);
+
+ const { register, handleSubmit, setValue, control } = useForm({
+ defaultValues: {
+ latency_good: true,
+ latency_fair: true,
+ latency_high: true,
+ proficiency_beginner: true,
+ proficiency_intermediate: true,
+ proficiency_expert: true,
+ instruments: []
+ }
+ });
+
+ const toggle = () => setShow(!show);
+
+ const fetchInstruments = async () => {
+ await getInstruments()
+ .then(response => {
+ if (response.ok) {
+ return response.json();
+ }
+ })
+ .then(data => {
+ //console.log(data);
+ setInstruments(
+ data.map(instrument => {
+ return {
+ value: instrument.id,
+ label: instrument.description
+ };
+ })
+ );
+ })
+ .catch(error => console.log(error));
+ };
+
+ const fetchGenres = async () => {
+ await getGenres()
+ .then(response => {
+ if (response.ok) {
+ return response.json();
+ }
+ })
+ .then(data => {
+ console.log(data);
+ setGenres(
+ data.map(genre => {
+ return {
+ value: genre.id,
+ label: genre.description
+ };
+ })
+ );
+ })
+ .catch(error => {
+ console.log(error);
+ });
+ };
+
+ useEffect(() => {
+ fetchGenres();
+ fetchInstruments();
+ }, []);
+
+ const submitForm = event => {
+ console.log('submitForm');
+ event.preventDefault();
+ handleSubmit(onSubmit)();
+ setShow(false);
+ };
+
+ const onSubmit = async (data) => {
+ let genres = []
+ if(data.genres){
+ genres = data.genres.map(genre => genre.value)
+ }
+ const updatedData = {...data, genres}
+ console.log('submitting...', updatedData);
+ await postPeopleSearch(updatedData)
+ .then(response => {
+ if(!response.ok){
+ //TODO: handle failure
+ console.log(response);
+ throw new Error('Network response was not ok');
+ }
+ return response.json();
+ })
+ .then(data => {
+ console.log('people received', data);
+ setPeople(data.musicians);
+ })
+ .catch(err => console.log(err))
+ };
+
+ const lastActiveOpts = [
+ { value: '', label: 'Any Range' },
+ { value: 'Within Last 1 Day', label: 'Within Last 1 Day' },
+ { value: 'Within Last 7 Day', label: 'Within Last 7 Day' },
+ { value: 'Within Last 30 Day', label: 'Within Last 30 Day' },
+ { value: 'Within Last 90 Day', label: 'Within Last 90 Day' }
+ ];
+
+ const joinedOpts = [
+ { value: '', label: 'Any Range' },
+ { value: 'Within Last 1 Day', label: 'Within Last 1 Day' },
+ { value: 'Within Last 7 Day', label: 'Within Last 7 Day' },
+ { value: 'Within Last 30 Day', label: 'Within Last 30 Day' },
+ { value: 'Within Last 90 Day', label: 'Within Last 90 Day' }
+ ];
+
+ return (
+
+
+ Update Search
+
+
+
+
+
+ Cancel
+ {' '}
+
+ Update Search
+
+
+
+
+ );
+};
+
+JKPeopleSearch.propTypes = {
+ show: PropTypes.bool,
+ setShow: PropTypes.func,
+ setPeople: PropTypes.func
+};
+
+JKPeopleSearch.defaultProps = {
+ show: false
+};
+
+export default JKPeopleSearch;
diff --git a/jam-ui/src/components/page/JKPerson.js b/jam-ui/src/components/page/JKPerson.js
new file mode 100644
index 000000000..3385715e1
--- /dev/null
+++ b/jam-ui/src/components/page/JKPerson.js
@@ -0,0 +1,120 @@
+import React, { Fragment, useState } from 'react';
+import PropTypes from 'prop-types';
+import { Link } from 'react-router-dom';
+import { Row, Col } from 'reactstrap';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import avatar from '../../assets/img/team/avatar.png';
+import JKProfileSidePanel from '../profile/JKProfileSidePanel';
+import JKProfileAvatar from '../profile/JKProfileAvatar';
+import JKProfileInstrumentsList from '../profile/JKProfileInstrumentsList';
+import {getUserProfile} from '../../helpers/rest';
+
+const JKPerson = ({ id, name, biography, photo_url, instruments }) => {
+
+ const [showSidePanel, setShowSidePanel] = useState(false)
+ const [user, setUser] = useState(null);
+
+ const fetchPerson = () => {
+ console.log("fetchPerson called");
+ getUserProfile(id)
+ .then(response => {
+ if(response.ok){
+ return response.json()
+ }else{
+
+ }
+ })
+ .then(json => {
+ console.log("USER", json);
+ setUser(json)
+ })
+ .catch(error => console.log(error))
+ }
+
+
+ const toggleMoreDetails = () => {
+ setShowSidePanel(prev => !prev)
+ if(!user){
+ fetchPerson()
+ }
+ }
+ return(
+
+
+
+
+
+
+
+ {name}
+
+
+
+ Latency To Me: 24ms GOOD
+
+
+ Last Active: 1 hour
+
+ |
+
+ { biography }
+ { biography.length > 0 && (
+
+ {' '} more ยป
+
+ )}
+ |
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ )
+}
+
+JKPerson.propTypes = {
+ id: PropTypes.string.isRequired,
+ name: PropTypes.string.isRequired,
+ biography: PropTypes.string.isRequired,
+ photo_url: PropTypes.string,
+ //instruments: PropTypes.arrayOf(PropTypes.string)
+};
+
+const JKPersonAvator = ({ url }) => {
+ if (url) {
+ return
;
+ } else {
+ return
;
+ }
+};
+
+export default JKPerson;
diff --git a/jam-ui/src/components/profile/JKProfileAvatar.js b/jam-ui/src/components/profile/JKProfileAvatar.js
new file mode 100644
index 000000000..a5383d5b9
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileAvatar.js
@@ -0,0 +1,15 @@
+import React from "react";
+import avatar from "../../assets/img/team/avatar.png";
+
+const JKProfileAvatar = ({url}) => {
+
+
+ if(url) {
+ return (
);
+ }else {
+ return (
);
+ }
+
+}
+
+export default JKProfileAvatar;
\ No newline at end of file
diff --git a/jam-ui/src/components/profile/JKProfileGenres.js b/jam-ui/src/components/profile/JKProfileGenres.js
new file mode 100644
index 000000000..bd3674692
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileGenres.js
@@ -0,0 +1,18 @@
+import React from "react";
+
+const JKProfileGenres = ({genres}) => {
+ let items = []
+
+ const getGenresNames = () => {
+ for(let genre of genres){
+ items.push(genre.genre_id)
+ }
+ return items.join(', ');
+ }
+
+ return (
+ {getGenresNames()}
+ );
+}
+
+export default JKProfileGenres;
\ No newline at end of file
diff --git a/jam-ui/src/components/profile/JKProfileInstrumentsList.js b/jam-ui/src/components/profile/JKProfileInstrumentsList.js
new file mode 100644
index 000000000..47b8f296b
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileInstrumentsList.js
@@ -0,0 +1,24 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const JKPersonInstrumentsList = ({ instruments }) => {
+ const proficiencies = {
+ '1': 'Beginner',
+ '2': 'Intermediate',
+ '3': 'Expert'
+ };
+ return (
+ instruments &&
+ instruments.map(instrument => (
+
+ {instrument.description}: {proficiencies[instrument.proficiency_level]}
+
+ ))
+ );
+};
+
+JKPersonInstrumentsList.propTypes = {
+ instruments: PropTypes.arrayOf(PropTypes.object)
+}
+
+export default JKPersonInstrumentsList
\ No newline at end of file
diff --git a/jam-ui/src/components/profile/JKProfileInterests.js b/jam-ui/src/components/profile/JKProfileInterests.js
new file mode 100644
index 000000000..a7ed7cc49
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileInterests.js
@@ -0,0 +1,167 @@
+import React, { useEffect, useState } from 'react';
+import { titleize } from '../../helpers/utils';
+
+const JKProfileInterests = ({ user }) => {
+ const [freeSessionGenres, setFreeSessionGenres] = useState([]);
+ const [paidSessionGenres, setPaidSessionGenres] = useState([]);
+ const [traditionalBandSessionGenres, setTraditionalBandSessionGenres] = useState([]);
+ const [virtualBandSessionGenres, setVirtualBandSessionGenres] = useState([]);
+ const [coWritingSessionGenres, setCoWritingSessionGenres] = useState([]);
+
+ const { genres } = user;
+
+ const USER_TYPE = 'JamRuby::User';
+
+ // genre types
+ var PROFILE_GENRE_TYPE = 'profile';
+ var VIRTUAL_BAND_GENRE_TYPE = 'virtual_band';
+ var TRADITIONAL_BAND_GENRE_TYPE = 'traditional_band';
+ var PAID_SESSION_GENRE_TYPE = 'paid_sessions';
+ var FREE_SESSION_GENRE_TYPE = 'free_sessions';
+ var COWRITING_GENRE_TYPE = 'cowriting';
+
+ const init = () => {
+ if (user.paid_sessions) {
+ const filteredGenres = genres.filter(genre => {
+ return genre.player_type === USER_TYPE && genre.genre_type === PAID_SESSION_GENRE_TYPE;
+ });
+ setPaidSessionGenres(filteredGenres);
+ }
+
+ if (user.free_sessions) {
+ const filteredGenres = genres.filter(genre => {
+ return genre.player_type === USER_TYPE && genre.genre_type === FREE_SESSION_GENRE_TYPE;
+ });
+ setFreeSessionGenres(filteredGenres);
+ }
+
+ if (user.cowriting) {
+ const filteredGenres = genres.filter(genre => {
+ return genre.player_type === USER_TYPE && genre.genre_type === COWRITING_GENRE_TYPE;
+ });
+ setCoWritingSessionGenres(filteredGenres);
+ }
+
+ if (user.traditional_band) {
+ const filteredGenres = genres.filter(genre => {
+ return genre.player_type === USER_TYPE && genre.genre_type === TRADITIONAL_BAND_GENRE_TYPE;
+ });
+ setTraditionalBandSessionGenres(filteredGenres);
+ }
+
+ if (user.virtual_band) {
+ const filteredGenres = genres.filter(genre => {
+ return genre.player_type === USER_TYPE && genre.genre_type === VIRTUAL_BAND_GENRE_TYPE;
+ });
+ setVirtualBandSessionGenres(filteredGenres);
+ }
+ };
+
+ useEffect(() => {
+ init();
+ }, []);
+
+ return (
+
+ {user.paid_sessions &&
}
+
+ {user.free_sessions &&
}
+
+ {user.cowriting &&
}
+
+ {user.traditional_band &&
}
+
+ {user.virtual_band &&
}
+
+
+ );
+};
+
+const FreeSessionInterests = ({ genres }) => {
+ const genresList = genres.map(genre => titleize(genre.genre_id)).join(', ');
+
+ return (
+
+
I'm interested in playing free gigs
+
+ - Genre(s): {genres.length > 0 ? genresList : 'Not specified'}
+
+
+ );
+};
+
+const PaidSessionInterests = ({ genres, hourlyRate, dailyRate }) => {
+ const genresList = genres.map(genre => titleize(genre.genre_id)).join(', ');
+
+ return (
+
+
I'm interested in playing paid gigs
+
+ - Genre(s): {genres.length > 0 ? genresList : 'Not specified'}
+ - Horly rate: {hourlyRate ? hourlyRate : 'Not specified'}
+ - Daily rate: {dailyRate ? dailyRate : 'Not specified'}
+
+
+ );
+};
+
+const TraditioalBandSessionInterests = ({ genres, commitment, touring }) => {
+ const genresList = genres.map(genre => titleize(genre.genre_id)).join(', ');
+ const bandCommitmentMap = {
+ "1": "infrequent",
+ "2": "once a week",
+ "3": "2-3 times a week",
+ "4": "4+ times a week"
+ };
+ const canTour = touring ? "Yes" : (canTour === false ? "No" : 'Not specified')
+
+ return (
+
+
I'm interested in forming traditional band(s)
+
+ - Genre(s): {genres.length > 0 ? genresList : 'Not specified'}
+ - Commitment: {commitment ? bandCommitmentMap[commitment] : 'Not specified' }
+ - Touring: {canTour}
+
+
+ );
+};
+
+const VirtualBandSessionInterests = ({ genres, commitment }) => {
+ const genresList = genres.map(genre => titleize(genre.genre_id)).join(', ');
+ const bandCommitmentMap = {
+ "1": "infrequent",
+ "2": "once a week",
+ "3": "2-3 times a week",
+ "4": "4+ times a week"
+ };
+
+ return (
+
+
I'm interested in forming virtual band(s)
+
+ - Genre(s): {genres.length > 0 ? genresList : 'Not specified'}
+ - Commitment: {commitment ? bandCommitmentMap[commitment] : 'Not specified' }
+
+
+ );
+};
+
+const CoWritingSessionInterests = ({ genres, purpose }) => {
+ const genresList = genres.map(genre => titleize(genre.genre_id)).join(', ');
+ const purposeMap = {
+ "1": "just for fun",
+ "2": "sell music"
+ }
+ return (
+
+
I'm interested in co-writing - {purpose}
+
+ - Genre(s): {genres.length > 0 ? genresList : 'Not specified'}
+ - Purpose: {purpose ? purposeMap[purpose] : 'Not specified'}
+
+
+ );
+};
+
+export default JKProfileInterests;
diff --git a/jam-ui/src/components/profile/JKProfileOnlinePresence.js b/jam-ui/src/components/profile/JKProfileOnlinePresence.js
new file mode 100644
index 000000000..5454e3798
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileOnlinePresence.js
@@ -0,0 +1,57 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { titleize } from '../../helpers/utils';
+
+const JKProfileOnlinePresence = ({ onlinePresences, userId }) => {
+ const itemList = [];
+
+ const serviceUrl = item => {
+ let url;
+ switch (item.service_type) {
+ case 'soundcloud':
+ url = 'www.soundcloud.com';
+ break;
+
+ case 'reverbnation':
+ url = 'www.reverbnation.com';
+ break;
+
+ case 'bandcamp':
+ url = 'www.bandcamp.com';
+ break;
+
+ case 'fandalism':
+ url = 'www.fandalism.com';
+ break;
+
+ case 'youtube':
+ url = 'www.youtube.com';
+ break;
+
+ case 'facebook':
+ url = 'www.facebook.com';
+ break;
+
+ case 'twitter':
+ url = 'www.twitter.com';
+ break;
+ }
+ return url;
+ };
+
+
+
+ return (
+
+ {onlinePresences.map(item => (
+
+ {titleize(item.service_type)}
+
+ )).reduce((prev, curr) => [prev, ', ', curr])
+ }
+
+
+ );
+};
+
+export default JKProfileOnlinePresence;
diff --git a/jam-ui/src/components/profile/JKProfilePerformanceSamples.js b/jam-ui/src/components/profile/JKProfilePerformanceSamples.js
new file mode 100644
index 000000000..c23bf276e
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfilePerformanceSamples.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import { titleize } from '../../helpers/utils';
+
+const JKProfilePerformanceSamples = ({samples}) => {
+ const SAMPLE_TYPES = {
+ JAMKAZAM: { description: 'jamkazam' },
+ SOUNDCLOUD: { description: 'soundcloud' },
+ YOUTUBE: { description: 'youtube' }
+ };
+
+ const jamkasamSamples = samples.filter(sample => sample.service_type === SAMPLE_TYPES.JAMKAZAM.description);
+
+ const soundCloudSamples = samples.filter(sample => sample.service_type === SAMPLE_TYPES.SOUNDCLOUD.description);
+
+ const youTubeSamples = samples.filter(sample => sample.service_type === SAMPLE_TYPES.YOUTUBE.description);
+
+ return (
+
+ );
+};
+
+export default JKProfilePerformanceSamples;
diff --git a/jam-ui/src/components/profile/JKProfileSidePanel.js b/jam-ui/src/components/profile/JKProfileSidePanel.js
new file mode 100644
index 000000000..b60967c0e
--- /dev/null
+++ b/jam-ui/src/components/profile/JKProfileSidePanel.js
@@ -0,0 +1,140 @@
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import PropTypes from 'prop-types';
+import React, { useContext, useEffect } from 'react';
+import classNames from 'classnames';
+import { Modal, ModalBody, ModalHeader } from 'reactstrap';
+import ScrollBarCustom from '../common/ScrollBarCustom';
+import JKProfileAvatar from './JKProfileAvatar';
+import JKProfileInstrumentsList from './JKProfileInstrumentsList';
+import { Fragment } from 'react';
+import JKProfileOnlinePresence from './JKProfileOnlinePresence';
+import JKProfileInterests from './JKProfileInterests';
+import JKProfileGenres from './JKProfileGenres';
+import JKProfilePerformanceSamples from './JKProfilePerformanceSamples';
+
+const JKProfileSidePanel = props => {
+ const { show, setShow, user } = props;
+
+ const toggle = () => setShow(!show);
+
+ return (
+
+
+ {user && (
+
+
+
+
+ {user.name}
+
+ )}
+
+ (
+
+ )
+ }}
+ >
+
+ {user && (
+
+
+ Latency to Me: 18ms Internet + 8ms Audio{' '}
+ GOOD
+
+ Location: {`${user.city}, ${user.country}`}
+
+ Skill Level: Intermediate
+
+ Joined JamKazam: June 1, 2020
+
+ Last Active: 1 Hour Ago
+
+
+ {user.biography && user.biography.length > 0 && (
+
+
About
+
{user.biography}
+
+ )}
+
+ {user.instruments && user.instruments.length && (
+
+
+
Instruments
+
+
+ )}
+
+ {user.genres && user.genres.length > 0 && (
+
+
+
Genres
+
+
+ )}
+
+ {user.bands && user.bands.length > 0 && (
+
+
+
Bands
+ {user.bands.map(band => (
+
+
+ {band}
+
+
+ ))}
+
+ )}
+
+ { user.performance_samples && user.performance_samples.length > 0 &&
+
+
Performance Samples
+
+
+ }
+
+ {user.online_presences && user.online_presences.length > 0 && (
+
+
+
Online Presence
+
+
+ )}
+
+
+
Interests
+
+
+
+
+ Add Friend
+ {' '}
+
+ Send Message
+
+
+
+ )}
+
+
+
+ );
+};
+
+JKProfileSidePanel.propTypes = {
+ user_id: PropTypes.string
+};
+
+JKProfileSidePanel.defaultProps = {};
+
+export default JKProfileSidePanel;
diff --git a/jam-ui/src/config.js b/jam-ui/src/config.js
index f62a444ab..2677d0a93 100644
--- a/jam-ui/src/config.js
+++ b/jam-ui/src/config.js
@@ -2,7 +2,7 @@ export const version = '2.10.2';
export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint
export const topNavbarBreakpoint = 'lg';
export const settings = {
- isFluid: false,
+ isFluid: true,
isRTL: false,
isDark: false,
isTopNav: false,
diff --git a/jam-ui/src/context/AuthContext.js b/jam-ui/src/context/AuthContext.js
new file mode 100644
index 000000000..408907f97
--- /dev/null
+++ b/jam-ui/src/context/AuthContext.js
@@ -0,0 +1,16 @@
+import React from 'react'
+
+const AuthContext = React.createContext(null)
+
+export const AuthProvider = ({ user, children}) => {
+
+ const [currentUser, setCurrentUser] = React.useState(user)
+
+ return(
+
+ {children}
+
+ )
+}
+
+export const useAuth = () => React.useContext(AuthContext)
\ No newline at end of file
diff --git a/jam-ui/src/helpers/apiFetch.js b/jam-ui/src/helpers/apiFetch.js
new file mode 100644
index 000000000..b405f6b82
--- /dev/null
+++ b/jam-ui/src/helpers/apiFetch.js
@@ -0,0 +1,62 @@
+function updateOptions(options) {
+ const defaults = {
+ mode: 'cors',
+ credentials: 'include',
+ // cache: 'no-cache',
+ // referrer: 'no-referrer',
+ // redirect: 'follow'
+ }
+
+ const update = { ...options, ...defaults };
+
+ update.headers = {
+ ...update.headers,
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json'
+ };
+
+ return update;
+}
+
+function secureFetch(path, options) {
+ const baseUrl = process.env.REACT_APP_API_BASE_URL
+ return new Promise((resolve, reject) => {
+ fetch(baseUrl + path, options).then(response => {
+ // response only can be ok in range of 2XX
+ if (response.ok) {
+ //console.log('apiFetch response', response)
+ // you can call response.json() here too if you want to return json
+ resolve(response);
+ } else {
+ //handle errors in the way you want to
+ switch (response.status) {
+ case 403:
+ console.log('apiFetch Authentication error');
+ // window.location.href = `${process.env.REACT_APP_LEGACY_BASE_URL}/signin`
+ break;
+ case 404:
+ console.log('apiFetch Object not found');
+ break;
+ case 500:
+ console.log('apiFetch Internal server error');
+ break;
+ default:
+ console.log('apiFetch Some error occured');
+ break;
+ }
+ //here you also can thorow custom error too
+ reject(response);
+ }
+ })
+ .catch(error => {
+ //it will be invoked mostly for network errors
+ //do what ever you want to do with error here
+ console.log(error);
+ reject(error);
+ });
+ });
+}
+
+export default function apiFetch(path, options) {
+ return secureFetch(path, updateOptions(options));
+}
\ No newline at end of file
diff --git a/jam-ui/src/helpers/protectedRoute.js b/jam-ui/src/helpers/protectedRoute.js
new file mode 100644
index 000000000..af0bbc71a
--- /dev/null
+++ b/jam-ui/src/helpers/protectedRoute.js
@@ -0,0 +1,17 @@
+import { useAuth } from "../context/AuthContext";
+import { Route, Redirect } from "react-router-dom";
+
+const ProtectedRoute = ({component: Component, ...rest}) => {
+ const {currentUser} = useAuth();
+ return (
+ // Show the component only when the user is logged in
+ // Otherwise, redirect the user to /login page
+ (
+ currentUser ?
+
+ :
+ )} />
+ );
+};
+
+export default ProtectedRoute;
\ No newline at end of file
diff --git a/jam-ui/src/helpers/rest.js b/jam-ui/src/helpers/rest.js
new file mode 100644
index 000000000..16744184e
--- /dev/null
+++ b/jam-ui/src/helpers/rest.js
@@ -0,0 +1,53 @@
+import { reject } from "lodash";
+import apiFetch from "./apiFetch";
+
+export const getPeople = () => {
+ return new Promise((resolve, reject) => {
+ apiFetch("/search/musicians?results=true")
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ })
+}
+
+export const getUserProfile = (id) => {
+ return new Promise((resolve, reject) => (
+ apiFetch(`/users/${id}/profile?show_teacher=true`)
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ ))
+}
+
+export const postPeopleSearch = (data) => {
+ return new Promise((resolve, reject) => {
+ apiFetch("/filter", {
+ method: 'POST',
+ body: JSON.stringify(data)
+ })
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ })
+}
+
+export const getGenres = () => {
+ return new Promise((resolve, reject) => {
+ apiFetch('/genres')
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ })
+}
+
+export const getInstruments = () => {
+ return new Promise((resolve, reject) => {
+ apiFetch('/instruments')
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ })
+}
+
+export const getCurrentUser = () => {
+ return new Promise((resolve, reject) => {
+ apiFetch('/me')
+ .then(response => resolve(response))
+ .catch(error => reject(error))
+ })
+}
\ No newline at end of file
diff --git a/jam-ui/src/helpers/utils.js b/jam-ui/src/helpers/utils.js
index 8cc515a84..cce1da7cf 100644
--- a/jam-ui/src/helpers/utils.js
+++ b/jam-ui/src/helpers/utils.js
@@ -178,6 +178,15 @@ export const getPaginationArray = (totalSize, sizePerPage) => {
export const capitalize = str => (str.charAt(0).toUpperCase() + str.slice(1)).replace(/-/g, ' ');
+export const titleize = (str) => {
+ return str.replace(
+ /\w\S*/g,
+ (txt) => {
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
+ }
+ );
+ }
+
export const routesSlicer = ({ routes, columns = 3, rows }) => {
const routesCollection = [];
routes.map(route => {
@@ -211,3 +220,4 @@ export const copyToClipBoard = textFieldRef => {
textField.select();
document.execCommand('copy');
};
+
diff --git a/jam-ui/src/index.js b/jam-ui/src/index.js
index ec0bf5a22..9e7546251 100644
--- a/jam-ui/src/index.js
+++ b/jam-ui/src/index.js
@@ -8,8 +8,8 @@ import Main from './Main';
import './helpers/initFA';
ReactDOM.render(
-
-
- ,
+
+
+ ,
document.getElementById('main')
);
diff --git a/jam-ui/src/layouts/DashboardLayout.js b/jam-ui/src/layouts/DashboardLayout.js
index d546f28ac..84c6f915e 100644
--- a/jam-ui/src/layouts/DashboardLayout.js
+++ b/jam-ui/src/layouts/DashboardLayout.js
@@ -1,8 +1,12 @@
import React, { useContext, useEffect } from 'react';
import PropTypes from 'prop-types';
-import { Route, Switch } from 'react-router-dom';
+import { Route, Switch, Redirect } from 'react-router-dom';
+
import Dashboard from '../components/dashboard/Dashboard';
-import DashboardAlt from '../components/dashboard-alt/DashboardAlt';
+import JKDashboard from '../components/dashboard/JkDashboard';
+//import DashboardAlt from '../components/dashboard-alt/DashboardAlt';
+
+
import NavbarTop from '../components/navbar/NavbarTop';
import NavbarVertical from '../components/navbar/NavbarVertical';
import Footer from '../components/footer/Footer';
@@ -12,6 +16,8 @@ import ProductProvider from '../components/e-commerce/ProductProvider';
import SidePanelModal from '../components/side-panel/SidePanelModal';
import { getPageName } from '../helpers/utils';
+import { useAuth } from '../context/AuthContext';
+
const DashboardRoutes = loadable(() => import('./DashboardRoutes'));
const DashboardLayout = ({ location }) => {
@@ -34,8 +40,10 @@ const DashboardLayout = ({ location }) => {
-
-
+
+ {/* */}
+ {/* */}
+
{!isKanban && }
@@ -46,6 +54,19 @@ const DashboardLayout = ({ location }) => {
);
};
+const ProtectedRoute = ({component: Component, ...rest}) => {
+ const {currentUser} = useAuth();
+ return (
+ // Show the component only when the user is logged in
+ // Otherwise, redirect the user to /login page
+ (
+ currentUser ?
+
+ :
+ )} />
+ );
+};
+
DashboardLayout.propTypes = { location: PropTypes.object.isRequired };
export default DashboardLayout;
diff --git a/jam-ui/src/layouts/DashboardRoutes.js b/jam-ui/src/layouts/DashboardRoutes.js
index 6b565c3e9..3abf79e40 100644
--- a/jam-ui/src/layouts/DashboardRoutes.js
+++ b/jam-ui/src/layouts/DashboardRoutes.js
@@ -1,148 +1,153 @@
+import { fn } from 'moment';
import React from 'react';
import { Redirect, Route, Switch } from 'react-router-dom';
-import Alerts from '../components/bootstrap-components/Alerts';
-import Avatar from '../components/bootstrap-components/Avatar';
-import AutocompleteExample from '../components/bootstrap-components/AutocompleteExample';
-import Backgrounds from '../components/bootstrap-components/Backgrounds';
-import Badges from '../components/bootstrap-components/Badges';
-import Breadcrumbs from '../components/bootstrap-components/Breadcrumb';
-import Buttons from '../components/bootstrap-components/Buttons';
-import Cards from '../components/bootstrap-components/Cards';
-import Carousel from '../components/bootstrap-components/Carousel';
-import Collapses from '../components/bootstrap-components/Collapses';
-import Combo from '../components/bootstrap-components/Combo';
-import CookieNotice from '../components/bootstrap-components/CookieNotice';
-import Dropdowns from '../components/bootstrap-components/Dropdowns';
-import FalconAccordions from '../components/bootstrap-components/FalconAccordions';
-import Forms from '../components/bootstrap-components/Forms';
-import ListGroups from '../components/bootstrap-components/ListGroups';
-import Modals from '../components/bootstrap-components/Modals';
-import Navbars from '../components/bootstrap-components/Navbars';
-import NavBarTop from '../components/bootstrap-components/NavBarTop';
-import Navs from '../components/bootstrap-components/Navs';
-import PageHeaders from '../components/bootstrap-components/PageHeaders';
-import Paginations from '../components/bootstrap-components/Paginations';
-import Popovers from '../components/bootstrap-components/Popovers';
-import ProgressBar from '../components/bootstrap-components/ProgressBar';
-import Sidepanel from '../components/bootstrap-components/Sidepanel';
-import Spinners from '../components/bootstrap-components/Spinners';
-import Tables from '../components/bootstrap-components/Tables';
-import Tabs from '../components/bootstrap-components/Tabs';
-import Tooltips from '../components/bootstrap-components/Tooltips';
-import VerticalNavbar from '../components/bootstrap-components/VerticalNavbar';
-import Calendar from '../components/calendar/Calendar';
-import ChangeLog from '../components/changelog/ChangeLog';
-import Chat from '../components/chat/Chat';
-import GettingStarted from '../components/documentation/GettingStarted';
-import Checkout from '../components/e-commerce/Checkout';
-import Customers from '../components/e-commerce/Customers';
-import FavouriteItems from '../components/e-commerce/FavouriteItems';
-import OrderDetails from '../components/e-commerce/OrderDetails';
-import Orders from '../components/e-commerce/Orders';
-import ProductDetails from '../components/e-commerce/ProductDetails';
-import Products from '../components/e-commerce/Products';
-import ShoppingCart from '../components/e-commerce/ShoppingCart';
-import Compose from '../components/email/Compose';
-import EmailDetail from '../components/email/EmailDetail';
-import Inbox from '../components/email/Inbox';
-import InboxProvider from '../components/email/inbox/InboxProvider';
-import Starter from '../components/extra/Starter';
-import Feed from '../components/feed/Feed';
-import Kanban from '../components/kanban/Kanban';
-import Activity from '../components/page/Activity';
-import Associations from '../components/page/Associations';
-import Billing from '../components/page/Billing';
-import CustomerDetails from '../components/page/CustomerDetails';
-import EventCreate from '../components/page/EventCreate';
-import EventDetail from '../components/page/EventDetail';
-import Events from '../components/page/Events';
-import Faq from '../components/page/Faq';
-import InvitePeople from '../components/page/InvitePeople';
-import Invoice from '../components/page/Invoice';
-import Notifications from '../components/page/Notifications';
-import People from '../components/page/People';
-import Settings from '../components/page/Settings';
-import BulkSelect from '../components/plugins/BulkSelect';
-import CalendarExample from '../components/plugins/CalendarExample';
-import Chart from '../components/plugins/Chart';
-import CodeHighlightDoc from '../components/plugins/CodeHighlightDoc';
-import CountUpExample from '../components/plugins/Countup';
-import DatetimeExample from '../components/plugins/Datetime';
-import Dropzone from '../components/plugins/Dropzone';
-import EchartMap from '../components/plugins/EchartMap';
-import Echarts from '../components/plugins/Echarts';
-import EmojiMart from '../components/plugins/EmojiMart';
-import FontAwesome from '../components/plugins/FontAwesome';
-import GoogleMapExample from '../components/plugins/GoogleMap';
-import ImageLightbox from '../components/plugins/ImageLightbox';
-import Leaflet from '../components/plugins/Leaflet';
-import Lottie from '../components/plugins/Lottie';
-import Plyr from '../components/plugins/Plyr';
-import ProgressBarJs from '../components/plugins/ProgressBarJs';
-import QuillEditorExample from '../components/plugins/Quill';
-import ReactBeautifulDnD from '../components/plugins/ReactBeautifulDnD';
-import ReactBootstrapTable2 from '../components/plugins/ReactBootstrapTable2';
-import ReactHookFrom from '../components/plugins/ReactHookFrom';
-import Scrollbar from '../components/plugins/Scrollbar';
-import Select from '../components/plugins/Select';
-import SlickCarousel from '../components/plugins/SlickCarousel';
-import Toastify from '../components/plugins/Toastify';
-import Typed from '../components/plugins/Typed';
-import Pricing from '../components/pricing/Pricing';
-import PricingAlt from '../components/pricing/PricingAlt';
-import Profile from '../components/profile/Profile';
-import Borders from '../components/utilities/Borders';
-import Clearfix from '../components/utilities/Clearfix';
-import CloseIcon from '../components/utilities/CloseIcon';
-import Colors from '../components/utilities/Colors';
-import Display from '../components/utilities/Display';
-import Embed from '../components/utilities/Embed';
-import Figures from '../components/utilities/Figures';
-import Flex from '../components/utilities/Flex';
-import Grid from '../components/utilities/Grid';
-import Sizing from '../components/utilities/Sizing';
-import Spacing from '../components/utilities/Spacing';
-import StretchedLink from '../components/utilities/StretchedLink';
-import Typography from '../components/utilities/Typography';
-import VerticalAlign from '../components/utilities/VerticalAlign';
-import Visibility from '../components/utilities/Visibility';
-import Widgets from '../components/widgets/Widgets';
+// import Alerts from '../components/bootstrap-components/Alerts';
+// import Avatar from '../components/bootstrap-components/Avatar';
+// import AutocompleteExample from '../components/bootstrap-components/AutocompleteExample';
+// import Backgrounds from '../components/bootstrap-components/Backgrounds';
+// import Badges from '../components/bootstrap-components/Badges';
+// import Breadcrumbs from '../components/bootstrap-components/Breadcrumb';
+// import Buttons from '../components/bootstrap-components/Buttons';
+// import Cards from '../components/bootstrap-components/Cards';
+// import Carousel from '../components/bootstrap-components/Carousel';
+// import Collapses from '../components/bootstrap-components/Collapses';
+// import Combo from '../components/bootstrap-components/Combo';
+// import CookieNotice from '../components/bootstrap-components/CookieNotice';
+// import Dropdowns from '../components/bootstrap-components/Dropdowns';
+// import FalconAccordions from '../components/bootstrap-components/FalconAccordions';
+// import Forms from '../components/bootstrap-components/Forms';
+// import ListGroups from '../components/bootstrap-components/ListGroups';
+// import Modals from '../components/bootstrap-components/Modals';
+// import Navbars from '../components/bootstrap-components/Navbars';
+// import NavBarTop from '../components/bootstrap-components/NavBarTop';
+// import Navs from '../components/bootstrap-components/Navs';
+// import PageHeaders from '../components/bootstrap-components/PageHeaders';
+// import Paginations from '../components/bootstrap-components/Paginations';
+// import Popovers from '../components/bootstrap-components/Popovers';
+// import ProgressBar from '../components/bootstrap-components/ProgressBar';
+// import Sidepanel from '../components/bootstrap-components/Sidepanel';
+// import Spinners from '../components/bootstrap-components/Spinners';
+// import Tables from '../components/bootstrap-components/Tables';
+// import Tabs from '../components/bootstrap-components/Tabs';
+// import Tooltips from '../components/bootstrap-components/Tooltips';
+// import VerticalNavbar from '../components/bootstrap-components/VerticalNavbar';
+// import Calendar from '../components/calendar/Calendar';
+// import ChangeLog from '../components/changelog/ChangeLog';
+// import Chat from '../components/chat/Chat';
+// import GettingStarted from '../components/documentation/GettingStarted';
+// import Checkout from '../components/e-commerce/Checkout';
+// import Customers from '../components/e-commerce/Customers';
+// import FavouriteItems from '../components/e-commerce/FavouriteItems';
+// import OrderDetails from '../components/e-commerce/OrderDetails';
+// import Orders from '../components/e-commerce/Orders';
+// import ProductDetails from '../components/e-commerce/ProductDetails';
+// import Products from '../components/e-commerce/Products';
+// import ShoppingCart from '../components/e-commerce/ShoppingCart';
+// import Compose from '../components/email/Compose';
+// import EmailDetail from '../components/email/EmailDetail';
+// import Inbox from '../components/email/Inbox';
+// import InboxProvider from '../components/email/inbox/InboxProvider';
+// import Starter from '../components/extra/Starter';
+// import Feed from '../components/feed/Feed';
+// import Kanban from '../components/kanban/Kanban';
+// import Activity from '../components/page/Activity';
+// import Associations from '../components/page/Associations';
+// import Billing from '../components/page/Billing';
+// import CustomerDetails from '../components/page/CustomerDetails';
+// import EventCreate from '../components/page/EventCreate';
+// import EventDetail from '../components/page/EventDetail';
+// import Events from '../components/page/Events';
+// import Faq from '../components/page/Faq';
+// import InvitePeople from '../components/page/InvitePeople';
+// import Invoice from '../components/page/Invoice';
+// import Notifications from '../components/page/Notifications';
+// import People from '../components/page/People';
+// import Settings from '../components/page/Settings';
+// import BulkSelect from '../components/plugins/BulkSelect';
+// import CalendarExample from '../components/plugins/CalendarExample';
+// import Chart from '../components/plugins/Chart';
+// import CodeHighlightDoc from '../components/plugins/CodeHighlightDoc';
+// import CountUpExample from '../components/plugins/Countup';
+// import DatetimeExample from '../components/plugins/Datetime';
+// import Dropzone from '../components/plugins/Dropzone';
+// import EchartMap from '../components/plugins/EchartMap';
+// import Echarts from '../components/plugins/Echarts';
+// import EmojiMart from '../components/plugins/EmojiMart';
+// import FontAwesome from '../components/plugins/FontAwesome';
+// import GoogleMapExample from '../components/plugins/GoogleMap';
+// import ImageLightbox from '../components/plugins/ImageLightbox';
+// import Leaflet from '../components/plugins/Leaflet';
+// import Lottie from '../components/plugins/Lottie';
+// import Plyr from '../components/plugins/Plyr';
+// import ProgressBarJs from '../components/plugins/ProgressBarJs';
+// import QuillEditorExample from '../components/plugins/Quill';
+// import ReactBeautifulDnD from '../components/plugins/ReactBeautifulDnD';
+// import ReactBootstrapTable2 from '../components/plugins/ReactBootstrapTable2';
+// import ReactHookFrom from '../components/plugins/ReactHookFrom';
+// import Scrollbar from '../components/plugins/Scrollbar';
+// import Select from '../components/plugins/Select';
+// import SlickCarousel from '../components/plugins/SlickCarousel';
+// import Toastify from '../components/plugins/Toastify';
+// import Typed from '../components/plugins/Typed';
+// import Pricing from '../components/pricing/Pricing';
+// import PricingAlt from '../components/pricing/PricingAlt';
+// import Profile from '../components/profile/Profile';
+// import Borders from '../components/utilities/Borders';
+// import Clearfix from '../components/utilities/Clearfix';
+// import CloseIcon from '../components/utilities/CloseIcon';
+// import Colors from '../components/utilities/Colors';
+// import Display from '../components/utilities/Display';
+// import Embed from '../components/utilities/Embed';
+// import Figures from '../components/utilities/Figures';
+// import Flex from '../components/utilities/Flex';
+// import Grid from '../components/utilities/Grid';
+// import Sizing from '../components/utilities/Sizing';
+// import Spacing from '../components/utilities/Spacing';
+// import StretchedLink from '../components/utilities/StretchedLink';
+// import Typography from '../components/utilities/Typography';
+// import VerticalAlign from '../components/utilities/VerticalAlign';
+// import Visibility from '../components/utilities/Visibility';
+// import Widgets from '../components/widgets/Widgets';
+import JKPeople from '../components/page/JKPeople';
-const InboxRoutes = ({ match: { url } }) => (
-
-
-
-
-
+// const InboxRoutes = ({ match: { url } }) => (
+//
+//
+//
+//
+//
- {/*Redirect*/}
-
-
-
-);
+// {/*Redirect*/}
+//
+//
+//
+// );
-const ProductRoutes = ({ match: { url } }) => (
-
-
-
-
-
-
-
-
-
-
+// const ProductRoutes = ({ match: { url } }) => (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
- {/*Redirect*/}
-
-
-);
+// {/*Redirect*/}
+//
+//
+// );
const DashboardRoutes = () => (
+
-
+
+
+ {/* */}
{/*Pages*/}
-
+ {/*
@@ -158,30 +163,30 @@ const DashboardRoutes = () => (
-
+ */}
{/*chat*/}
-
+ {/* */}
{/*calendar*/}
-
+ {/* */}
{/*kanban*/}
-
+ {/* */}
{/*E commerce*/}
-
+ {/* */}
{/*Email*/}
-
+ {/* */}
{/*widgets*/}
-
+ {/* */}
{/*Documentation*/}
-
+ {/* */}
{/*Changelog*/}
-
+ {/* */}
{/*Components*/}
-
+ {/*
@@ -210,10 +215,10 @@ const DashboardRoutes = () => (
-
+ */}
{/*Utilities*/}
-
+ {/*
@@ -227,10 +232,10 @@ const DashboardRoutes = () => (
-
+ */}
{/*Plugins*/}
-
+ {/*
@@ -255,11 +260,12 @@ const DashboardRoutes = () => (
-
+ */}
{/*Redirect*/}
);
+
export default DashboardRoutes;
diff --git a/jam-ui/src/layouts/Layout.js b/jam-ui/src/layouts/Layout.js
index 32234a223..c7930cf12 100644
--- a/jam-ui/src/layouts/Layout.js
+++ b/jam-ui/src/layouts/Layout.js
@@ -1,5 +1,5 @@
-import React, { useEffect } from 'react';
-import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
+import React, { useEffect, useState } from 'react';
+import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
import { toast, ToastContainer } from 'react-toastify';
import { CloseButton, Fade } from '../components/common/Toast';
@@ -7,35 +7,61 @@ import DashboardLayout from './DashboardLayout';
import ErrorLayout from './ErrorLayout';
import loadable from '@loadable/component';
+
+
const AuthBasicLayout = loadable(() => import('./AuthBasicLayout'));
-const Landing = loadable(() => import('../components/landing/Landing'));
-const WizardLayout = loadable(() => import('../components/auth/wizard/WizardLayout'));
-const AuthCardRoutes = loadable(() => import('../components/auth/card/AuthCardRoutes'));
-const AuthSplitRoutes = loadable(() => import('../components/auth/split/AuthSplitRoutes'));
+//const Landing = loadable(() => import('../components/landing/Landing'));
+//const WizardLayout = loadable(() => import('../components/auth/wizard/WizardLayout'));
+//const AuthCardRoutes = loadable(() => import('../components/auth/card/AuthCardRoutes'));
+//const AuthSplitRoutes = loadable(() => import('../components/auth/split/AuthSplitRoutes'));
const Layout = () => {
+
useEffect(() => {
AuthBasicLayout.preload();
- Landing.preload();
- WizardLayout.preload();
- AuthCardRoutes.preload();
- AuthSplitRoutes.preload();
+ //Landing.preload();
+ //WizardLayout.preload();
+ //AuthCardRoutes.preload();
+ //AuthSplitRoutes.preload();
}, []);
+
+ // async function fetchUserData(){
+ // await apiFetch('/users/current_user_data')
+ // .then(resp => {
+ // if(!resp.ok){
+ // //handle error
+ // console.log("fetchUserData failed", resp);
+ // }else{
+ // return resp.json()
+ // }
+ // })
+ // .then(json => {
+ // setCurrentUser(json)
+ // console.log("USER>>>>>>>", json);
+ // })
+ // .catch(error => console.log(error))
+ // }
return (
}>
-
-
-
-
-
-
-
-
-
+
+ {/* */}
+ {/* */}
+ {/*
+
+ */}
+
+
+
+
+
+
+
} position={toast.POSITION.BOTTOM_LEFT} />
);
};
+
+
export default Layout;
diff --git a/jam-ui/src/routes.js b/jam-ui/src/routes.js
index 6e63d80a1..6e1bef0e9 100644
--- a/jam-ui/src/routes.js
+++ b/jam-ui/src/routes.js
@@ -1,5 +1,33 @@
import { version } from './config';
+export const homeRoute = {
+ name: 'Home',
+ to: '/',
+ exact: true,
+ icon: 'home',
+}
+
+export const friendsRoute = {
+ name: 'Friends',
+ to: '/friends',
+ exact: true,
+ icon: 'users',
+}
+
+export const helpRoute = {
+ name: 'Help',
+ to: '/help',
+ exact: true,
+ icon: 'search',
+}
+
+export const legacyRoute = {
+ name: 'Legacy',
+ to: '/legacy',
+ exact: true,
+ icon: 'home',
+}
+
export const homeRoutes = {
name: 'Home',
to: '/',
@@ -68,6 +96,7 @@ export const authenticationRoutes = {
]
};
+
export const ECommerceRoutes = {
name: 'E commerce',
to: '/e-commerce',
@@ -316,18 +345,22 @@ export const utilityRoutes = {
};
export default [
- homeRoutes,
- pageRoutes,
- chatRoutes,
- kanbanRoutes,
- calenderRoutes,
- emailRoutes,
- authenticationRoutes,
- ECommerceRoutes,
- widgetsRoutes,
- componentRoutes,
- utilityRoutes,
- pluginRoutes,
- documentationRoutes,
- changelogRoutes
+ homeRoute,
+ friendsRoute,
+ helpRoute,
+ legacyRoute,
+ //homeRoutes,
+ //pageRoutes,
+ //chatRoutes,
+ //kanbanRoutes,
+ //calenderRoutes,
+ //emailRoutes,
+ //authenticationRoutes,
+ //ECommerceRoutes,
+ //widgetsRoutes,
+ //componentRoutes,
+ //utilityRoutes,
+ //pluginRoutes,
+ //documentationRoutes,
+ //changelogRoutes
];