diff --git a/client/build/asset-manifest.json b/client/build/asset-manifest.json
index 80623b0..20af219 100644
--- a/client/build/asset-manifest.json
+++ b/client/build/asset-manifest.json
@@ -1,8 +1,8 @@
{
"files": {
- "main.css": "/static/css/main.70912c2b.chunk.css",
- "main.js": "/static/js/main.fd8c2650.chunk.js",
- "main.js.map": "/static/js/main.fd8c2650.chunk.js.map",
+ "main.css": "/static/css/main.895ab0f5.chunk.css",
+ "main.js": "/static/js/main.4388b0cf.chunk.js",
+ "main.js.map": "/static/js/main.4388b0cf.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.8d7962eb.js",
"runtime-main.js.map": "/static/js/runtime-main.8d7962eb.js.map",
"static/css/2.015dc0ab.chunk.css": "/static/css/2.015dc0ab.chunk.css",
@@ -12,14 +12,14 @@
"static/js/3.8e9312c3.chunk.js.map": "/static/js/3.8e9312c3.chunk.js.map",
"index.html": "/index.html",
"static/css/2.015dc0ab.chunk.css.map": "/static/css/2.015dc0ab.chunk.css.map",
- "static/css/main.70912c2b.chunk.css.map": "/static/css/main.70912c2b.chunk.css.map",
+ "static/css/main.895ab0f5.chunk.css.map": "/static/css/main.895ab0f5.chunk.css.map",
"static/js/2.6d12aa16.chunk.js.LICENSE.txt": "/static/js/2.6d12aa16.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.8d7962eb.js",
"static/css/2.015dc0ab.chunk.css",
"static/js/2.6d12aa16.chunk.js",
- "static/css/main.70912c2b.chunk.css",
- "static/js/main.fd8c2650.chunk.js"
+ "static/css/main.895ab0f5.chunk.css",
+ "static/js/main.4388b0cf.chunk.js"
]
}
\ No newline at end of file
diff --git a/client/build/index.html b/client/build/index.html
index 9cca70d..fa50975 100644
--- a/client/build/index.html
+++ b/client/build/index.html
@@ -1 +1 @@
-
3D Shock!
\ No newline at end of file
+3D Shock!
\ No newline at end of file
diff --git a/client/build/static/css/main.70912c2b.chunk.css.map b/client/build/static/css/main.70912c2b.chunk.css.map
deleted file mode 100644
index 992b68f..0000000
--- a/client/build/static/css/main.70912c2b.chunk.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack://src/index.css","webpack://src/App.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mJAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,yEAEF,CAEA,KAEE,eAAgB,CAEhB,6BAAsB,CAAtB,qBACF,CAEA,gBANE,oBAAa,CAAb,YAAa,CAEb,WAUF,CANA,WACE,UAAW,CAEX,0BAAmB,CAAnB,kBAAmB,CACnB,qCAA8B,CAA9B,6BAEF,CC3BA,MACE,uBACF,CAEA,YACE,wBAAsC,CAAtC,qCAAsC,CACtC,gBAAiB,CACjB,oBAAa,CAAb,YAAa,CACb,6BAAsB,CAAtB,qBAAsB,CACtB,0BAAmB,CAAnB,kBAAmB,CACnB,8BAAuB,CAAvB,sBAAuB,CACvB,4BAA6B,CAC7B,UACF,CAEA,UACE,aACF,CAEA,iCACE,GACE,8BAAuB,CAAvB,sBACF,CACA,GACE,+BAAyB,CAAzB,uBACF,CACF,CAPA,yBACE,GACE,8BAAuB,CAAvB,sBACF,CACA,GACE,+BAAyB,CAAzB,uBACF,CACF,CAEA,OACE,SACF,CAEA,YACE,oBAAa,CAAb,YAAa,CACb,8BAAuB,CAAvB,sBAAuB,CACvB,sBAAe,CAAf,cAAe,CACf,WACF,CAEA,gBACE,WACF,CAEA,UACE,WACF,CAEA,cACE,eACF,CAEA,uBACE,kBAAgC,CAAhC,+BAAgC,CAChC,UAAW,CACX,WAAY,CACZ,eACF,CAEA,aACE,yBAA2B,CAC3B,eAAmB,CACnB,WACF,CAEA,WACE,kBAAgC,CAAhC,+BAAgC,CAChC,oBAAuB,CACvB,YAAa,CACb,YACF,CAEA,wBACE,cAAgB,CAChB,kBAAoB,CACpB,WAAY,CACZ,eAAiB,CACjB,wBAAyB,CACzB,qBACF,CAEA,mBACE,kBAAmB,CACnB,mBACF,CAEA,oBACE,mBACF,CAEA,iBACE,eACF,CAEA,UACE,wBAAsC,CAAtC,qCAAsC,CACtC,mBACF,CAEA,eACE,kBAAgC,CAAhC,+BAAgC,CAChC,UAAY,CACZ,eAAiB,CACjB,wBAAyB,CACzB,oBACF,CAEA,iBACE,8BAAuB,CAAvB,sBAAuB,CACvB,SAAU,CACV,gBACF,CAEA,oBACE,eAAiB,CACjB,UAAY,CACZ,iBACF,CAEA,QACE,gBACF,CAEA,SACE,aAAe,CACf,kBAAgC,CAAhC,+BACF,CAEA,aACE,oCAA6B,CAA7B,4BAA6B,CAC7B,SAAU,CACV,gBACF","file":"main.70912c2b.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}\n\nform {\n display: flex;\n max-width: 500px;\n margin: auto;\n flex-direction: column;\n}\n\nform label {\n width: 100%; \n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin: auto;\n}\n\n",":root {\n --color-primary: #282c34;\n}\n\n.App-header {\n background-color: var(--color-primary);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.error {\n color: red;\n}\n\n.photo-wall {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n margin: 2rem;\n}\n\n.dashboard-form {\n margin: auto;\n}\n\n.ant-card {\n margin: 1rem;\n}\n\n.ant-card img {\n max-width: 250px;\n}\n\n.loading-bar-container {\n background: var(--color-primary);\n width: 100%;\n height: 30px;\n min-height: 30px;\n}\n\n.loading-bar {\n transition: all 0.5s linear;\n background: #66ff66;\n height: 100%;\n}\n\n.page-head {\n background: var(--color-primary);\n color: white !important;\n margin-top: 0;\n padding: 1rem;\n}\n\n.session-toolbar button {\n margin: 0 0.5rem;\n padding: 0.5rem 1rem;\n height: 100%;\n font-weight: bold;\n text-transform: uppercase;\n letter-spacing: 0.05rem;\n}\n\n.ant-modal-content {\n border-radius: 1rem;\n padding: 0 !important;\n}\n\n.ant-modal-body img {\n border-radius: 0.5rem;\n}\n\n.ant-modal-close {\n font-weight: bold;\n}\n\n.ant-card {\n border: 1px solid var(--color-primary);\n border-radius: 0.2rem;\n}\n\n.ant-card-head {\n background: var(--color-primary);\n color: white;\n font-weight: bold;\n text-transform: uppercase;\n letter-spacing: 0.2rem;\n}\n\n.session-toolbar {\n justify-content: center;\n width: 60%;\n margin: 1rem auto;\n}\n\n.session-toolbar h3 {\n font-weight: bold;\n color: white;\n margin-right: 1rem;\n}\n\n.slider {\n margin: auto 1rem;\n}\n\n.toolbar {\n padding: 0.5rem;\n background: var(--color-primary);\n}\n\n.client-info {\n justify-content: space-around;\n width: 60%;\n margin: 1rem auto;\n}\n"]}
\ No newline at end of file
diff --git a/client/build/static/css/main.70912c2b.chunk.css b/client/build/static/css/main.895ab0f5.chunk.css
similarity index 89%
rename from client/build/static/css/main.70912c2b.chunk.css
rename to client/build/static/css/main.895ab0f5.chunk.css
index b6aec92..dfcdb3c 100644
--- a/client/build/static/css/main.70912c2b.chunk.css
+++ b/client/build/static/css/main.895ab0f5.chunk.css
@@ -1,2 +1,2 @@
-body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}form{max-width:500px;-webkit-flex-direction:column;flex-direction:column}form,form label{display:-webkit-flex;display:flex;margin:auto}form label{width:100%;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}:root{--color-primary:#282c34}.App-header{background-color:#282c34;background-color:var(--color-primary);min-height:100vh;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.error{color:red}.photo-wall{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:2rem}.dashboard-form{margin:auto}.ant-card{margin:1rem}.ant-card img{max-width:250px}.loading-bar-container{background:#282c34;background:var(--color-primary);width:100%;height:30px;min-height:30px}.loading-bar{transition:all .5s linear;background:#6f6;height:100%}.page-head{background:#282c34;background:var(--color-primary);color:#fff!important;margin-top:0;padding:1rem}.session-toolbar button{margin:0 .5rem;padding:.5rem 1rem;height:100%;font-weight:700;text-transform:uppercase;letter-spacing:.05rem}.ant-modal-content{border-radius:1rem;padding:0!important}.ant-modal-body img{border-radius:.5rem}.ant-modal-close{font-weight:700}.ant-card{border:1px solid #282c34;border:1px solid var(--color-primary);border-radius:.2rem}.ant-card-head{background:#282c34;background:var(--color-primary);color:#fff;font-weight:700;text-transform:uppercase;letter-spacing:.2rem}.session-toolbar{-webkit-justify-content:center;justify-content:center;width:60%;margin:1rem auto}.session-toolbar h3{font-weight:700;color:#fff;margin-right:1rem}.slider{margin:auto 1rem}.toolbar{padding:.5rem;background:#282c34;background:var(--color-primary)}.client-info{-webkit-justify-content:space-around;justify-content:space-around;width:60%;margin:1rem auto}
-/*# sourceMappingURL=main.70912c2b.chunk.css.map */
\ No newline at end of file
+body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}form{max-width:500px;-webkit-flex-direction:column;flex-direction:column}form,form label{display:-webkit-flex;display:flex;margin:auto}form label{width:100%;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}:root{--color-primary:#282c34}.App-header{background-color:#282c34;background-color:var(--color-primary);min-height:100vh;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.error{color:red}.photo-wall{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:2rem}.dashboard-form{margin:auto}.ant-card{margin:1rem}.ant-card img{max-width:250px}.loading-bar-container{background:#282c34;background:var(--color-primary);width:100%;height:30px;min-height:30px}.loading-bar{transition:all .5s linear;background:#6f6;height:100%}.page-head{background:#282c34;background:var(--color-primary);color:#fff!important;margin-top:0;padding:1rem}.session-toolbar button{margin:0 .5rem;padding:.5rem 1rem;height:100%;font-weight:700;text-transform:uppercase;letter-spacing:.05rem}.ant-modal-content{border-radius:1rem;padding:0!important}.ant-modal-body img{border-radius:.5rem}.ant-modal-close{font-weight:700}.ant-card{border:1px solid #282c34;border:1px solid var(--color-primary);border-radius:.2rem}.ant-card-head{background:#282c34;background:var(--color-primary);color:#fff;font-weight:700;text-transform:uppercase;letter-spacing:.2rem}.session-toolbar{-webkit-justify-content:center;justify-content:center;width:60%;margin:1rem auto}.session-toolbar h3{font-weight:700;color:#fff;margin-right:1rem}.slider{width:400px;margin:auto 1rem}.toolbar{padding:.5rem;background:#282c34;background:var(--color-primary)}.client-info{-webkit-justify-content:center;justify-content:center;width:60%;margin:1rem auto}.client-info span{margin:auto 1rem}
+/*# sourceMappingURL=main.895ab0f5.chunk.css.map */
\ No newline at end of file
diff --git a/client/build/static/css/main.895ab0f5.chunk.css.map b/client/build/static/css/main.895ab0f5.chunk.css.map
new file mode 100644
index 0000000..474a43d
--- /dev/null
+++ b/client/build/static/css/main.895ab0f5.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://src/index.css","webpack://src/App.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mJAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,yEAEF,CAEA,KAEE,eAAgB,CAEhB,6BAAsB,CAAtB,qBACF,CAEA,gBANE,oBAAa,CAAb,YAAa,CAEb,WAUF,CANA,WACE,UAAW,CAEX,0BAAmB,CAAnB,kBAAmB,CACnB,qCAA8B,CAA9B,6BAEF,CC3BA,MACE,uBACF,CAEA,YACE,wBAAsC,CAAtC,qCAAsC,CACtC,gBAAiB,CACjB,oBAAa,CAAb,YAAa,CACb,6BAAsB,CAAtB,qBAAsB,CACtB,0BAAmB,CAAnB,kBAAmB,CACnB,8BAAuB,CAAvB,sBAAuB,CACvB,4BAA6B,CAC7B,UACF,CAEA,UACE,aACF,CAEA,iCACE,GACE,8BAAuB,CAAvB,sBACF,CACA,GACE,+BAAyB,CAAzB,uBACF,CACF,CAPA,yBACE,GACE,8BAAuB,CAAvB,sBACF,CACA,GACE,+BAAyB,CAAzB,uBACF,CACF,CAEA,OACE,SACF,CAEA,YACE,oBAAa,CAAb,YAAa,CACb,8BAAuB,CAAvB,sBAAuB,CACvB,sBAAe,CAAf,cAAe,CACf,WACF,CAEA,gBACE,WACF,CAEA,UACE,WACF,CAEA,cACE,eACF,CAEA,uBACE,kBAAgC,CAAhC,+BAAgC,CAChC,UAAW,CACX,WAAY,CACZ,eACF,CAEA,aACE,yBAA2B,CAC3B,eAAmB,CACnB,WACF,CAEA,WACE,kBAAgC,CAAhC,+BAAgC,CAChC,oBAAuB,CACvB,YAAa,CACb,YACF,CAEA,wBACE,cAAgB,CAChB,kBAAoB,CACpB,WAAY,CACZ,eAAiB,CACjB,wBAAyB,CACzB,qBACF,CAEA,mBACE,kBAAmB,CACnB,mBACF,CAEA,oBACE,mBACF,CAEA,iBACE,eACF,CAEA,UACE,wBAAsC,CAAtC,qCAAsC,CACtC,mBACF,CAEA,eACE,kBAAgC,CAAhC,+BAAgC,CAChC,UAAY,CACZ,eAAiB,CACjB,wBAAyB,CACzB,oBACF,CAEA,iBACE,8BAAuB,CAAvB,sBAAuB,CACvB,SAAU,CACV,gBACF,CAEA,oBACE,eAAiB,CACjB,UAAY,CACZ,iBACF,CAEA,QACE,WAAY,CACZ,gBACF,CAEA,SACE,aAAe,CACf,kBAAgC,CAAhC,+BACF,CAEA,aACE,8BAAuB,CAAvB,sBAAuB,CACvB,SAAU,CACV,gBACF,CAEA,kBACE,gBACF","file":"main.895ab0f5.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}\n\nform {\n display: flex;\n max-width: 500px;\n margin: auto;\n flex-direction: column;\n}\n\nform label {\n width: 100%; \n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin: auto;\n}\n\n",":root {\n --color-primary: #282c34;\n}\n\n.App-header {\n background-color: var(--color-primary);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.error {\n color: red;\n}\n\n.photo-wall {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n margin: 2rem;\n}\n\n.dashboard-form {\n margin: auto;\n}\n\n.ant-card {\n margin: 1rem;\n}\n\n.ant-card img {\n max-width: 250px;\n}\n\n.loading-bar-container {\n background: var(--color-primary);\n width: 100%;\n height: 30px;\n min-height: 30px;\n}\n\n.loading-bar {\n transition: all 0.5s linear;\n background: #66ff66;\n height: 100%;\n}\n\n.page-head {\n background: var(--color-primary);\n color: white !important;\n margin-top: 0;\n padding: 1rem;\n}\n\n.session-toolbar button {\n margin: 0 0.5rem;\n padding: 0.5rem 1rem;\n height: 100%;\n font-weight: bold;\n text-transform: uppercase;\n letter-spacing: 0.05rem;\n}\n\n.ant-modal-content {\n border-radius: 1rem;\n padding: 0 !important;\n}\n\n.ant-modal-body img {\n border-radius: 0.5rem;\n}\n\n.ant-modal-close {\n font-weight: bold;\n}\n\n.ant-card {\n border: 1px solid var(--color-primary);\n border-radius: 0.2rem;\n}\n\n.ant-card-head {\n background: var(--color-primary);\n color: white;\n font-weight: bold;\n text-transform: uppercase;\n letter-spacing: 0.2rem;\n}\n\n.session-toolbar {\n justify-content: center;\n width: 60%;\n margin: 1rem auto;\n}\n\n.session-toolbar h3 {\n font-weight: bold;\n color: white;\n margin-right: 1rem;\n}\n\n.slider {\n width: 400px;\n margin: auto 1rem;\n}\n\n.toolbar {\n padding: 0.5rem;\n background: var(--color-primary);\n}\n\n.client-info {\n justify-content: center;\n width: 60%;\n margin: 1rem auto;\n}\n\n.client-info span {\n margin: auto 1rem;\n}\n"]}
\ No newline at end of file
diff --git a/client/build/static/js/main.4388b0cf.chunk.js b/client/build/static/js/main.4388b0cf.chunk.js
new file mode 100644
index 0000000..1b29e53
--- /dev/null
+++ b/client/build/static/js/main.4388b0cf.chunk.js
@@ -0,0 +1,2 @@
+(this.webpackJsonpclient=this.webpackJsonpclient||[]).push([[0],{212:function(e,t,n){},214:function(e,t,n){},387:function(e,t,n){"use strict";n.r(t);var r,a=n(0),c=n(24),s=n.n(c),i=(n(212),n(213),n(214),n(104)),o=n(29),u=n(22),l=n.n(u),p=n(30),j=n(45),d=n(391),h=n(204),b=n(392),f=n(389),x=n(395),O=n(87),m=n(57),g=n(128),v=n.n(g),w=n(117),y=n(64),k=n.n(y),S=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.next=2;break;case 2:return e.next=4,k.a.post("/api/clients",t);case 4:return n=e.sent,e.abrupt("return",n.data.client_id);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),C=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.next=2;break;case 2:return e.next=4,k.a.get("/api/clients/".concat(t));case 4:return n=e.sent,e.abrupt("return",n.data);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),N=function(){var e=Object(p.a)(l.a.mark((function e(t,n){var r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,k.a.post("/api/clients/".concat(t,"/session"),n);case 3:return r=e.sent,e.abrupt("return",r.data);case 7:return e.prev=7,e.t0=e.catch(0),h.b.error("Something went wrong, check connection with the machine"),e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e,null,[[0,7]])})));return function(t,n){return e.apply(this,arguments)}}(),T=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.get("/api/clients/".concat(t,"/session"));case 2:return n=e.sent,e.abrupt("return",n.data);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),I=function(){var e=Object(p.a)(l.a.mark((function e(t){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.delete("/api/clients/".concat(t,"/session"));case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),P=function(){var e=Object(p.a)(l.a.mark((function e(t,n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I(t);case 2:return e.next=4,N(t,n);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),D=function(){var e=Object(p.a)(l.a.mark((function e(){var t;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.get("/api/status");case 2:return t=e.sent,e.abrupt("return",t.data.status);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),F=n(7),_=function(){var e=Object(o.f)(),t=Object(a.useState)(null),n=Object(j.a)(t,2),r=n[0],c=n[1],s=d.a.useForm(),i=Object(j.a)(s,1)[0],u=function(){var t=Object(p.a)(l.a.mark((function t(n){var r;return l.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n.phone.length<10)){t.next=4;break}return h.b.error("Check all fields!"),c("Phone number needs to be a length of at least 10"),t.abrupt("return");case 4:return t.next=6,S({name:n.name,email:n.email,phone:parseInt(n.phone.replace(/\D/g,""))});case 6:r=t.sent,e.push("/sessions/".concat(r));case 8:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();return Object(F.jsxs)(w.Content,{children:[Object(F.jsx)(b.a.Title,{className:"page-head",level:3,children:"Dashboard"}),Object(F.jsx)(f.a,{}),Object(F.jsxs)(d.a,{form:i,className:"dashboard-form",onFinish:u,labelCol:{span:8},wrapperCol:{span:16},children:[Object(F.jsx)(b.a.Paragraph,{style:{textAlign:"center"},children:"Enter the name, email and phone number of the subject"}),Object(F.jsx)(v.a,{label:"name",name:"name",children:Object(F.jsx)(x.a,{minLength:3})}),Object(F.jsx)(v.a,{label:"email",name:"email",children:Object(F.jsx)(x.a,{type:"email"})}),Object(F.jsx)(v.a,{label:"phone",name:"phone",children:Object(F.jsx)(x.a,{type:"tel",minLength:10})}),Object(F.jsxs)(O.a,{justify:"space-between",children:[Object(F.jsx)(m.a,{danger:!0,onClick:function(){i.resetFields()},children:"Reset"}),Object(F.jsx)(m.a,{htmlType:"submit",type:"primary",children:"Start Session"})]}),r&&Object(F.jsx)("p",{className:"error",children:r})]})]})},E=n(396),B=n(394),L=n(390),J=function(){return Object(F.jsx)(m.a,{type:"link",style:{position:"fixed",right:20,bottom:20},onClick:function(){window.scrollTo(0,0),console.log("")},children:"\u2934\ufe0f Scroll To Top"})},W=function(e){var t=e.clientId,n=Object(a.useState)(null),r=Object(j.a)(n,2),c=r[0],s=r[1],i=Object(a.useState)(null),o=Object(j.a)(i,2),u=o[0],d=o[1],h=Object(a.useState)(JSON.parse(window.localStorage.getItem("focusPhotos")||"[]")),f=Object(j.a)(h,2),x=f[0],m=f[1];Object(a.useEffect)((function(){var e=setInterval(function(){var e=Object(p.a)(l.a.mark((function e(){var n,r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(c&&c.length>=89)){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,T(t);case 4:n=e.sent,(r=n.photos).length&&s(r);case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),250);return function(){return clearInterval(e)}}),[t,c]);var g=function(){return d(null)};if(!(null===c||void 0===c?void 0:c.length))return null;var v=c.sort((function(e,t){return e.split("_")[0].localeCompare(t.split("_")[0])})),w=c.length/89,y=v.filter((function(e){var t=e.split("_")[0];return x.includes(t)}));return Object(F.jsxs)(F.Fragment,{children:[Object(F.jsx)(E.a,{visible:!!u,onOk:g,footer:null,onCancel:g,width:"50%",children:Object(F.jsx)("img",{width:"100%",onClick:g,src:"".concat("","/output/").concat(t,"/").concat(u),alt:"large modal"})}),Object(F.jsxs)(O.a,{align:"middle",justify:"space-around",style:{display:"flex",width:"100%"},children:[Object(F.jsx)(b.a.Title,{style:{margin:"0.5rem 1rem 0.7rem"},level:3,children:"Session Pictures"}),Object(F.jsxs)(b.a.Text,{children:[c.length,"/ 89 loaded"]}),Object(F.jsx)(b.a.Text,{children:"Select Featured Photos:"}),Object(F.jsx)(B.a,{mode:"multiple",allowClear:!0,placeholder:"Please select featured",style:{width:"35%"},defaultValue:x,value:x,onChange:function(e){console.log("SEelcted",e),window.localStorage.setItem("focusPhotos",JSON.stringify(e)),m(e)},children:v.map((function(e){var t=e.split("_")[0];return Object(F.jsx)(B.a.Option,{value:t,children:t})}))})]}),Object(F.jsx)("div",{className:"loading-bar-container",children:Object(F.jsx)("div",{className:"loading-bar",style:{width:"".concat(100*w,"%"),background:"hsl(".concat(Math.floor(120*w),", 90%, 70%)")}})}),Object(F.jsx)("div",{className:"featured-photos",style:{marginTop:"2rem"},children:y.map((function(e){return Object(F.jsx)("img",{onClick:function(){return d(e)},src:"".concat("","/output/").concat(t,"/").concat(e),alt:"lol"})}))}),Object(F.jsx)("div",{className:"photo-wall",children:v.map((function(e){return Object(F.jsx)(L.a,{className:"photo",title:e.split("_")[0],children:Object(F.jsx)("img",{onClick:function(){return d(e)},src:"".concat("","/output/").concat(t,"/").concat(e),alt:"lol"})},e)}))}),Object(F.jsx)(J,{})]})},A=n(397);!function(e){e[e["Standing By..."]=0]="Standing By...",e[e["Warming Up..."]=1]="Warming Up...",e[e["Capturing Photo"]=2]="Capturing Photo",e[e["Capturing Grid"]=3]="Capturing Grid",e[e["Writing To Disk"]=4]="Writing To Disk",e[e["Downloading!"]=5]="Downloading!"}(r||(r={}));var G=["lime","gold","volcano","magenta","geekblue"],R=function(e){var t=e.poll,n=Object(a.useState)(r["Standing By..."]),c=Object(j.a)(n,2),s=c[0],i=c[1];return Object(a.useEffect)((function(){var e=setInterval(function(){var e=Object(p.a)(l.a.mark((function e(){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,D();case 4:n=e.sent,i(n);case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),250);return function(){return clearInterval(e)}}),[t]),Object(F.jsx)(A.a,{color:G[s],style:{display:"flex"},children:Object(F.jsx)("span",{style:{margin:"auto"},children:r[s]})})},V=n(398),q=n(393),U=function(e){var t=Object(o.f)(),n=e.match.params.clientId,r=Object(a.useState)(null),c=Object(j.a)(r,2),s=c[0],i=c[1],u=Object(a.useState)(!1),d=Object(j.a)(u,2),f=d[0],g=d[1],v=Object(a.useState)(parseInt(window.localStorage.getItem("lightTime")||"5000")),y=Object(j.a)(v,2),k=y[0],S=y[1],T=function(e){window.localStorage.setItem("lightTime",e.toString()),S(e)},D=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h.b.loading("Photo sequence starting! Stand by..."),e.next=3,N(n,{light_time:k});case 3:g(!0);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),_=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return g(!1),h.b.loading("Deleting photos & restarting capture sequence! Stand by..."),e.next=4,P(n,{light_time:k});case 4:g(!0);case 5:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),E=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.push("/");case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),B=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I(n);case 2:h.b.success("Photos Deleted! Going back to dashboard"),t.push("/");case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){(function(){var e=Object(p.a)(l.a.mark((function e(){var t;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,C(n);case 2:t=e.sent,i(t),t.has_photos&&g(!0);case 5:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}})()()}),[n]),Object(F.jsxs)(w.Content,{children:[Object(F.jsx)(b.a.Title,{className:"page-head",level:3,children:"Session View"}),Object(F.jsxs)(O.a,{className:"client-info",children:[Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Name:"})," ",null===s||void 0===s?void 0:s.name]}),Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Email:"})," ",null===s||void 0===s?void 0:s.email]}),Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Phone:"})," ",null===s||void 0===s?void 0:s.phone]})]}),Object(F.jsxs)("div",{className:"toolbar",children:[Object(F.jsxs)(O.a,{justify:"center",className:"session-toolbar",children:[Object(F.jsx)(m.a,{onClick:E,children:"Back To Dashboard"},"finish"),Object(F.jsx)(m.a,{disabled:f,type:"primary",onClick:D,children:"Capture"},"startsession"),Object(F.jsx)(V.a,{disabled:!f,title:"Re-capture set?",onConfirm:_,children:Object(F.jsx)(m.a,{type:"default",disabled:!f,children:"Retry Capture"})},"retry"),Object(F.jsx)(V.a,{disabled:!f,title:"Delete all photos and return to dashboard?",onConfirm:B,children:Object(F.jsx)(m.a,{danger:!0,disabled:!f,children:"Abort Session"})},"nuke"),Object(F.jsx)(R,{poll:!0})]}),Object(F.jsxs)(O.a,{className:"session-toolbar",children:[Object(F.jsx)("h3",{children:"Light Duration (ms)"}),Object(F.jsx)(q.a,{value:k,onChange:T}),Object(F.jsx)(x.a,{className:"slider",type:"range",onChange:function(e){return T(parseInt(e.target.value))},value:k,min:500,max:1e4,step:500})]})]}),Object(F.jsx)(O.a,{className:"controls",children:f&&Object(F.jsx)(W,{clientId:n})})]})};console.log("ENV","production");var M=function(){return Object(F.jsx)(i.a,{children:Object(F.jsx)("div",{className:"App",children:Object(F.jsxs)(o.c,{children:[Object(F.jsx)(o.a,{path:"/sessions/:clientId",component:U}),Object(F.jsx)(o.a,{exact:!0,path:"/",component:_})]})})})},z=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,399)).then((function(t){var n=t.getCLS,r=t.getFID,a=t.getFCP,c=t.getLCP,s=t.getTTFB;n(e),r(e),a(e),c(e),s(e)}))};s.a.render(Object(F.jsx)(M,{}),document.getElementById("root")),z()}},[[387,1,2]]]);
+//# sourceMappingURL=main.4388b0cf.chunk.js.map
\ No newline at end of file
diff --git a/client/build/static/js/main.4388b0cf.chunk.js.map b/client/build/static/js/main.4388b0cf.chunk.js.map
new file mode 100644
index 0000000..c917c1f
--- /dev/null
+++ b/client/build/static/js/main.4388b0cf.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["components/StatusChip.tsx","api/index.ts","pages/Dashboard.tsx","components/ScrollToTop.tsx","components/SessionPictures.tsx","pages/Session.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Status","createClient","body","a","axios","post","res","data","client_id","getClient","id","get","startSession","clientId","timings","message","error","getSession","killSession","delete","restartSession","getStatus","status","Dashboard","history","useHistory","useState","setError","Form","useForm","form","handleSubmit","values","phone","length","name","email","parseInt","replace","push","Title","className","level","onFinish","labelCol","span","wrapperCol","Paragraph","style","textAlign","label","minLength","type","justify","danger","onClick","resetFields","htmlType","ScrollToTop","position","right","bottom","window","scrollTo","console","log","SessionPictures","urls","setUrls","activeUrl","setActiveUrl","JSON","parse","localStorage","getItem","focusPhotos","setFocusPhotos","useEffect","interval","setInterval","photos","clearInterval","closeModal","sort","b","split","localeCompare","u","filteredPhotos","filter","num","includes","visible","onOk","footer","onCancel","width","src","alt","align","display","margin","Text","mode","allowClear","placeholder","defaultValue","value","onChange","v","setItem","stringify","map","val","Option","background","Math","floor","marginTop","title","colors","StatusChip","poll","setStatus","color","Session","props","match","params","client","setClient","active","setActive","lightTime","setLightTime","handleTimingUpdate","n","toString","handleStartSession","loading","light_time","handleRestartSession","handleExit","handleNuke","success","has_photos","disabled","onConfirm","e","target","min","max","step","process","App","path","component","exact","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.4388b0cf.chunk.js","sourcesContent":["import { Tag } from 'antd'\nimport { PresetColorType } from 'antd/lib/_util/colors'\nimport { useEffect, useState } from 'react'\nimport { getStatus } from '../api'\n\nexport enum Status {\n 'Standing By...',\n 'Warming Up...',\n 'Capturing Photo',\n 'Capturing Grid',\n 'Writing To Disk',\n 'Downloading!',\n}\n\nconst colors: Partial[] = [\n 'lime',\n 'gold',\n 'volcano',\n 'magenta',\n 'geekblue',\n]\n\ntype Props = {\n poll: boolean\n}\n\nexport const StatusChip = ({ poll }: Props) => {\n const [status, setStatus] = useState(Status['Standing By...'])\n\n useEffect(() => {\n const get = async () => {\n if (!poll) return\n const status = await getStatus()\n setStatus(status)\n }\n\n const interval = setInterval(get, 1000 / 4)\n\n return () => clearInterval(interval)\n }, [poll])\n\n return (\n \n {Status[status]}\n \n )\n}\n","import { Client, Timings } from '../types'\nimport axios from 'axios'\nimport { message } from 'antd'\nimport { Status } from '../components/StatusChip'\n\nconst dev = process.env.NODE_ENV === 'development'\n\nif (dev) {\n const host = 'http://192.168.1.114:5000'\n axios.defaults.baseURL = host\n}\n\nconst mock = false\n\nexport const createClient = async (body: Omit) => {\n if (mock) return 'test'\n const res = await axios.post<{ client_id: string }>(`/api/clients`, body)\n return res.data.client_id\n}\n\nexport const getClient = async (id: string): Promise => {\n if (mock)\n return {\n name: 'Test Client',\n has_photos: false,\n email: 'test@test.test',\n phone: 1234567890,\n }\n const res = await axios.get(`/api/clients/${id}`)\n return res.data\n}\nexport const startSession = async (clientId: string, timings: Timings) => {\n try {\n const res = await axios.post(`/api/clients/${clientId}/session`, timings)\n return res.data\n } catch (err) {\n message.error('Something went wrong, check connection with the machine')\n return err\n }\n}\n\nexport const getSession = async (clientId: string) => {\n const res = await axios.get<{ photos: string[] }>(\n `/api/clients/${clientId}/session`,\n )\n return res.data // session data\n}\n\nexport const killSession = async (clientId: string) => {\n await axios.delete(`/api/clients/${clientId}/session`)\n}\n\nexport const restartSession = async (clientId: string, timings: Timings) => {\n await killSession(clientId)\n await startSession(clientId, timings)\n}\n\n// TOOD: Get status\n\nexport const getStatus = async (): Promise => {\n const res = await axios.get<{ status: Status }>('/api/status')\n return res.data.status\n}\n\n// Someday\n\nexport const getClients = async (): Promise => {\n const res = await axios.get(`/api/clients`)\n return res.data\n}\n\nexport const cleanup = () => {\n // send\n}\n","import React from 'react'\nimport { Button, Divider, Form, Input, message, Row, Typography } from 'antd'\nimport FormItem from 'antd/lib/form/FormItem'\nimport { Content } from 'antd/lib/layout/layout'\nimport { useState } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { createClient } from '../api'\n\ntype FormData = {\n name: string\n email: string\n phone: string\n}\n\nexport const Dashboard = () => {\n const history = useHistory()\n const [error, setError] = useState(null)\n const [form] = Form.useForm()\n\n const handleReset = () => {\n form.resetFields()\n }\n\n const handleSubmit = async (values: FormData) => {\n if (values.phone.length < 10) {\n // helpful message\n message.error('Check all fields!')\n setError('Phone number needs to be a length of at least 10')\n return\n }\n\n const client_id = await createClient({\n name: values.name,\n email: values.email,\n phone: parseInt(values.phone.replace(/\\D/g, '')),\n })\n\n history.push(`/sessions/${client_id}`)\n }\n\n return (\n \n \n Dashboard\n \n \n \n \n )\n}\n","import { Button } from 'antd'\nimport React from 'react'\n\nexport const ScrollToTop = () => {\n const handleClick = () => {\n window.scrollTo(0, 0)\n console.log('')\n }\n\n return (\n \n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Card, Modal, Row, Select, Typography } from 'antd'\nimport { getSession } from '../api'\nimport { ScrollToTop } from './ScrollToTop'\n\ntype Props = {\n clientId: string\n}\n\nexport const SessionPictures = ({ clientId }: Props) => {\n const [urls, setUrls] = useState(null)\n const [activeUrl, setActiveUrl] = useState(null)\n const [focusPhotos, setFocusPhotos] = useState(\n JSON.parse(window.localStorage.getItem('focusPhotos') || '[]'),\n )\n\n useEffect(() => {\n const get = async () => {\n if (urls && urls.length >= 89 * 1) {\n return\n }\n\n const { photos } = await getSession(clientId)\n if (photos.length) setUrls(photos)\n }\n\n const interval = setInterval(get, 250)\n\n return () => clearInterval(interval)\n }, [clientId, urls])\n\n const closeModal = () => setActiveUrl(null)\n\n const host =\n process.env.NODE_ENV === 'development' ? 'http://192.168.1.107:5000' : ''\n\n if (!urls?.length) return null\n\n const photos = urls.sort((a, b) =>\n a.split('_')[0].localeCompare(b.split('_')[0]),\n )\n\n const u = urls.length / 89\n\n const handleSelect = (v: string[]) => {\n console.log('SEelcted', v)\n window.localStorage.setItem('focusPhotos', JSON.stringify(v))\n setFocusPhotos(v)\n }\n\n const filteredPhotos = photos.filter((name) => {\n const num = name.split('_')[0]\n return focusPhotos.includes(num)\n })\n\n return (\n <>\n \n \n \n \n \n Session Pictures\n \n {urls.length}/ 89 loaded\n Select Featured Photos:\n\n \n
\n\n \n \n {filteredPhotos.map((src) => (\n
setActiveUrl(src)}\n src={`${host}/output/${clientId}/${src}`}\n alt=\"lol\"\n />\n ))}\n
\n \n {photos.map((src) => (\n
\n setActiveUrl(src)}\n src={`${host}/output/${clientId}/${src}`}\n alt=\"lol\"\n />\n \n ))}\n
\n \n >\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { RouteComponentProps, useHistory } from 'react-router-dom'\nimport { getClient, killSession, restartSession, startSession } from '../api'\nimport { SessionPictures } from '../components/SessionPictures'\nimport { StatusChip } from '../components/StatusChip'\n\nimport {\n Button,\n Input,\n InputNumber,\n message,\n Popconfirm,\n Row,\n Typography,\n} from 'antd'\nimport { Content } from 'antd/lib/layout/layout'\nimport { Client } from '../types'\n\ntype Props = RouteComponentProps<{ clientId: string }>\n\nexport const Session = (props: Props) => {\n const history = useHistory()\n const { clientId } = props.match.params\n const [client, setClient] = useState(null)\n const [active, setActive] = useState(false)\n const [lightTime, setLightTime] = useState(\n parseInt(window.localStorage.getItem('lightTime') || '5000'),\n )\n\n const handleTimingUpdate = (n: number) => {\n window.localStorage.setItem('lightTime', n.toString())\n setLightTime(n)\n }\n\n const handleStartSession = async () => {\n message.loading('Photo sequence starting! Stand by...')\n await startSession(clientId, { light_time: lightTime })\n setActive(true)\n }\n\n const handleRestartSession = async () => {\n setActive(false)\n message.loading(\n 'Deleting photos & restarting capture sequence! Stand by...',\n )\n await restartSession(clientId, { light_time: lightTime })\n setActive(true)\n }\n\n const handleExit = async () => {\n history.push('/')\n }\n\n const handleNuke = async () => {\n await killSession(clientId)\n message.success('Photos Deleted! Going back to dashboard')\n history.push('/')\n }\n\n useEffect(() => {\n const get = async () => {\n const client = await getClient(clientId)\n setClient(client)\n if (client.has_photos) setActive(true)\n }\n\n get()\n }, [clientId])\n\n return (\n \n \n Session View\n \n\n \n \n Name: {client?.name}\n \n \n Email: {client?.email}\n \n \n Phone: {client?.phone}\n \n
\n \n
\n \n \n \n \n \n \n \n \n\n \n
\n
\n Light Duration (ms)
\n \n handleTimingUpdate(parseInt(e.target.value))}\n value={lightTime}\n min={500}\n max={10000}\n step={500}\n />\n
\n
\n \n {active && }\n
\n \n )\n}\n","import React from 'react'\nimport './App.css'\n\nimport { BrowserRouter, Switch, Route } from 'react-router-dom'\nimport { Dashboard } from './pages/Dashboard'\nimport { Session } from './pages/Session'\n\nconsole.log('ENV', process.env.NODE_ENV)\n\nfunction App() {\n return (\n \n \n \n \n \n \n
\n \n )\n}\n\nexport default App\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport 'antd/dist/antd.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(, document.getElementById('root'))\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/client/build/static/js/main.fd8c2650.chunk.js b/client/build/static/js/main.fd8c2650.chunk.js
deleted file mode 100644
index c940434..0000000
--- a/client/build/static/js/main.fd8c2650.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpclient=this.webpackJsonpclient||[]).push([[0],{212:function(e,t,n){},214:function(e,t,n){},387:function(e,t,n){"use strict";n.r(t);var r,a=n(0),c=n(24),s=n.n(c),i=(n(212),n(213),n(214),n(104)),o=n(29),u=n(22),l=n.n(u),p=n(30),j=n(45),d=n(391),h=n(204),b=n(392),f=n(389),x=n(395),O=n(87),m=n(57),g=n(128),v=n.n(g),w=n(117),y=n(64),k=n.n(y),S=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.next=2;break;case 2:return e.next=4,k.a.post("/api/clients",t);case 4:return n=e.sent,e.abrupt("return",n.data.client_id);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),C=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.next=2;break;case 2:return e.next=4,k.a.get("/api/clients/".concat(t));case 4:return n=e.sent,e.abrupt("return",n.data);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),T=function(){var e=Object(p.a)(l.a.mark((function e(t,n){var r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,k.a.post("/api/clients/".concat(t,"/session"),n);case 3:return r=e.sent,e.abrupt("return",r.data);case 7:return e.prev=7,e.t0=e.catch(0),h.b.error("Something went wrong, check connection with the machine"),e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e,null,[[0,7]])})));return function(t,n){return e.apply(this,arguments)}}(),N=function(){var e=Object(p.a)(l.a.mark((function e(t){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.get("/api/clients/".concat(t,"/session"));case 2:return n=e.sent,e.abrupt("return",n.data);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),I=function(){var e=Object(p.a)(l.a.mark((function e(t){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.delete("/api/clients/".concat(t,"/session"));case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),P=function(){var e=Object(p.a)(l.a.mark((function e(t,n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I(t);case 2:return e.next=4,T(t,n);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),D=function(){var e=Object(p.a)(l.a.mark((function e(){var t;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k.a.get("/api/status");case 2:return t=e.sent,e.abrupt("return",t.data.status);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),F=n(7),_=function(){var e=Object(o.f)(),t=Object(a.useState)(null),n=Object(j.a)(t,2),r=n[0],c=n[1],s=d.a.useForm(),i=Object(j.a)(s,1)[0],u=function(){var t=Object(p.a)(l.a.mark((function t(n){var r;return l.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n.phone.length<10)){t.next=4;break}return h.b.error("Check all fields!"),c("Phone number needs to be a length of at least 10"),t.abrupt("return");case 4:return t.next=6,S({name:n.name,email:n.email,phone:parseInt(n.phone.replace(/\D/g,""))});case 6:r=t.sent,e.push("/sessions/".concat(r));case 8:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();return Object(F.jsxs)(w.Content,{children:[Object(F.jsx)(b.a.Title,{className:"page-head",level:3,children:"Dashboard"}),Object(F.jsx)(b.a.Text,{children:"Enter the name, email and phone number of the subject"}),Object(F.jsx)(f.a,{}),Object(F.jsxs)(d.a,{form:i,className:"dashboard-form",onFinish:u,labelCol:{span:8},wrapperCol:{span:16},children:[Object(F.jsx)(v.a,{label:"name",name:"name",children:Object(F.jsx)(x.a,{minLength:3})}),Object(F.jsx)(v.a,{label:"email",name:"email",children:Object(F.jsx)(x.a,{type:"email"})}),Object(F.jsx)(v.a,{label:"phone",name:"phone",children:Object(F.jsx)(x.a,{type:"tel",minLength:10})}),Object(F.jsxs)(O.a,{justify:"space-between",children:[Object(F.jsx)(m.a,{danger:!0,onClick:function(){i.resetFields()},children:"Reset"}),Object(F.jsx)(m.a,{htmlType:"submit",type:"primary",children:"Start Session"})]}),r&&Object(F.jsx)("p",{className:"error",children:r})]})]})},E=n(396),B=n(394),L=n(390),J=function(){return Object(F.jsx)(m.a,{type:"link",style:{position:"fixed",right:20,bottom:20},onClick:function(){window.scrollTo(0,0),console.log("")},children:"\u2934\ufe0f Scroll To Top"})},W=function(e){var t=e.clientId,n=Object(a.useState)(null),r=Object(j.a)(n,2),c=r[0],s=r[1],i=Object(a.useState)(null),o=Object(j.a)(i,2),u=o[0],d=o[1],h=Object(a.useState)(JSON.parse(window.localStorage.getItem("focusPhotos")||"[]")),f=Object(j.a)(h,2),x=f[0],m=f[1];Object(a.useEffect)((function(){var e=setInterval(function(){var e=Object(p.a)(l.a.mark((function e(){var n,r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(c&&c.length>=89)){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,N(t);case 4:n=e.sent,(r=n.photos).length&&s(r);case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),250);return function(){return clearInterval(e)}}),[t,c]);var g=function(){return d(null)};if(!(null===c||void 0===c?void 0:c.length))return null;var v=c.sort((function(e,t){return e.split("_")[0].localeCompare(t.split("_")[0])})),w=c.length/89,y=v.filter((function(e){var t=e.split("_")[0];return x.includes(t)}));return Object(F.jsxs)(F.Fragment,{children:[Object(F.jsx)(E.a,{visible:!!u,onOk:g,footer:null,onCancel:g,width:"50%",children:Object(F.jsx)("img",{width:"100%",onClick:g,src:"".concat("","/output/").concat(t,"/").concat(u),alt:"large modal"})}),Object(F.jsxs)(O.a,{align:"middle",justify:"space-around",style:{display:"flex",width:"100%"},children:[Object(F.jsx)(b.a.Title,{style:{margin:"0.5rem 1rem 0.7rem"},level:3,children:"Session Pictures"}),Object(F.jsxs)(b.a.Text,{children:[c.length,"/ 89 loaded"]}),Object(F.jsx)(b.a.Text,{children:"Select Featured Photos:"}),Object(F.jsx)(B.a,{mode:"multiple",allowClear:!0,placeholder:"Please select featured",style:{width:"35%"},defaultValue:x,value:x,onChange:function(e){console.log("SEelcted",e),window.localStorage.setItem("focusPhotos",JSON.stringify(e)),m(e)},children:v.map((function(e){var t=e.split("_")[0];return Object(F.jsx)(B.a.Option,{value:t,children:t})}))})]}),Object(F.jsx)("div",{className:"loading-bar-container",children:Object(F.jsx)("div",{className:"loading-bar",style:{width:"".concat(100*w,"%"),background:"hsl(".concat(Math.floor(120*w),", 90%, 70%)")}})}),Object(F.jsx)("div",{className:"featured-photos",style:{marginTop:"2rem"},children:y.map((function(e){return Object(F.jsx)("img",{onClick:function(){return d(e)},src:"".concat("","/output/").concat(t,"/").concat(e),alt:"lol"})}))}),Object(F.jsx)("div",{className:"photo-wall",children:v.map((function(e){return Object(F.jsx)(L.a,{className:"photo",title:e.split("_")[0],children:Object(F.jsx)("img",{onClick:function(){return d(e)},src:"".concat("","/output/").concat(t,"/").concat(e),alt:"lol"})},e)}))}),Object(F.jsx)(J,{})]})},G=n(397);!function(e){e[e["Standing By..."]=0]="Standing By...",e[e["Warming Up..."]=1]="Warming Up...",e[e["Capturing Photo"]=2]="Capturing Photo",e[e["Capturing Grid"]=3]="Capturing Grid",e[e["Writing To Disk"]=4]="Writing To Disk",e[e["Downloading!"]=5]="Downloading!"}(r||(r={}));var R=["lime","gold","volcano","magenta","geekblue"],V=function(e){var t=e.poll,n=Object(a.useState)(r["Standing By..."]),c=Object(j.a)(n,2),s=c[0],i=c[1];return Object(a.useEffect)((function(){var e=setInterval(function(){var e=Object(p.a)(l.a.mark((function e(){var n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,D();case 4:n=e.sent,i(n);case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),250);return function(){return clearInterval(e)}}),[t]),Object(F.jsx)(G.a,{color:R[s],style:{display:"flex"},children:Object(F.jsx)("span",{style:{margin:"auto"},children:r[s]})})},q=n(398),A=n(393),U=function(e){var t=Object(o.f)(),n=e.match.params.clientId,r=Object(a.useState)(null),c=Object(j.a)(r,2),s=c[0],i=c[1],u=Object(a.useState)(!1),d=Object(j.a)(u,2),f=d[0],g=d[1],v=Object(a.useState)(parseInt(window.localStorage.getItem("lightTime")||"5000")),y=Object(j.a)(v,2),k=y[0],S=y[1],N=function(e){window.localStorage.setItem("lightTime",e.toString()),S(e)},D=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h.b.loading("Photo sequence starting! Stand by..."),e.next=3,T(n,{light_time:k});case 3:g(!0);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),_=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return g(!1),h.b.loading("Deleting photos & restarting capture sequence! Stand by..."),e.next=4,P(n,{light_time:k});case 4:g(!0);case 5:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),E=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.push("/");case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),B=function(){var e=Object(p.a)(l.a.mark((function e(){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I(n);case 2:h.b.success("Photos Deleted! Going back to dashboard"),t.push("/");case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){(function(){var e=Object(p.a)(l.a.mark((function e(){var t;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,C(n);case 2:t=e.sent,i(t),t.has_photos&&g(!0);case 5:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}})()()}),[n]),Object(F.jsxs)(w.Content,{children:[Object(F.jsx)(b.a.Title,{className:"page-head",level:3,children:"Session View"}),Object(F.jsxs)(O.a,{className:"client-info",children:[Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Name:"})," ",null===s||void 0===s?void 0:s.name]}),Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Email:"})," ",null===s||void 0===s?void 0:s.email]}),Object(F.jsxs)(b.a.Text,{children:[Object(F.jsx)("strong",{children:"Phone:"})," ",null===s||void 0===s?void 0:s.phone]})]}),Object(F.jsxs)("div",{className:"toolbar",children:[Object(F.jsxs)(O.a,{justify:"center",className:"session-toolbar",children:[Object(F.jsx)(m.a,{onClick:E,children:"Back To Dashboard"},"finish"),Object(F.jsx)(m.a,{disabled:f,type:"primary",onClick:D,children:"Capture"},"startsession"),Object(F.jsx)(q.a,{disabled:!f,title:"Re-capture set?",onConfirm:_,children:Object(F.jsx)(m.a,{type:"default",disabled:!f,children:"Retry Capture"})},"retry"),Object(F.jsx)(q.a,{disabled:!f,title:"Delete all photos and return to dashboard?",onConfirm:B,children:Object(F.jsx)(m.a,{danger:!0,disabled:!f,children:"Abort Session"})},"nuke"),Object(F.jsx)(V,{poll:!0})]}),Object(F.jsxs)(O.a,{className:"session-toolbar",children:[Object(F.jsx)("h3",{children:"Light Duration (ms)"}),Object(F.jsx)(A.a,{value:k,onChange:N}),Object(F.jsx)(x.a,{className:"slider",type:"range",onChange:function(e){return N(parseInt(e.target.value))},value:k,min:500,max:1e4,step:500})]})]}),Object(F.jsx)(O.a,{className:"controls",children:f&&Object(F.jsx)(W,{clientId:n})})]})};console.log("ENV","production");var M=function(){return Object(F.jsx)(i.a,{children:Object(F.jsx)("div",{className:"App",children:Object(F.jsxs)(o.c,{children:[Object(F.jsx)(o.a,{path:"/sessions/:clientId",component:U}),Object(F.jsx)(o.a,{exact:!0,path:"/",component:_})]})})})},z=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,399)).then((function(t){var n=t.getCLS,r=t.getFID,a=t.getFCP,c=t.getLCP,s=t.getTTFB;n(e),r(e),a(e),c(e),s(e)}))};s.a.render(Object(F.jsx)(M,{}),document.getElementById("root")),z()}},[[387,1,2]]]);
-//# sourceMappingURL=main.fd8c2650.chunk.js.map
\ No newline at end of file
diff --git a/client/build/static/js/main.fd8c2650.chunk.js.map b/client/build/static/js/main.fd8c2650.chunk.js.map
deleted file mode 100644
index 3311972..0000000
--- a/client/build/static/js/main.fd8c2650.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["components/StatusChip.tsx","api/index.ts","pages/Dashboard.tsx","components/ScrollToTop.tsx","components/SessionPictures.tsx","pages/Session.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Status","createClient","body","a","axios","post","res","data","client_id","getClient","id","get","startSession","clientId","timings","message","error","getSession","killSession","delete","restartSession","getStatus","status","Dashboard","history","useHistory","useState","setError","Form","useForm","form","handleSubmit","values","phone","length","name","email","parseInt","replace","push","Title","className","level","Text","onFinish","labelCol","span","wrapperCol","label","minLength","type","justify","danger","onClick","resetFields","htmlType","ScrollToTop","style","position","right","bottom","window","scrollTo","console","log","SessionPictures","urls","setUrls","activeUrl","setActiveUrl","JSON","parse","localStorage","getItem","focusPhotos","setFocusPhotos","useEffect","interval","setInterval","photos","clearInterval","closeModal","sort","b","split","localeCompare","u","filteredPhotos","filter","num","includes","visible","onOk","footer","onCancel","width","src","alt","align","display","margin","mode","allowClear","placeholder","defaultValue","value","onChange","v","setItem","stringify","map","val","Option","background","Math","floor","marginTop","title","colors","StatusChip","poll","setStatus","color","Session","props","match","params","client","setClient","active","setActive","lightTime","setLightTime","handleTimingUpdate","n","toString","handleStartSession","loading","light_time","handleRestartSession","handleExit","handleNuke","success","has_photos","disabled","onConfirm","e","target","min","max","step","process","App","path","component","exact","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.fd8c2650.chunk.js","sourcesContent":["import { Tag } from 'antd'\nimport { PresetColorType } from 'antd/lib/_util/colors'\nimport { useEffect, useState } from 'react'\nimport { getStatus } from '../api'\n\nexport enum Status {\n 'Standing By...',\n 'Warming Up...',\n 'Capturing Photo',\n 'Capturing Grid',\n 'Writing To Disk',\n 'Downloading!',\n}\n\nconst colors: Partial[] = [\n 'lime',\n 'gold',\n 'volcano',\n 'magenta',\n 'geekblue',\n]\n\ntype Props = {\n poll: boolean\n}\n\nexport const StatusChip = ({ poll }: Props) => {\n const [status, setStatus] = useState(Status['Standing By...'])\n\n useEffect(() => {\n const get = async () => {\n if (!poll) return\n const status = await getStatus()\n setStatus(status)\n }\n\n const interval = setInterval(get, 1000 / 4)\n\n return () => clearInterval(interval)\n }, [poll])\n\n return (\n \n {Status[status]}\n \n )\n}\n","import { Client, Timings } from '../types'\nimport axios from 'axios'\nimport { message } from 'antd'\nimport { Status } from '../components/StatusChip'\n\nconst dev = process.env.NODE_ENV === 'development'\n\nif (dev) {\n const host = 'http://192.168.1.107:5000'\n axios.defaults.baseURL = host\n}\n\nconst mock = false\n\nexport const createClient = async (body: Omit) => {\n if (mock) return 'test'\n const res = await axios.post<{ client_id: string }>(`/api/clients`, body)\n return res.data.client_id\n}\n\nexport const getClient = async (id: string): Promise => {\n if (mock)\n return {\n name: 'Test Client',\n has_photos: false,\n email: 'test@test.test',\n phone: 1234567890,\n }\n const res = await axios.get(`/api/clients/${id}`)\n return res.data\n}\nexport const startSession = async (clientId: string, timings: Timings) => {\n try {\n const res = await axios.post(`/api/clients/${clientId}/session`, timings)\n return res.data\n } catch (err) {\n message.error('Something went wrong, check connection with the machine')\n return err\n }\n}\n\nexport const getSession = async (clientId: string) => {\n const res = await axios.get<{ photos: string[] }>(\n `/api/clients/${clientId}/session`,\n )\n return res.data // session data\n}\n\nexport const killSession = async (clientId: string) => {\n await axios.delete(`/api/clients/${clientId}/session`)\n}\n\nexport const restartSession = async (clientId: string, timings: Timings) => {\n await killSession(clientId)\n await startSession(clientId, timings)\n}\n\n// TOOD: Get status\n\nexport const getStatus = async (): Promise => {\n const res = await axios.get<{ status: Status }>('/api/status')\n return res.data.status\n}\n\n// Someday\n\nexport const getClients = async (): Promise => {\n const res = await axios.get(`/api/clients`)\n return res.data\n}\n\nexport const cleanup = () => {\n // send\n}\n","import { Button, Divider, Form, Input, message, Row, Typography } from 'antd'\nimport FormItem from 'antd/lib/form/FormItem'\nimport { Content } from 'antd/lib/layout/layout'\nimport React from 'react'\nimport { useState } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { createClient } from '../api'\n\ntype FormData = {\n name: string\n email: string\n phone: string\n}\n\nexport const Dashboard = () => {\n const history = useHistory()\n const [error, setError] = useState(null)\n const [form] = Form.useForm()\n\n const handleReset = () => {\n form.resetFields()\n }\n\n const handleSubmit = async (values: FormData) => {\n if (values.phone.length < 10) {\n // helpful message\n message.error('Check all fields!')\n setError('Phone number needs to be a length of at least 10')\n return\n }\n\n const client_id = await createClient({\n name: values.name,\n email: values.email,\n phone: parseInt(values.phone.replace(/\\D/g, '')),\n })\n\n history.push(`/sessions/${client_id}`)\n }\n\n return (\n \n \n Dashboard\n \n \n Enter the name, email and phone number of the subject\n \n \n \n \n )\n}\n","import { Button } from 'antd'\nimport React from 'react'\n\nexport const ScrollToTop = () => {\n const handleClick = () => {\n window.scrollTo(0, 0)\n console.log('')\n }\n\n return (\n \n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Card, Modal, Row, Select, Typography } from 'antd'\nimport { getSession } from '../api'\nimport { ScrollToTop } from './ScrollToTop'\n\ntype Props = {\n clientId: string\n}\n\nexport const SessionPictures = ({ clientId }: Props) => {\n const [urls, setUrls] = useState(null)\n const [activeUrl, setActiveUrl] = useState(null)\n const [focusPhotos, setFocusPhotos] = useState(\n JSON.parse(window.localStorage.getItem('focusPhotos') || '[]'),\n )\n\n useEffect(() => {\n const get = async () => {\n if (urls && urls.length >= 89 * 1) {\n return\n }\n\n const { photos } = await getSession(clientId)\n if (photos.length) setUrls(photos)\n }\n\n const interval = setInterval(get, 250)\n\n return () => clearInterval(interval)\n }, [clientId, urls])\n\n const closeModal = () => setActiveUrl(null)\n\n const host =\n process.env.NODE_ENV === 'development' ? 'http://192.168.1.107:5000' : ''\n\n if (!urls?.length) return null\n\n const photos = urls.sort((a, b) =>\n a.split('_')[0].localeCompare(b.split('_')[0]),\n )\n\n const u = urls.length / 89\n\n const handleSelect = (v: string[]) => {\n console.log('SEelcted', v)\n window.localStorage.setItem('focusPhotos', JSON.stringify(v))\n setFocusPhotos(v)\n }\n\n const filteredPhotos = photos.filter((name) => {\n const num = name.split('_')[0]\n return focusPhotos.includes(num)\n })\n\n return (\n <>\n \n \n \n \n \n Session Pictures\n \n {urls.length}/ 89 loaded\n Select Featured Photos:\n\n \n
\n\n \n \n {filteredPhotos.map((src) => (\n
setActiveUrl(src)}\n src={`${host}/output/${clientId}/${src}`}\n alt=\"lol\"\n />\n ))}\n
\n \n {photos.map((src) => (\n
\n setActiveUrl(src)}\n src={`${host}/output/${clientId}/${src}`}\n alt=\"lol\"\n />\n \n ))}\n
\n \n >\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { RouteComponentProps, useHistory } from 'react-router-dom'\nimport { getClient, killSession, restartSession, startSession } from '../api'\nimport { SessionPictures } from '../components/SessionPictures'\nimport { StatusChip } from '../components/StatusChip'\n\nimport {\n Button,\n Input,\n InputNumber,\n message,\n Popconfirm,\n Row,\n Typography,\n} from 'antd'\nimport { Content } from 'antd/lib/layout/layout'\nimport { Client } from '../types'\n\ntype Props = RouteComponentProps<{ clientId: string }>\n\nexport const Session = (props: Props) => {\n const history = useHistory()\n const { clientId } = props.match.params\n const [client, setClient] = useState(null)\n const [active, setActive] = useState(false)\n const [lightTime, setLightTime] = useState(\n parseInt(window.localStorage.getItem('lightTime') || '5000'),\n )\n\n const handleTimingUpdate = (n: number) => {\n window.localStorage.setItem('lightTime', n.toString())\n setLightTime(n)\n }\n\n const handleStartSession = async () => {\n message.loading('Photo sequence starting! Stand by...')\n await startSession(clientId, { light_time: lightTime })\n setActive(true)\n }\n\n const handleRestartSession = async () => {\n setActive(false)\n message.loading(\n 'Deleting photos & restarting capture sequence! Stand by...',\n )\n await restartSession(clientId, { light_time: lightTime })\n setActive(true)\n }\n\n const handleExit = async () => {\n history.push('/')\n }\n\n const handleNuke = async () => {\n await killSession(clientId)\n message.success('Photos Deleted! Going back to dashboard')\n history.push('/')\n }\n\n useEffect(() => {\n const get = async () => {\n const client = await getClient(clientId)\n setClient(client)\n if (client.has_photos) setActive(true)\n }\n\n get()\n }, [clientId])\n\n return (\n \n \n Session View\n \n\n \n \n Name: {client?.name}\n \n \n Email: {client?.email}\n \n \n Phone: {client?.phone}\n \n
\n \n
\n \n \n \n \n \n \n \n \n\n \n
\n
\n Light Duration (ms)
\n \n handleTimingUpdate(parseInt(e.target.value))}\n value={lightTime}\n min={500}\n max={10000}\n step={500}\n />\n
\n
\n \n {active && }\n
\n \n )\n}\n","import React from 'react'\nimport './App.css'\n\nimport { BrowserRouter, Switch, Route } from 'react-router-dom'\nimport { Dashboard } from './pages/Dashboard'\nimport { Session } from './pages/Session'\n\nconsole.log('ENV', process.env.NODE_ENV)\n\nfunction App() {\n return (\n \n \n \n \n \n \n
\n \n )\n}\n\nexport default App\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport 'antd/dist/antd.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(, document.getElementById('root'))\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/client/src/App.css b/client/src/App.css
index efd0a95..6a04267 100644
--- a/client/src/App.css
+++ b/client/src/App.css
@@ -117,6 +117,7 @@
}
.slider {
+ width: 400px;
margin: auto 1rem;
}
@@ -126,7 +127,11 @@
}
.client-info {
- justify-content: space-around;
+ justify-content: center;
width: 60%;
margin: 1rem auto;
}
+
+.client-info span {
+ margin: auto 1rem;
+}
diff --git a/client/src/api/index.ts b/client/src/api/index.ts
index 305091c..128b053 100644
--- a/client/src/api/index.ts
+++ b/client/src/api/index.ts
@@ -6,7 +6,7 @@ import { Status } from '../components/StatusChip'
const dev = process.env.NODE_ENV === 'development'
if (dev) {
- const host = 'http://192.168.1.107:5000'
+ const host = 'http://192.168.1.114:5000'
axios.defaults.baseURL = host
}
diff --git a/client/src/pages/Dashboard.tsx b/client/src/pages/Dashboard.tsx
index 8a8d5c0..498d3e4 100644
--- a/client/src/pages/Dashboard.tsx
+++ b/client/src/pages/Dashboard.tsx
@@ -1,7 +1,7 @@
+import React from 'react'
import { Button, Divider, Form, Input, message, Row, Typography } from 'antd'
import FormItem from 'antd/lib/form/FormItem'
import { Content } from 'antd/lib/layout/layout'
-import React from 'react'
import { useState } from 'react'
import { useHistory } from 'react-router-dom'
import { createClient } from '../api'
@@ -43,9 +43,6 @@ export const Dashboard = () => {
Dashboard
-
- Enter the name, email and phone number of the subject
-