From 6b76d55bb928d8f31eb449d2251741587b124285 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Fri, 21 Feb 2020 17:01:43 -0500 Subject: [PATCH 001/822] forgot to save file before doing pull request --- src/App.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/App.js b/src/App.js index 3952b38..84e8d17 100644 --- a/src/App.js +++ b/src/App.js @@ -1,18 +1,8 @@ -<<<<<<< HEAD -import React from 'react'; -import { Route, Link, Switch } from 'react-router-dom'; -import Dashboard from './components/dashboard/index.js'; -// import Login from './auth/Login'; -// import Register from './auth/Register'; - - -======= import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; ->>>>>>> 9ab2f27c2aea4c8f5f4c4283f949fb6712029fde function App() { return ( From 0532d1285fdf099f26a0a4604b9d3e97c2184914 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Fri, 21 Feb 2020 17:07:23 -0500 Subject: [PATCH 002/822] took away the button, not needed, added margin left --- src/components/dashboard/dash.scss | 6 +++--- src/components/dashboard/index.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 5818bd4..810a13b 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -113,7 +113,7 @@ flex-wrap: wrap; margin-top: -100px; margin-bottom: -170px; - + margin-left: 200px; .form-directions{ @@ -128,11 +128,11 @@ } #zip-input{ - margin-right: 10px; + margin-left: 400px; width: 400px; height: 40px; font-size: 1.3rem; - padding-left: 10px; + padding-left: 100px; font-family: Roboto; background-color: lightBlack; &:hover{ diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index dc3e2c9..62a0fa4 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -35,7 +35,7 @@ const Dashboard = () => { /> - + {/* */}

upload your letterboxd csv file here to get unique movie recommendations

From 173e04d0e0eb25222b37357ddfdf2b55aa7c614a Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Fri, 21 Feb 2020 17:48:44 -0500 Subject: [PATCH 003/822] changed the p tag to be farther to right --- src/components/dashboard/dash.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 810a13b..75606da 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -123,7 +123,7 @@ visibility: hidden; text-align: center; transition: .5s; - margin-left:620px; + margin-left:920px; height: 100px; } From f76e32ebf287dfe1ab476ff104349d51e6a6d08a Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 21 Feb 2020 17:52:44 -0500 Subject: [PATCH 004/822] styling, text quote and login box --- src/components/auth/login.js | 110 ++++++++++++++++++--------------- src/components/auth/login.scss | 97 ++++++++++++++++------------- 2 files changed, 115 insertions(+), 92 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index d528473..a6001a2 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -46,62 +46,71 @@ loginUser = e => { return (
- -
-

Your movies,
your way.

- - {/*
picture
-
Groa Helps
*/} + {/* Container - ENTIRE PAGE */} +
+
+
Logo
+
Register
+ + {/*
+ +

Your movies,
your way.

+ +
picture
+
Groa Helps
+
*/} -
-

Log in

- + +

Log in

- - -

or

+ - {/* USER NAME */} - - {/* PASSWORD */} - -
+ + +
+ +
Remember me
+
Forgot password?
+
-
-

Remember me

-

Forgot password?

-
- +

or

- -
-
-
+ {/* USER NAME */} + + {/* PASSWORD */} + + + + + + +
+
) }; } @@ -118,3 +127,4 @@ export default connect( mapStateToProps, {loginAction} )(LoginPage); + diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 685b8fa..290dfd1 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -1,53 +1,62 @@ //BACKGROUND - App2 -.App2{ +.LoginPage{ + display: flex; + justify-content: space-between; + padding: 3%; min-height: 100vh; background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); } -.Logo{ - color: white; - font-size: 200%; - padding: 2%; +.container{ border: 2px solid red; - width: 100px; + width: 100%; } -.textMottoBoxes{ +.bartop{ + display: flex; + justify-content: space-between; + border: 2px solid orange; + height: 100px; + + .Logo{ + color: white; + font-size: 200%; + padding: 2%; + border: 2px solid red; + } + .Register{ + color: white; + border: 2px solid red; + } +} + +.Middle{ color: white; font-size: 250%; //width: 500px; //margin-right: 15%; border: 2px solid blue; -} -.box1{ - background:rgb(97, 97, 97); - + .box1{ + background:rgb(97, 97, 97); + + width: 407px; + height: 436px; + } + .box2{ + background: #C4C4C4; width: 407px; - height: 436px; -} -.box2{ - background: #C4C4C4; - width: 407px; - height: 288px; -} - - + height: 288px; + } -//////////////////////////////////////// + -// Login Form -.LoginPage{ - display: flex; - //justify-content: space-evenly; - justify-content: space-between; - border: 2px solid green; - padding: 2%; } +// Login Form .LoginForm{ display: flex; flex-direction: column; @@ -55,48 +64,52 @@ border: 2px solid blue; width:518px; height:527px; background: #FFFFFF; - border: 2px solid red; } - .textlogin{ margin: 2% 8% 2% 8%; } + +//TEXT REMEMBER, FORGOT PASSWORD? +.text{ + display: flex; + justify-content: space-evenly; + // border: 2px solid blue; +} + .textOr{ -border: 2px solid green; display: flex; justify-content: center; +//border: 2px solid green; } +.Checkbox{ +width: 20px; +height: 20px; +} +//input fields .input1{ padding: 7px; margin: 2% 12% 2% 12%; - background:#C4C4C4; } - .input2{ padding: 7px; margin: 2% 12% 2% 12%; - // background:#C4C4C4; + //background:red; + color: white; + // background:#7A7A7A; } -.Bottom{ - display: flex; - border: 2px solid red; - .textBot{ - border: 2px solid blue; - } - .BtnLogin{ width: 115px; height:36px; background:#7A7A7A; color: white; border-radius: 4px; + } -} From 800ded8a26d09aeef50a7fa30d9a22940dd2014d Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 21 Feb 2020 19:06:55 -0500 Subject: [PATCH 005/822] styling still --- src/components/auth/login.js | 106 +++++++++++++++-------------- src/components/auth/login.scss | 117 ++++++++++++++++++++------------- 2 files changed, 124 insertions(+), 99 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index a6001a2..df15ff9 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -53,64 +53,62 @@ loginUser = e => {
Register
- {/*
+
+
+ +

Your movies,
your way.

-

Your movies,
your way.

- -
picture
-
Groa Helps
-
*/} - -
-

Log in

- - - - - -
- -
Remember me
-
Forgot password?
+ {/*
picture
+
Groa Helps
*/}
-

or

- - {/* USER NAME */} - - {/* PASSWORD */} - - - - - -
-
+
+

Log in

+ + + + + +
+
+ +
+
Remember me
+
Forgot password?
+
+ +

or

+ + {/* Log in Google */} + + {/* Log in Facebook */} + + {/* Log in Reddit */} + + +
+ +
+ +
+
+ {/* END MIDDLE */} + {/* END CONTAINER */} + + // END LOGIN PAGE ) }; } diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 290dfd1..58f61d2 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -18,53 +18,56 @@ display: flex; justify-content: space-between; border: 2px solid orange; - height: 100px; + height: 110px; .Logo{ color: white; font-size: 200%; padding: 2%; - border: 2px solid red; + // border: 2px solid red; } .Register{ color: white; - border: 2px solid red; + padding: 3%; + // border: 2px solid red; } } .Middle{ -color: white; -font-size: 250%; -//width: 500px; -//margin-right: 15%; -border: 2px solid blue; - - .box1{ - background:rgb(97, 97, 97); - - width: 407px; - height: 436px; - } - .box2{ - background: #C4C4C4; - width: 407px; - height: 288px; - } - - - + display: flex; + justify-content: space-evenly; + + .boxLeft{ + color: white; + font-size: 250%; + //width: 500px; + //margin-right: 15%; + border: 2px solid blue; + + // .box1{ + // background:rgb(97, 97, 97); + + // width: 407px; + // height: 436px; + // } + // .box2{ + // background: #C4C4C4; + // width: 407px; + // height: 288px; + // } + } } -// Login Form -.LoginForm{ - display: flex; - flex-direction: column; - //justify-content: center; - width:518px; - height:527px; - background: #FFFFFF; -} +//////// Login Form ///////////////// + .LoginForm{ + display: flex; + flex-direction: column; + //justify-content: center; + width:518px; + height:589px; + background: #FFFFFF; + } .textlogin{ margin: 2% 8% 2% 8%; @@ -74,7 +77,17 @@ border: 2px solid blue; .text{ display: flex; justify-content: space-evenly; - // border: 2px solid blue; + border: 2px solid lightblue; + + .CheckBoxContainer{ + padding-top: 15px; + } + + .Checkbox{ + width: 20px; + height: 20px; + } + } .textOr{ @@ -83,15 +96,14 @@ justify-content: center; //border: 2px solid green; } -.Checkbox{ -width: 20px; -height: 20px; -} + //input fields .input1{ padding: 7px; margin: 2% 12% 2% 12%; + border: 1px solid black; + border-radius: 4px; } .input2{ @@ -102,14 +114,29 @@ height: 20px; // background:#7A7A7A; } +.BtnContainer{ +display: flex; +justify-content: flex-end; +// border: 2px solid red; - .BtnLogin{ - width: 115px; - height:36px; - background:#7A7A7A; - color: white; - border-radius: 4px; - - } +} + + +.BtnLoginWith{ + margin: 1% 12% 3% 12%; + padding: 8px; + background:#7A7A7A; + border-radius: 4px; + color: white; +} + +.BtnLogin{ + margin: 4% 12% 0 0; + width: 115px; + height:36px; + background:#21242C; + color: white; + border-radius: 4px; +} From bb227b7a93a1cfa45861071b3db0887bbf9fdb50 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:23:51 -0500 Subject: [PATCH 006/822] almost have styling for login done --- src/components/auth/login.js | 21 +++++--- src/components/auth/login.scss | 97 ++++++++++++++++++++++------------ 2 files changed, 78 insertions(+), 40 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index df15ff9..ee1e692 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -49,19 +49,26 @@ loginUser = e => { {/* Container - ENTIRE PAGE */}
-
Logo
-
Register
+ +
Logo
+
Register
+
- -

Your movies,
your way.

+

Your movies,
your way.

- {/*
picture
-
Groa Helps
*/} +
+
+ +
Groa Helps you pick the perfect film,
+
So you can save your popcorn for the good stuff.
+ +
+

Log in

@@ -103,6 +110,8 @@ loginUser = e => {
+
+ {/* END BOX RIGHT */}
{/* END MIDDLE */}
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 58f61d2..5e46e12 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -3,72 +3,101 @@ .LoginPage{ display: flex; justify-content: space-between; - padding: 3%; + padding: 0 3% 0 0; min-height: 100vh; background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); } .container{ - border: 2px solid red; + //border: 2px solid red; width: 100%; } .bartop{ display: flex; justify-content: space-between; - border: 2px solid orange; + padding: 0 0 0 3%; + //border: 2px solid orange; height: 110px; - .Logo{ - color: white; - font-size: 200%; - padding: 2%; - // border: 2px solid red; - } - .Register{ - color: white; - padding: 3%; - // border: 2px solid red; + + .Logo{ + color: white; + padding-top: 3%; + border: 2px solid red; + } + .Register{ + color: white; + //padding-top: 3%; + border: 2px solid red; + } } -} + .Middle{ display: flex; - justify-content: space-evenly; + //justify-content: space-around; + // justify-content: space-evenly; + //border: 3px solid yellow; - +//Text Motto .boxLeft{ color: white; - font-size: 250%; - //width: 500px; - //margin-right: 15%; - border: 2px solid blue; - - // .box1{ - // background:rgb(97, 97, 97); - - // width: 407px; - // height: 436px; - // } - // .box2{ - // background: #C4C4C4; - // width: 407px; - // height: 288px; - // } + font-size: 300%; + //border: 4px solid blue; + width: 50%; + //padding: 5px 5px 0 5px; + + .Text{ + margin: 0 0 0 13%; + border: 2px solid red; } + + + } + .box1{ + margin: -12% 2% 2% 0; + background:rgb(97, 97, 97); + width: 407px; + height: 436px; + } + .box2{ + margin: -30% 0 0 27%; + color: black; + background: #C4C4C4; + width: 407px; + height: 288px; + + .h6text{ + padding: 0 5% 0 5%; + border: 2px solid rgb(183, 0, 255); + } + + + } + } -//////// Login Form ///////////////// +.boxRight{ + border: 4px solid green; + width: 50%; + display: flex; + justify-content: flex-end; + + //////// Login Form ///////////////// .LoginForm{ display: flex; flex-direction: column; - //justify-content: center; width:518px; height:589px; background: #FFFFFF; } +} + + + .textlogin{ margin: 2% 8% 2% 8%; } From f779ce76aa844884a755cc79b5bdff363ef907e5 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Sat, 22 Feb 2020 18:26:18 -0500 Subject: [PATCH 007/822] zip uploading functional --- src/components/dashboard/dash.scss | 4 ++- src/components/dashboard/index.js | 45 +++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 75606da..c04f75c 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -142,7 +142,9 @@ } #submit-button{ - margin:auto; + margin:0px; + margin-bottom:400px; + margin-left: 350px; height: 40px; width: 100px; font-size: 1.2rem; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 62a0fa4..9cbcbb9 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,6 +1,6 @@ import React, {useState} from 'react'; import './dash.scss' - +import axios from 'axios'; const Dashboard = () => { @@ -10,11 +10,37 @@ const Dashboard = () => { // ...input, // [e.target.name]:e.target.value // }) + let data = new FormData() console.log(e.target.files[0]) + + setInput(e.target.files[0]) + data.append('movies', e.target.files[0] , e.target.files[0].name) + axios.post('http://localhost:4000/api/users/upload', data,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + }).catch(err => { + console.log(err) + }) + } const handleSubmit = e => { e.preventDefault(); console.log(input); + + axios.post('http://localhost:4000/api/users/upload', input,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + }).catch(err => { + console.log(err) + }) } @@ -23,19 +49,30 @@ const Dashboard = () => {

Welcome to the dashboard.

-
+ - {/* */} + +

upload your letterboxd csv file here to get unique movie recommendations

From b1c36668a9705ef21be89f9307a63357521273f7 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Sun, 23 Feb 2020 19:27:02 -0500 Subject: [PATCH 008/822] minor changes --- src/components/dashboard/dash.scss | 15 ++++++---- src/components/dashboard/index.js | 47 +++++++++--------------------- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index c04f75c..5debc05 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -74,6 +74,7 @@ width: 100px; height: 200px; margin: auto; + margin-top: 40px; h2{ margin-left: -50px; font-size: 1rem; @@ -92,6 +93,7 @@ } .checkboxes{ margin-left: -50px; + width: 150px; height: 120px; // border: 1px solid red; @@ -123,12 +125,12 @@ visibility: hidden; text-align: center; transition: .5s; - margin-left:920px; + margin-right: 50px; height: 100px; } #zip-input{ - margin-left: 400px; + margin-left: 600px; width: 400px; height: 40px; font-size: 1.3rem; @@ -142,12 +144,15 @@ } #submit-button{ - margin:0px; - margin-bottom:400px; - margin-left: 350px; + // margin:0px; + display:none; + margin-top: -200px; + // margin-bottom:600px; + margin-left: 490px; height: 40px; width: 100px; font-size: 1.2rem; + border-radius:1.3rem; &:hover{ box-shadow: -5px 0px 30px white; transition: 0.2s; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 9cbcbb9..8676333 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -4,18 +4,18 @@ import axios from 'axios'; const Dashboard = () => { - const [input, setInput] = useState({file:''}) + const changeHandler = e => { - // setInput({ - // ...input, - // [e.target.name]:e.target.value - // }) + + e.preventDefault(); let data = new FormData() - console.log(e.target.files[0]) - - setInput(e.target.files[0]) + + data.append('movies', e.target.files[0] , e.target.files[0].name) - axios.post('http://localhost:4000/api/users/upload', data,{ + + console.log('data', data) + //change user/1/ to be :id number + axios.post('http://localhost:4000/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -25,23 +25,12 @@ const Dashboard = () => { }).catch(err => { console.log(err) }) - + + } const handleSubmit = e => { e.preventDefault(); - console.log(input); - axios.post('http://localhost:4000/api/users/upload', input,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - }).catch(err => { - console.log(err) - }) - } @@ -51,13 +40,6 @@ const Dashboard = () => {
{ type='file' placeholder='letterbox csv file here' name = 'movies' - value={input.movieName} onChange={changeHandler} - + value = "" /> - - + +

upload your letterboxd csv file here to get unique movie recommendations

From 749fbdb946c1adef953108770b3fca41a4f5137b Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Sun, 23 Feb 2020 19:53:34 -0500 Subject: [PATCH 009/822] minor changes --- src/components/dashboard/dash.scss | 4 ++-- src/components/dashboard/index.js | 36 +++++++++++++++++------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 5debc05..c3a8048 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -121,11 +121,11 @@ .form-directions{ width: 200px; margin: 20px auto; - margin-top: -175px; + margin-top: -75px; visibility: hidden; text-align: center; transition: .5s; - margin-right: 50px; + margin-right: -500px; height: 100px; } diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 8676333..cc414a3 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -4,18 +4,13 @@ import axios from 'axios'; const Dashboard = () => { - + const [input, setInput] = useState({file:''}) const changeHandler = e => { - e.preventDefault(); let data = new FormData() - - data.append('movies', e.target.files[0] , e.target.files[0].name) - - console.log('data', data) //change user/1/ to be :id number - axios.post('http://localhost:4000/api/users/1/upload', data,{ + axios.post('http://localhost:4000/api/users/2/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -25,12 +20,24 @@ const Dashboard = () => { }).catch(err => { console.log(err) }) - - + data = new FormData() + } const handleSubmit = e => { e.preventDefault(); - + console.log(input); + //change user/1/ to be :id number handle submit currently does + axios.post('http://localhost:4000/api/users/1/upload', input,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + }).catch(err => { + console.log(err) + }) + } @@ -38,9 +45,7 @@ const Dashboard = () => {

Welcome to the dashboard.

-
{ type='file' placeholder='letterbox csv file here' name = 'movies' + value={input.movieName} // im not sure why this works but it does. onChange={changeHandler} - value = "" + /> - +

upload your letterboxd csv file here to get unique movie recommendations

From 4b5c718dca142583abfbd7124021ff6cbe0b1e7d Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 24 Feb 2020 05:23:31 -0500 Subject: [PATCH 010/822] infinite scroll --- src/components/dashboard/dash.scss | 16 ++++++++-- src/components/dashboard/index.js | 48 ++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index c3a8048..ad51a6d 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -8,6 +8,13 @@ display:flex; flex-direction: column; justify-content: space-around; + overflow-y: hidden; + overflow: scroll; + background-size: contain; + + // overflow-x: hidden; + outline: solid black 1px !important; + .h2-p{ width: 50%; @@ -15,8 +22,10 @@ h2{ margin: auto; - margin-top: -50px; + // margin-top: -50px; + margin-top: 50px; margin-bottom: -50px; + margin-left: 100px; text-align: center; height: 200px; font-size: 4rem; @@ -121,16 +130,18 @@ .form-directions{ width: 200px; margin: 20px auto; - margin-top: -75px; + margin-top: -175px; visibility: hidden; text-align: center; transition: .5s; margin-right: -500px; + margin-bottom:300px; height: 100px; } #zip-input{ margin-left: 600px; + margin-top: 100px; width: 400px; height: 40px; font-size: 1.3rem; @@ -149,6 +160,7 @@ margin-top: -200px; // margin-bottom:600px; margin-left: 490px; + height: 40px; width: 100px; font-size: 1.2rem; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index cc414a3..b86e9e9 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -5,6 +5,7 @@ import axios from 'axios'; const Dashboard = () => { const [input, setInput] = useState({file:''}) + const [ratings, setRatings] = useState({}) const changeHandler = e => { let data = new FormData() @@ -17,6 +18,7 @@ const Dashboard = () => { }) .then(res => { console.log(res); + setRatings(res.data.data) }).catch(err => { console.log(err) }) @@ -42,6 +44,7 @@ const Dashboard = () => { return ( +

Welcome to the dashboard.

@@ -66,21 +69,32 @@ const Dashboard = () => { {/*
Container for settings
*/}
+ {ratings.length > 0 ? ratings.map((x, index) => { + if(index < 400){ + + + return ( + +
+
+
+

{x.Name}

+

{x.Year}

+

Rating: {x.Rating}

+ {/*

{x.Letterboxd_URI}

*/} + {/*
+ + +
*/} +
+
+ ) + } + }) : '...loading'} -
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
+ + + {/*

alskdjflsjadf

@@ -144,12 +158,14 @@ const Dashboard = () => {
-
+
*/} - +
+ + ) } From f5832954ae3fcf0c9a29cda0d663c33a9c633168 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 24 Feb 2020 10:32:51 -0500 Subject: [PATCH 011/822] styling lookin good, need add error messages --- src/GroaLogo.png | Bin 0 -> 29996 bytes src/components/auth/login.js | 35 ++++++++++++------- src/components/auth/login.scss | 60 +++++++++++++++++++-------------- 3 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 src/GroaLogo.png diff --git a/src/GroaLogo.png b/src/GroaLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3c507b6e8ee39d2e9b02154ad1af4c209eeb16 GIT binary patch literal 29996 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 { e.preventDefault(); @@ -50,7 +52,9 @@ loginUser = e => {
-
Logo
+ + GroaLogo +
Register
@@ -58,20 +62,21 @@ loginUser = e => {

Your movies,
your way.

- -
-
- -
Groa Helps you pick the perfect film,
-
So you can save your popcorn for the good stuff.
- -
+
+
+
+
Groa helps you pick the perfect film.
+
So you can save your popcorn for the good stuff.
+ {/*
Groa helps you pick the perfect film.
+
So you can save your popcorn for the good stuff.
*/} +
+

Log in

- + { placeholder="Emal" value={this.username} /> + + {/* {touched.username && errors.username && ( +

{errors.username}

+ )} */} { {/* Log in Reddit */} - +
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 5e46e12..d696e98 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -10,7 +10,6 @@ } .container{ - //border: 2px solid red; width: 100%; } @@ -18,44 +17,43 @@ display: flex; justify-content: space-between; padding: 0 0 0 3%; - //border: 2px solid orange; height: 110px; .Logo{ color: white; - padding-top: 3%; - border: 2px solid red; + padding-top: 1%; + height: 80%; + + } .Register{ color: white; - //padding-top: 3%; - border: 2px solid red; + padding-top: 2%; + //border: 2px solid red; } } .Middle{ display: flex; - //justify-content: space-around; - // justify-content: space-evenly; - //border: 3px solid yellow; -//Text Motto +//Text Motto - your movies your way. .boxLeft{ color: white; font-size: 300%; - //border: 4px solid blue; width: 50%; - //padding: 5px 5px 0 5px; - + .Text{ margin: 0 0 0 13%; - border: 2px solid red; } } +// 2 GRAY BOXES - needs work, changes location per monitor size. + .boxes{ + border: 2px solid blue; + } .box1{ margin: -12% 2% 2% 0; background:rgb(97, 97, 97); @@ -67,20 +65,35 @@ color: black; background: #C4C4C4; width: 407px; - height: 288px; + //width: 450px; + height: 284px; + - .h6text{ - padding: 0 5% 0 5%; - border: 2px solid rgb(183, 0, 255); +//TEXT- Groa Helps you....So you can... + .box2b{ + + justify-content: center; + padding: 35px 15px 15px 15px; + //border: 2px solid red; + } + .h6text1{ + padding:0 8px 30px 8px; + font-size: 35px; + font-weight: normal; + text-align: center; + //border: 2px solid purple; } - + .h6text2{ + font-size: 30px; + font-weight: 640; + text-align: center; + //border: 2px solid purple; + } } - } .boxRight{ - border: 4px solid green; width: 50%; display: flex; justify-content: flex-end; @@ -106,7 +119,6 @@ .text{ display: flex; justify-content: space-evenly; - border: 2px solid lightblue; .CheckBoxContainer{ padding-top: 15px; @@ -122,7 +134,6 @@ .textOr{ display: flex; justify-content: center; -//border: 2px solid green; } @@ -138,15 +149,12 @@ justify-content: center; .input2{ padding: 7px; margin: 2% 12% 2% 12%; - //background:red; color: white; - // background:#7A7A7A; } .BtnContainer{ display: flex; justify-content: flex-end; -// border: 2px solid red; } From 4da56bdc4d899b9c7c588621abe0b6af04d0e405 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 24 Feb 2020 13:53:30 -0500 Subject: [PATCH 012/822] styling looks great, tweaks just needed --- src/components/auth/login.js | 51 ++++++++++++++++++++------------ src/components/auth/login.scss | 53 +++++++++++++++++++++------------- src/utils/axiosWithAuth.js | 2 +- 3 files changed, 67 insertions(+), 39 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index ff708d7..c6f2659 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -10,25 +10,35 @@ class LoginPage extends React.Component { state = { + errors:[], credentials: { - username: '', + email: '', password: '', } } handleChange = e => { + this.setState({ credentials: { ...this.state.credentials, [e.target.name]: e.target.value } + }); - + }; + validate(email, password) { + const errors = []; + if (email.length === 0) { + errors.push("Name can't be empty"); + } + return errors; + } -loginUser = e => { + loginUser = e => { e.preventDefault(); //console.log(user) axiosWithAuth() @@ -47,16 +57,14 @@ loginUser = e => { render() { return ( +
{/* Container - ENTIRE PAGE */}
- - - GroaLogo -
Register
- + GroaLogo +

Register

@@ -79,14 +87,16 @@ loginUser = e => { + - {/* {touched.username && errors.username && ( -

{errors.username}

+ {/*

er{this.error}

+ {this.email && this.errors.email && ( +

{this.errors.email}

)} */} { value={this.password} /> -
+
- +
Remember me
-
Forgot password?
+ + {/*
Forgot password?
*/} +
+
Forgot password?
+
- -

or

+ +

or

+ {/* Log in Google */} diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index d696e98..fc675ae 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -3,7 +3,7 @@ .LoginPage{ display: flex; justify-content: space-between; - padding: 0 3% 0 0; + padding: 0 10% 0 10%; min-height: 100vh; background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); @@ -16,23 +16,23 @@ .bartop{ display: flex; justify-content: space-between; - padding: 0 0 0 3%; - height: 110px; - + height: 150px; + //border: 2px solid green; .Logo{ color: white; - padding-top: 1%; - height: 80%; - + padding: 3% 0 0 0%; + height: 60%; + //border: 2px solid red; } .Register{ color: white; - padding-top: 2%; + padding: 3% 0 0 4%; //border: 2px solid red; } } + .Middle{ @@ -42,22 +42,23 @@ .boxLeft{ color: white; font-size: 300%; - width: 50%; + width: 70%; + //border: 2px solid blue; .Text{ - margin: 0 0 0 13%; + margin: 0 0 0 1px; + //margin: 0 0 0 13%; } } // 2 GRAY BOXES - needs work, changes location per monitor size. - .boxes{ - border: 2px solid blue; - } + .box1{ - margin: -12% 2% 2% 0; + //margin: -12% 2% 2% 0; background:rgb(97, 97, 97); width: 407px; + //width:536px; height: 436px; } .box2{ @@ -65,7 +66,6 @@ color: black; background: #C4C4C4; width: 407px; - //width: 450px; height: 284px; @@ -97,7 +97,9 @@ width: 50%; display: flex; justify-content: flex-end; - + margin-top: 3%; + //border: 2px solid red; + //////// Login Form ///////////////// .LoginForm{ display: flex; @@ -116,12 +118,18 @@ } //TEXT REMEMBER, FORGOT PASSWORD? -.text{ +.TextandCheck{ display: flex; - justify-content: space-evenly; - + // justify-content: space-evenly; + + .TextandCheck2{ + padding-left: 145px; + + } .CheckBoxContainer{ - padding-top: 15px; + padding: 20px 15px 0 60px; + padding-top: 20px; + } .Checkbox{ @@ -134,10 +142,12 @@ .textOr{ display: flex; justify-content: center; + } + //input fields .input1{ padding: 7px; @@ -151,6 +161,9 @@ justify-content: center; margin: 2% 12% 2% 12%; color: white; } +.error{ + color: red; +} .BtnContainer{ display: flex; diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index ac7eed9..fea858c 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -5,7 +5,7 @@ const axiosWithAuth = () => { //need env file for line 6? //var key = process.env.REACT_APP_KEY return axios.create({ - baseURL:'', + baseURL:'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/', headers: { Authorization: token } From 32982856797f32b61e2c6dba9fbc41f1407b59bd Mon Sep 17 00:00:00 2001 From: marielapg Date: Mon, 24 Feb 2020 12:55:16 -0800 Subject: [PATCH 013/822] updated styling register form --- src/components/auth/Register.js | 8 +++++--- src/components/auth/register.scss | 9 ++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1751073..fe75b5f 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -35,7 +35,7 @@ class Register extends React.Component { this.setState({ submitted: true }); const { user } = this.state; - if (user.email && user.password && user.confirmPassword) { + if (user.email && user.password && user.ConfirmPassword) { this.props.register(user); } } @@ -93,8 +93,8 @@ class Register extends React.Component {
Confirm Password is required
} + +
diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index e74e7c1..bdd0500 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -110,4 +110,11 @@ } } -} \ No newline at end of file + .callingError{ + color: red; + display: flex; + justify-content: center; + } +} + + From 6fe41fdce4538e5450af8318256e17f18341a2cc Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 24 Feb 2020 16:28:50 -0600 Subject: [PATCH 014/822] loading screen setup --- src/components/layout/LoadingScreen.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/components/layout/LoadingScreen.js diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js new file mode 100644 index 0000000..f255938 --- /dev/null +++ b/src/components/layout/LoadingScreen.js @@ -0,0 +1,19 @@ +import React, { useState, useEffect } from "react"; +import axios from "axios"; + +export default function LoadingScreen() { + const [movieQuote, setMovieQuote] = useState("Loading..."); + + useEffect(() => { + axios + .get("http://movie-quotes-app.herokuapp.com/api/v1/quotes") + .then(res => console.log("movieQuote: res: ", res)) + .catch(err => console.log("movieQuote: error: ", err)); + }, []); + + return ( +
+

Happy Birthday Frosty!

+
+ ); +} From 1197b71f9b29c97506955abb8afb0a834d36e11c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 24 Feb 2020 16:35:18 -0600 Subject: [PATCH 015/822] added an option for quote API --- src/App.js | 2 ++ src/components/layout/LoadingScreen.js | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 84e8d17..30d728e 100644 --- a/src/App.js +++ b/src/App.js @@ -3,6 +3,7 @@ import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; +import LoadingScreen from "./components/layout/LoadingScreen.js"; function App() { return ( @@ -11,6 +12,7 @@ function App() { {/* */} +
); diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index f255938..b42d187 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -4,9 +4,16 @@ import axios from "axios"; export default function LoadingScreen() { const [movieQuote, setMovieQuote] = useState("Loading..."); + let authOptions = { + method: "POST", + url: "http://movie-quotes-app.herokuapp.com/api/v1/quotes", + headers: { + Authorization: "Token {token goes here}" + } + }; + useEffect(() => { - axios - .get("http://movie-quotes-app.herokuapp.com/api/v1/quotes") + axios(authOptions) .then(res => console.log("movieQuote: res: ", res)) .catch(err => console.log("movieQuote: error: ", err)); }, []); From 789d44a70987c60c9dc09efeaf1df9cd79dfda04 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 24 Feb 2020 17:28:17 -0600 Subject: [PATCH 016/822] found something that might work --- package-lock.json | 5 +++ package.json | 1 + src/components/layout/LoadingScreen.js | 49 ++++++++++++++++----- src/components/layout/LoadingScreen.test.js | 0 4 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 src/components/layout/LoadingScreen.test.js diff --git a/package-lock.json b/package-lock.json index bad3e9f..cec6e38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9521,6 +9521,11 @@ "ts-pnp": "^1.1.2" } }, + "popular-movie-quotes": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/popular-movie-quotes/-/popular-movie-quotes-1.2.4.tgz", + "integrity": "sha512-YOwjB6cKq+RIwbrlPONH0jP14XoBfSHtBGWxm+ZQGGvHLKYBhdoaPZcTBZgC+HV7xY4W4GTQO2Wj7Go5hP1n/w==" + }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", diff --git a/package.json b/package.json index facdf0d..c2e6513 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "axios": "^0.19.2", "dotenv": "^8.2.0", "node-sass": "^4.13.1", + "popular-movie-quotes": "^1.2.4", "react": "^16.12.0", "react-dom": "^16.12.0", "react-hook-form": "^4.9.6", diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index b42d187..bd87d0f 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,26 +1,53 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; +import popMovieQuote from "popular-movie-quotes"; export default function LoadingScreen() { const [movieQuote, setMovieQuote] = useState("Loading..."); - let authOptions = { - method: "POST", - url: "http://movie-quotes-app.herokuapp.com/api/v1/quotes", - headers: { - Authorization: "Token {token goes here}" - } - }; + // let authOptions = { + // method: "POST", + // // url: "https://opentdb.com/api.php?amount=10&category=11", + // url: "http://movie-quotes-app.herokuapp.com/api/v1/quotes", + // headers: { + // "x-rapidapi-host": "juanroldan1989-moviequotes-v1.p.rapidapi.com", + // "x-rapidapi-key": "c3de27b2d2msh0100baf74bcce37p13129bjsn1514e1040c12", + // authorization: "Token token=yd8WzkWNEEzGtqMSgiZBrwtt" + // } + // }; useEffect(() => { - axios(authOptions) - .then(res => console.log("movieQuote: res: ", res)) - .catch(err => console.log("movieQuote: error: ", err)); + // // axios(authOptions) + // // .then(res => console.log("movieQuote: res: ", res)) + // // .catch(err => console.log("movieQuote: error: ", err)); + // axios({ + // method: "POST", + // url: "https://andruxnet-random-famous-quotes.p.rapidapi.com/", + // headers: { + // "content-type": "application/x-www-form-urlencoded", + // "x-rapidapi-host": "andruxnet-random-famous-quotes.p.rapidapi.com", + // "x-rapidapi-key": "c3de27b2d2msh0100baf74bcce37p13129bjsn1514e1040c12" + // }, + // params: { + // count: "10", + // cat: "movies" + // }, + // data: {} + // }) + // .then(response => { + // console.log(response); + // }) + // .catch(error => { + // console.log(error); + // }); + setMovieQuote(popMovieQuote.getSomeRandom(1)[0]); + console.log(popMovieQuote.getSomeRandom(1)); }, []); return (
-

Happy Birthday Frosty!

+

{movieQuote.quote}

+

{movieQuote.movie}

); } diff --git a/src/components/layout/LoadingScreen.test.js b/src/components/layout/LoadingScreen.test.js new file mode 100644 index 0000000..e69de29 From b5ea577083481fdda28047c0b8206977e1a7336a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 24 Feb 2020 17:34:47 -0600 Subject: [PATCH 017/822] added package src --- src/components/layout/LoadingScreen.js | 44 +++----------------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index bd87d0f..3859e11 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,53 +1,19 @@ import React, { useState, useEffect } from "react"; -import axios from "axios"; -import popMovieQuote from "popular-movie-quotes"; +import popMovieQuote from "popular-movie-quotes"; // src: https://www.npmjs.com/package/popular-movie-quotes export default function LoadingScreen() { const [movieQuote, setMovieQuote] = useState("Loading..."); - // let authOptions = { - // method: "POST", - // // url: "https://opentdb.com/api.php?amount=10&category=11", - // url: "http://movie-quotes-app.herokuapp.com/api/v1/quotes", - // headers: { - // "x-rapidapi-host": "juanroldan1989-moviequotes-v1.p.rapidapi.com", - // "x-rapidapi-key": "c3de27b2d2msh0100baf74bcce37p13129bjsn1514e1040c12", - // authorization: "Token token=yd8WzkWNEEzGtqMSgiZBrwtt" - // } - // }; - useEffect(() => { - // // axios(authOptions) - // // .then(res => console.log("movieQuote: res: ", res)) - // // .catch(err => console.log("movieQuote: error: ", err)); - // axios({ - // method: "POST", - // url: "https://andruxnet-random-famous-quotes.p.rapidapi.com/", - // headers: { - // "content-type": "application/x-www-form-urlencoded", - // "x-rapidapi-host": "andruxnet-random-famous-quotes.p.rapidapi.com", - // "x-rapidapi-key": "c3de27b2d2msh0100baf74bcce37p13129bjsn1514e1040c12" - // }, - // params: { - // count: "10", - // cat: "movies" - // }, - // data: {} - // }) - // .then(response => { - // console.log(response); - // }) - // .catch(error => { - // console.log(error); - // }); setMovieQuote(popMovieQuote.getSomeRandom(1)[0]); - console.log(popMovieQuote.getSomeRandom(1)); }, []); return (
-

{movieQuote.quote}

-

{movieQuote.movie}

+

"{movieQuote.quote}"

+

+ -{movieQuote.movie} Year: {movieQuote.year} +

); } From 3a3f575dd97e16d089e205b4bca49c026986be96 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 25 Feb 2020 10:12:53 -0500 Subject: [PATCH 018/822] added input error messages --- src/components/auth/login.js | 101 +++++++++++++++++++++------------ src/components/auth/login.scss | 4 ++ 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index c6f2659..dee7787 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -7,47 +7,76 @@ import './login.scss'; import GroaLogo from '../../GroaLogo.png' class LoginPage extends React.Component { - - state = { - errors:[], - credentials: { - email: '', - password: '', - } + constructor(props) { + super(props); + + this.state = { + user: { + email: '', + password: '' + }, + errors: { + email: '', + password: '' } + + }; + + + } + handleChange = e => { - + const { name, value} = e.target; + let errors = this.state.errors; + e.preventDefault(); this.setState({ - credentials: { - ...this.state.credentials, + user: { + ...this.state.user, [e.target.name]: e.target.value - } - + }, }); + switch (name) { + case 'email' : + errors.email = + value.length < 5 + ? 'must be a valid email address' + : ''; + break; + case 'password': + errors.password = + value.length < 4 + ? 'Password must be more than 4 characters long' + : ''; + break; + default: + break; + } + this.setState({errors, [name]: value}, ()=> { + console.log(errors) + }) }; - - validate(email, password) { - const errors = []; - if (email.length === 0) { - errors.push("Name can't be empty"); - } - return errors; - } + loginUser = e => { e.preventDefault(); //console.log(user) + axiosWithAuth() - .post("/api/login", this.state.credentials) + .post("/api/login", this.state.user) .then(res => { + localStorage.setItem('token', res.data.payload); console.log(res.data.payload) // redirect to Groas dashboard page - this.props.history.push('/'); + this.setState({submitted: true}); + if (this.user.email && this.user.password) { + this.props.history.push('/'); + } + }) .catch(err => console.log(err)); console.log('Login error post') @@ -55,7 +84,7 @@ class LoginPage extends React.Component { render() { - + const {errors} = this.state; return (
@@ -75,8 +104,7 @@ class LoginPage extends React.Component {
Groa helps you pick the perfect film.
So you can save your popcorn for the good stuff.
- {/*
Groa helps you pick the perfect film.
-
So you can save your popcorn for the good stuff.
*/} +
@@ -84,28 +112,31 @@ class LoginPage extends React.Component {

Log in

- - + - - - {/*

er{this.error}

- {this.email && this.errors.email && ( -

{this.errors.email}

- )} */} +{/* ERROR MESSAGE */} + {errors.email.length > 0 && + {errors.email}} + + + {errors.password.length > 0 && + {errors.password}}
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index fc675ae..ba5d544 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -143,6 +143,7 @@ display: flex; justify-content: center; + } @@ -162,6 +163,9 @@ justify-content: center; color: white; } .error{ + display: flex; + justify-content: center; + font-weight: 650; color: red; } From d36be5094dd2787b5c423f6ff02a4d331dfd7d3b Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 25 Feb 2020 11:46:59 -0500 Subject: [PATCH 019/822] added timer ...loading to dashboard --- src/components/dashboard/dash.scss | 9 ++++++- src/components/dashboard/index.js | 41 +++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index ad51a6d..c707e93 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -13,7 +13,7 @@ background-size: contain; // overflow-x: hidden; - outline: solid black 1px !important; + .h2-p{ @@ -42,6 +42,13 @@ } } + .flash{ + text-shadow: 0px 0px 10px white; + } + .loading{ + transition:1.3s; + text-shadow: 0px 0px 10px white; + } .settings-container{ height: 300px; border: 2px solid green; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index b86e9e9..7d7675c 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -6,30 +6,51 @@ import axios from 'axios'; const Dashboard = () => { const [input, setInput] = useState({file:''}) const [ratings, setRatings] = useState({}) + const [loading, setLoading] = useState() const changeHandler = e => { let data = new FormData() data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number - axios.post('http://localhost:4000/api/users/2/upload', data,{ + //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axios.post('http://localhost:4000/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } }) .then(res => { console.log(res); - setRatings(res.data.data) + setRatings(res.data) }).catch(err => { console.log(err) }) data = new FormData() + + setTimeout(() => { + setLoading(

.loading

) + }, 1000); + setTimeout(() => { + setLoading(

..loading

) + }, 2000); + setTimeout(() => { + setLoading(

...loading

) + }, 3000); + setTimeout(() => { + setLoading(

....loading

) + }, 4000); + // setTimeout(() => { + // setLoading('..loading') + // }, 4000); + // setTimeout(() => { + // setLoading('.loading') + // }, 5000); } const handleSubmit = e => { e.preventDefault(); console.log(input); //change user/1/ to be :id number handle submit currently does - axios.post('http://localhost:4000/api/users/1/upload', input,{ + axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -41,12 +62,17 @@ const Dashboard = () => { }) } - + const flash = () => { + setTimeout(() => { + return "flash" + }, 1000); + } return (
-

Welcome to the dashboard.

+

Welcome to the dashboard.

+
@@ -64,7 +90,8 @@ const Dashboard = () => { -

upload your letterboxd csv file here to get unique movie recommendations

+ {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} +

upload your letterboxd csv file here to get all past movie ratings

{/*
Container for settings
*/}
@@ -90,7 +117,7 @@ const Dashboard = () => {
) } - }) : '...loading'} + }) : loading} From d5964e392079f69bf1783f6a3fb70cf76af4016e Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 25 Feb 2020 13:26:51 -0500 Subject: [PATCH 020/822] almost done, just need verify auth/login correct --- src/{GroaLogo.png => GroaLogoBen.png} | Bin src/components/auth/login.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/{GroaLogo.png => GroaLogoBen.png} (100%) diff --git a/src/GroaLogo.png b/src/GroaLogoBen.png similarity index 100% rename from src/GroaLogo.png rename to src/GroaLogoBen.png diff --git a/src/components/auth/login.js b/src/components/auth/login.js index dee7787..9e019ad 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -4,7 +4,7 @@ import axiosWithAuth from '../../utils/axiosWithAuth' import { connect } from 'react-redux'; import {loginAction} from '../../store/actions/loginAction'; import './login.scss'; -import GroaLogo from '../../GroaLogo.png' +import GroaLogoBen from '../../GroaLogoBen.png' class LoginPage extends React.Component { @@ -92,7 +92,7 @@ class LoginPage extends React.Component {
- GroaLogo + GroaLogo

Register

From 6daab4df5add9fdd70a8e07febc46e92c9397696 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 25 Feb 2020 13:50:28 -0500 Subject: [PATCH 021/822] Revert "register form" --- src/App.js | 8 +- src/components/auth/Register.js | 151 ------------------------------ src/components/auth/index.js | 1 - src/components/auth/register.scss | 120 ------------------------ 4 files changed, 4 insertions(+), 276 deletions(-) delete mode 100644 src/components/auth/Register.js delete mode 100644 src/components/auth/register.scss diff --git a/src/App.js b/src/App.js index 7e353c7..84e8d17 100644 --- a/src/App.js +++ b/src/App.js @@ -2,15 +2,15 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -import Register from "./components/auth/register.js"; -import './components/auth/register.scss' +// import Register from './auth/Register'; + function App() { return (
- {/* {/* */} - + {/* + */}
); diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js deleted file mode 100644 index fe75b5f..0000000 --- a/src/components/auth/Register.js +++ /dev/null @@ -1,151 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -class Register extends React.Component { - constructor(props) { - super(props); - - this.state = { - user: { - - email: '', - password: '', - confirmPassword: '' - }, - submitted: false - }; - - this.handleChange = this.handleChange.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleChange(event) { - const { name, value } = event.target; - const { user } = this.state; - this.setState({ - user: { - ...user, - [name]: value - } - }); - } - - handleSubmit(event) { - event.preventDefault(); - - this.setState({ submitted: true }); - const { user } = this.state; - if (user.email && user.password && user.ConfirmPassword) { - this.props.register(user); - } - } - - render() { - const { registering } = this.props; - const { user, submitted } = this.state; - return ( -
- -

Login

- -
- -
-
-

Your movies, your way.

-
- -
-
-
Groa Helps you pick the perfect film,
-
So you can save your popcorn for the good stuff.
-
-
- -
-
-

Register

- -
- - {submitted && !user.Email && -
Email is required
- } - -
- - {submitted && !user.password && -
Password is required
- } - - -
- - {submitted && !user.ConfirmPassword && -
Confirm Password is required
- } - - -
-
- -
- -
Remember me
-
- -

_________________________ or ________________________

- - - - - -
- - {registering} -
- -
- -
- {/* end box right */} -
- {/*ends H1*/} -
- ); - } -} - -// function mapStateToProps(state) { -// const { registering } = state.registration; -// return { registering }; -// } - -const mapStateToProps = state => { - return { - userData: state.userData, - isFetching: state.isFetching, - error: state.error - }; -}; - -export default connect -(mapStateToProps)(Register); \ No newline at end of file diff --git a/src/components/auth/index.js b/src/components/auth/index.js index c518cd5..e69de29 100644 --- a/src/components/auth/index.js +++ b/src/components/auth/index.js @@ -1 +0,0 @@ -export * from './Register.js'; \ No newline at end of file diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss deleted file mode 100644 index bdd0500..0000000 --- a/src/components/auth/register.scss +++ /dev/null @@ -1,120 +0,0 @@ -.container{ - min-height: 100vh; - background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), - rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - - h3{ - color:white; - display: flex; - justify-content: flex-end; - padding: 3px 20px 3px 20px; - } - .H1{ - display: flex; - - .boxLeft{ - width: 50%; - padding: 1px 20px; - } - .text{ - font-size:320%; - color: white; - margin: 0 0 0 15%; - display: flex; - flex-direction: column; - justify-content: flex-start; - - } - - .box1{ - margin: -15% 2% 2% 0; - background:rgb(97, 97, 97); - width: 407px; - height: 436px; - padding: 15px; - } - } - - .box2{ - margin: -30% 0 0 40%; - color: black; - background: #C4C4C4; - width: 407px; - height: 288px; - font-size: 200%; - color: black; - padding-left: 25px; - } - - - .boxRight{ - display: flex; - justify-content: flex-end; - padding: 5%; - width: 50%; - h2{ - padding: 5px 10px 5px 10px; - } - } - .form{ - display: flex; - flex-direction: column; - width: 518px; - height: 647px; - background: #FFFFFF; - - } - - .form-control{ - padding: 7px; - margin: 2% 12% 2% 12%; - border: 1px solid black; - border-radius: 4px; - } - .checkBox{ - display: flex; - - .CheckB{ - padding-top: 20px; - padding-right: 5px; - padding-left: 60px; - } - h5{ - display: flex; - justify-content: left; - } - } - h4{ - display: flex; - justify-content: center; - } - - .LogBtn { - margin: 2% 12% 2% 12%; - padding: 8px; - background:#7A7A7A; - border-radius: 4px; - color: white; - } - - .BottomLogin { - display: flex; - justify-content: flex-end; - .LoginBtn{ - margin: 4% 12% 0 0; - width: 115px; - height:36px; - background:#21242C; - color: white; - border-radius: 4px; - } - } - - .callingError{ - color: red; - display: flex; - justify-content: center; - } -} - - From f167f97a4bb28ff9faf314d4ee6382b1b0749f2f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 14:22:40 -0600 Subject: [PATCH 022/822] customer helper functions to test --- src/components/layout/LoadingScreen.js | 5 +-- src/utils/test-utils.js | 53 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/utils/test-utils.js diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 3859e11..732ed96 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -11,9 +11,8 @@ export default function LoadingScreen() { return (

"{movieQuote.quote}"

-

- -{movieQuote.movie} Year: {movieQuote.year} -

+

-{movieQuote.movie}

+

Year: {movieQuote.year}

); } diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js new file mode 100644 index 0000000..d561f41 --- /dev/null +++ b/src/utils/test-utils.js @@ -0,0 +1,53 @@ +// test-utils.js +const domTestingLib = require("@testing-library/dom"); +const { queryHelpers } = domTestingLib; + +/** + * Uses queryHelper methods from react-testing-library to create customer helpers + * src = https://testing-library.com/docs/dom-testing-library/api-helpers + */ + +// mapping these helper functions to find data-test as an attribute for a node element +export const queryByTestId = queryHelpers.queryByAttribute.bind( + null, + "data-test" +); +export const queryAllByTestId = queryHelpers.queryAllByAttribute.bind( + null, + "data-test" +); + +/** + * Returns node(s) with the given data-test attribute. + * @param {object} container - Whatever node element is wrapping the data-test. + * @param {string} id - value of data-test attribute for search. + * @param {...object} rest - handling the props object. + * @returns {container} + */ +export function getAllByTestId(container, id, ...rest) { + const els = queryAllByTestId(container, id, ...rest); + if (!els.length) { + throw queryHelpers.getElementError( + `Unable to find an element by: [data-test="${id}"]`, + container + ); + } + return els; +} + +export function getByTestId(...args) { + const result = getAllByTestId(...args); + if (result.length > 0) { + return result[0]; + } + return null; +} + +// re-export with overrides +module.exports = { + ...domTestingLib, + getByTestId, + getAllByTestId, + queryByTestId, + queryAllByTestId +}; From caf8a8832c6b74b2a3c6b037710cd6d0d1a27c46 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 14:23:55 -0600 Subject: [PATCH 023/822] test for LoadingScreen --- src/components/layout/LoadingScreen.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/layout/LoadingScreen.test.js b/src/components/layout/LoadingScreen.test.js index e69de29..6d013ba 100644 --- a/src/components/layout/LoadingScreen.test.js +++ b/src/components/layout/LoadingScreen.test.js @@ -0,0 +1,13 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; + +// component to be tested. +import LoadingScreen from "./LoadingScreen.js"; + +it("renders loading screen and displays a movie quote in a paragraph", () => { + const { container } = render(); + + const component = getAllByTestId(container, "loading-screen"); + expect(component.length).toBe(1); +}); From be9e83f9c51071c0bd9a058381460b8cceec1d75 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 14:24:18 -0600 Subject: [PATCH 024/822] removed App.test.js throwing error --- src/App.test.js | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/App.test.js diff --git a/src/App.test.js b/src/App.test.js deleted file mode 100644 index 4db7ebc..0000000 --- a/src/App.test.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - const { getByText } = render(); - const linkElement = getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); From 2b6bc7f7a6aac0ca407beae04172df666eb4e4d9 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 14:24:31 -0600 Subject: [PATCH 025/822] basic loading screen --- src/components/layout/LoadingScreen.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 732ed96..f596fac 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -9,7 +9,7 @@ export default function LoadingScreen() { }, []); return ( -
+

"{movieQuote.quote}"

-{movieQuote.movie}

Year: {movieQuote.year}

From 9828e3d5ddb34a8656a84e37dc71b60c5766e5a1 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 25 Feb 2020 15:58:53 -0500 Subject: [PATCH 026/822] creating post login page - upload zip file, or take quiz button --- src/App.js | 2 + src/components/auth/postLogin.js | 79 ++++++++++++++++++++++++++++++ src/components/auth/postLogin.scss | 0 3 files changed, 81 insertions(+) create mode 100644 src/components/auth/postLogin.js create mode 100644 src/components/auth/postLogin.scss diff --git a/src/App.js b/src/App.js index 84e8d17..bcf591c 100644 --- a/src/App.js +++ b/src/App.js @@ -3,6 +3,7 @@ import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; +import PostLogin from './components/auth/postLogin'; function App() { return ( @@ -11,6 +12,7 @@ function App() { {/* */} +
); diff --git a/src/components/auth/postLogin.js b/src/components/auth/postLogin.js new file mode 100644 index 0000000..01e8c09 --- /dev/null +++ b/src/components/auth/postLogin.js @@ -0,0 +1,79 @@ +import React, {useState} from 'react'; +import axios from 'axios'; + +export default function PostLogin() { + + + +const [input, setInput] = useState({file:''}) + const [ratings, setRatings] = useState({}) + const [loading, setLoading] = useState() + + const handleChange = e => { + let data = new FormData() + data.append('movies', e.target.files[0] , e.target.files[0].name) + //change user/1/ to be :id number + //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axios.post('http://localhost:4000/api/users/1/upload', data,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + setRatings(res.data) + }).catch(err => { + console.log(err) + }) + data = new FormData() + setTimeout(() => { + setLoading(

.loading

) + }, 1000); + setTimeout(() => { + setLoading(

..loading

) + }, 2000); + setTimeout(() => { + setLoading(

...loading

) + }, 3000); + setTimeout(() => { + setLoading(

....loading

) + }, 4000); + // setTimeout(() => { + // setLoading('..loading') + // }, 4000); + // setTimeout(() => { + // setLoading('.loading') + // }, 5000); + +} + +return ( +
+
+
+ {/* */} + + {/* */} +
+
+ {/* END FORM */} +

If you dont have a Letterboxd Account take our quiz, so we can get a + recommenation of movies for you.

+
+ ) + + +} diff --git a/src/components/auth/postLogin.scss b/src/components/auth/postLogin.scss new file mode 100644 index 0000000..e69de29 From da1e418473e075421253f4a6bf7ae051190640b2 Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 25 Feb 2020 13:02:32 -0800 Subject: [PATCH 027/822] deleted the uncomments --- src/components/auth/Register.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index fe75b5f..43bd963 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -102,7 +102,8 @@ class Register extends React.Component { {submitted && !user.ConfirmPassword &&
Confirm Password is required
} - + +
@@ -134,11 +135,6 @@ class Register extends React.Component { } } -// function mapStateToProps(state) { -// const { registering } = state.registration; -// return { registering }; -// } - const mapStateToProps = state => { return { userData: state.userData, From 7f15f827ce50301a500bd8e0f8a30495b2be105d Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 25 Feb 2020 13:16:59 -0800 Subject: [PATCH 028/822] deleted the index.js --- src/components/auth/Register.js | 2 ++ src/components/auth/index.js | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 src/components/auth/index.js diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 43bd963..f034d63 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,6 +1,7 @@ import React from 'react'; import { connect } from 'react-redux'; + class Register extends React.Component { constructor(props) { super(props); @@ -134,6 +135,7 @@ class Register extends React.Component { ); } } + const mapStateToProps = state => { return { diff --git a/src/components/auth/index.js b/src/components/auth/index.js deleted file mode 100644 index c518cd5..0000000 --- a/src/components/auth/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './Register.js'; \ No newline at end of file From ec61c4552af35670d54b4cf0c1af642c23677951 Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 25 Feb 2020 13:21:18 -0800 Subject: [PATCH 029/822] added the correct path --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 7e353c7..35ea5f4 100644 --- a/src/App.js +++ b/src/App.js @@ -2,7 +2,7 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -import Register from "./components/auth/register.js"; +import Register from "../src/components/auth/register.js"; import './components/auth/register.scss' function App() { return ( From d9e580309c0c223f57201ab3cc48c4003b42a8d9 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 15:46:18 -0600 Subject: [PATCH 030/822] digging in deeper to register deploy error --- src/App.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index 35ea5f4..28085a5 100644 --- a/src/App.js +++ b/src/App.js @@ -2,15 +2,15 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -import Register from "../src/components/auth/register.js"; -import './components/auth/register.scss' +import Register from "./components/auth/Register.js"; +import "./components/auth/register.scss"; function App() { return (
{/* {/* */} - +
); From 68ade0adf057920c93bf178f2348b1a7d351212b Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 25 Feb 2020 17:12:52 -0500 Subject: [PATCH 031/822] styled and coded --- src/App.js | 1 + src/components/auth/postLogin.js | 58 ++++++++++++------- src/components/auth/postLogin.scss | 89 ++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 20 deletions(-) diff --git a/src/App.js b/src/App.js index bcf591c..056b8c0 100644 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,7 @@ import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; import PostLogin from './components/auth/postLogin'; +import './components/auth/postLogin.scss'; function App() { return ( diff --git a/src/components/auth/postLogin.js b/src/components/auth/postLogin.js index 01e8c09..0fe5e3a 100644 --- a/src/components/auth/postLogin.js +++ b/src/components/auth/postLogin.js @@ -49,29 +49,47 @@ const [input, setInput] = useState({file:''}) return (
-
-
- {/* */} - +
+

Welcome to Groa

+ +

As you give us more data, the richer the experience we can deliver.

+

Show, don't just tell

+
+
+ + +

Upload your letterboxd csv file here.

+
+ +
{/* */} + {/* END FORM */} +
+ {/* END BOX LEFT */} +
+
+ +

If you dont have a Letterboxd Account take our quiz, so we can get a + recommenation of movies for you.

+ +
+ +
+ +
+
+{/* END BOX RIGHT */} +
+{/* END BOX CONTAINER */}
- {/* END FORM */} -

If you dont have a Letterboxd Account take our quiz, so we can get a - recommenation of movies for you.

+{/* END CONTAINER */}
) diff --git a/src/components/auth/postLogin.scss b/src/components/auth/postLogin.scss index e69de29..a2fa754 100644 --- a/src/components/auth/postLogin.scss +++ b/src/components/auth/postLogin.scss @@ -0,0 +1,89 @@ +.PostLoginPage{ + display: flex; + justify-content: center; + min-height: 100vh; + background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), + rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); +} + + + +.container{ + display: flex; + flex-direction: column; + margin-top: 2%; + h1{ + display: flex; + justify-content: center; + color: white; + + } + + h2{ + display: flex; + justify-content: center; + color: white; + } + + h3{ + display: flex; + justify-content: center; + } + + +} +.boxContainer{ + display: flex; + margin-top: 5%; + + .boxLeft{ + background: white; + width: 500px; + height: 256px; + margin-right: 4%; + + .boxInside{ + display: flex; + flex-direction: column; + padding: 25px; + + .holder{ + display: flex; + justify-content: center; + padding-top: 50px; + } + + } + } + + .boxRight{ + background: white; + width: 500px; + height: 256px; + margin-left: 4%; + + .boxInside{ + display: flex; + flex-direction: column; + padding: 25px; + + .holder{ + display: flex; + justify-content: center; + } + } + } + +} + +.movie-input{ + padding: 10px; + background: gray; + width: 300px; +} + +.btnQuiz{ + padding: 10px; + background: gray; + width: 256px; +} \ No newline at end of file From d32677aff1baa6212bcbf7f8e13bcd7c1a06611e Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 25 Feb 2020 17:21:27 -0500 Subject: [PATCH 032/822] minor changes --- src/components/dashboard/dash.scss | 44 +++++-- src/components/dashboard/index.js | 182 ++++++++++++++++------------- 2 files changed, 137 insertions(+), 89 deletions(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index c707e93..0815671 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -9,7 +9,9 @@ flex-direction: column; justify-content: space-around; overflow-y: hidden; - overflow: scroll; + overflow: hidden scroll; + + background-size: contain; // overflow-x: hidden; @@ -46,6 +48,7 @@ text-shadow: 0px 0px 10px white; } .loading{ + text-align: center; transition:1.3s; text-shadow: 0px 0px 10px white; } @@ -59,14 +62,31 @@ // border: 2px solid blue; display: flex; flex-direction:row; - justify-content: space-around; + // justify-content: space-around; + margin-left: 300px; + margin-right: 400px; flex-wrap: wrap; + .box-container2{ + height: 1000px; + width:90%; + // border: 2px solid blue; + display: flex; + flex-direction:row; + // justify-content: space-around; + margin-right: 300px; + padding-right: 0px; + + flex-wrap: wrap; + // border: 2px solid red; + + } + .box{ margin-top: auto; margin-bottom: auto; - height: 372px; - width: 469px; + height: 356px; + width: 356px; // border: 2px solid white; display: flex; border-radius: .1rem; @@ -80,16 +100,26 @@ .movie-poster{ width: 200px; height: 296px; - border: 2px solid lightGrey; - margin: auto; + // border: 2px solid lightGrey; + //margin: auto; + margin-left:0px; + margin-top: 30px; + margin-bottom:30px; + // position: absolute; + // left: 0%; + // right: 54.76%; + // top: 17.13%; + // bottom: 18.82%; + background: #FFFFFF; //url(Image.png), &:hover{ box-shadow: 0px 0px 3px white; } } .text-container{ - width: 100px; + width: 80px; height: 200px; margin: auto; + margin-left:100px; margin-top: 40px; h2{ margin-left: -50px; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 7d7675c..f5bd62b 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -7,6 +7,7 @@ const Dashboard = () => { const [input, setInput] = useState({file:''}) const [ratings, setRatings] = useState({}) const [loading, setLoading] = useState() + const [toggle, setToggle] = useState(true); const changeHandler = e => { let data = new FormData() @@ -47,6 +48,7 @@ const Dashboard = () => { } const handleSubmit = e => { + setToggle(!toggle) e.preventDefault(); console.log(input); //change user/1/ to be :id number handle submit currently does @@ -88,104 +90,120 @@ const Dashboard = () => { /> - + {/* */} {/*

upload your letterboxd csv file here to get unique movie recommendations

*/}

upload your letterboxd csv file here to get all past movie ratings

{/*
Container for settings
*/}
- + {ratings.length > 0 ? ratings.map((x, index) => { - if(index < 400){ + if(index < 200){ - - return ( + + return ( -
-
-
-

{x.Name}

-

{x.Year}

-

Rating: {x.Rating}

- {/*

{x.Letterboxd_URI}

*/} - {/*
- - -
*/} +
+
+
+

{x.Name}

+

{x.Year}

+

Rating: {x.Rating}

+ {/*

{x.Letterboxd_URI}

*/} + {/*
+ + +
*/} +
+
+ ) + } + }) + : loading} + {/* //loading} */} + {/* {toggle == true ? +
+
+
+
+

alskdjflsjadf

+

asldkfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjfsdflsjadf

+

asldkfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ +
- ) - } - }) : loading} - - - - {/*
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- -
-
-
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - +
+
+
+

alskdjflsjadf

+

asldkfsdfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
-
-
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - +
+
+
+

alskdjflsjadf

+

asldkfljsfd

+

owerisdfuoiw

+

x,cvn,mncvx

+
+ + +
+
-
-
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - +
+
+
+

alskdjflsjadf

+

asldksdffljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
-
-
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - +
+
+
+

alskdjflsjadf

+

asldksdffljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
-
-
*/} + +
: true} */}
From 962392400dbf7e57818f202c4cd1bc938c48987a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 16:43:24 -0600 Subject: [PATCH 033/822] set up loading screen to be home page --- src/App.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index 30d728e..d72f33a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; -import Dashboard from "./components/dashboard/index.js"; +// import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; @@ -9,10 +9,10 @@ function App() { return (
- + {/* */} {/* */} - +
); From 5540c4b761a88d47a2701602e8799396f0e15b0a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 25 Feb 2020 17:30:34 -0600 Subject: [PATCH 034/822] added google analytics react packages --- package-lock.json | 10 ++++++++++ package.json | 3 +++ 2 files changed, 13 insertions(+) diff --git a/package-lock.json b/package-lock.json index cec6e38..c591c4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10878,6 +10878,11 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==" }, + "react-ga": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-2.7.0.tgz", + "integrity": "sha512-AjC7UOZMvygrWTc2hKxTDvlMXEtbmA0IgJjmkhgmQQ3RkXrWR11xEagLGFGaNyaPnmg24oaIiaNPnEoftUhfXA==" + }, "react-hook-form": { "version": "4.9.6", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-4.9.6.tgz", @@ -10946,6 +10951,11 @@ "tiny-warning": "^1.0.0" } }, + "react-router-ga": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-router-ga/-/react-router-ga-1.2.2.tgz", + "integrity": "sha512-VyV+pSHoGi9ih08KzJzxcCSvBa3DdIVaTRwG4mjZMPCORCVwLD6Tc75tKiJ/UhuaVOboVeSCrVqV8kahVBsj4Q==" + }, "react-scripts": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", diff --git a/package.json b/package.json index c2e6513..3b4ff66 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,16 @@ "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "dotenv": "^8.2.0", + "history": "^4.10.1", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", "react": "^16.12.0", "react-dom": "^16.12.0", + "react-ga": "^2.7.0", "react-hook-form": "^4.9.6", "react-redux": "^7.2.0", "react-router-dom": "^5.1.2", + "react-router-ga": "^1.2.2", "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", From b2b068306d1a07159ef00d5edc393824c0c7a387 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 25 Feb 2020 20:06:44 -0500 Subject: [PATCH 035/822] minor changes --- src/App.js | 6 +++--- src/components/dashboard/dash.scss | 22 ++++++++++----------- src/components/dashboard/index.js | 31 +++++++++++++++++++----------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/App.js b/src/App.js index d72f33a..33d6ac4 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; -// import Dashboard from "./components/dashboard/index.js"; +import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; @@ -9,10 +9,10 @@ function App() { return (
- {/* */} + {/* */} - + {/* */}
); diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 0815671..acf98cb 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -58,13 +58,13 @@ } .box-container{ height: 1000px; - width:100%; + width:90%; // border: 2px solid blue; display: flex; flex-direction:row; // justify-content: space-around; margin-left: 300px; - margin-right: 400px; + margin-right: 600px; flex-wrap: wrap; .box-container2{ @@ -84,9 +84,9 @@ .box{ margin-top: auto; - margin-bottom: auto; - height: 356px; - width: 356px; + // margin-bottom: auto; + height: 380px; + width: 347px; // border: 2px solid white; display: flex; border-radius: .1rem; @@ -98,13 +98,13 @@ -10px -0px 20px #ffffff; } .movie-poster{ - width: 200px; - height: 296px; + width:164px; + height: 246px; // border: 2px solid lightGrey; //margin: auto; margin-left:0px; - margin-top: 30px; - margin-bottom:30px; + margin-top: 68px; + margin-bottom:66px; // position: absolute; // left: 0%; // right: 54.76%; @@ -119,8 +119,8 @@ width: 80px; height: 200px; margin: auto; - margin-left:100px; - margin-top: 40px; + margin-left:75px; + margin-top: 70px; h2{ margin-left: -50px; font-size: 1rem; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index f5bd62b..99aa5a1 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -105,17 +105,26 @@ const Dashboard = () => { return (
-
-
-

{x.Name}

-

{x.Year}

-

Rating: {x.Rating}

- {/*

{x.Letterboxd_URI}

*/} - {/*
- - -
*/} -
+ {/*
+ Looks Cool šŸ‘Ž + Not interested šŸ‘ +
*/} + +
+ +
+

{x.Name}

+

{x.Year}

+

Rating: {x.Rating}

+

Votes:

+

Like by fans of:

+ {/*

{x.Letterboxd_URI}

*/} + {/*
+ + +
*/} +
+
) } From 0e470b687bf715aa3c2058eba7f50120c2e73f51 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 25 Feb 2020 20:15:39 -0500 Subject: [PATCH 036/822] minor adjustments to margin --- src/components/dashboard/dash.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index acf98cb..f39cbcf 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -63,8 +63,9 @@ display: flex; flex-direction:row; // justify-content: space-around; - margin-left: 300px; + margin-left: 250px; margin-right: 600px; + flex-wrap: wrap; .box-container2{ From e24a533152d746061d5535812d36ee3c4a02615b Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 25 Feb 2020 20:40:35 -0500 Subject: [PATCH 037/822] dashboardv1 file added and everything in dashboard cleared out --- src/components/dashboard/dashboardv1.js | 226 ++++++++++++++++++++++++ src/components/dashboard/index.js | 216 +--------------------- 2 files changed, 231 insertions(+), 211 deletions(-) create mode 100644 src/components/dashboard/dashboardv1.js diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js new file mode 100644 index 0000000..00b8cf4 --- /dev/null +++ b/src/components/dashboard/dashboardv1.js @@ -0,0 +1,226 @@ +import React, {useState} from 'react'; +import './dash.scss' +import axios from 'axios'; + + +const Dashboardv1 = () => { + const [input, setInput] = useState({file:''}) + const [ratings, setRatings] = useState({}) + const [loading, setLoading] = useState() + const [toggle, setToggle] = useState(true); + const changeHandler = e => { + + let data = new FormData() + data.append('movies', e.target.files[0] , e.target.files[0].name) + //change user/1/ to be :id number + //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axios.post('http://localhost:4000/api/users/1/upload', data,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + setRatings(res.data) + }).catch(err => { + console.log(err) + }) + data = new FormData() + + setTimeout(() => { + setLoading(

.loading

) + }, 1000); + setTimeout(() => { + setLoading(

..loading

) + }, 2000); + setTimeout(() => { + setLoading(

...loading

) + }, 3000); + setTimeout(() => { + setLoading(

....loading

) + }, 4000); + // setTimeout(() => { + // setLoading('..loading') + // }, 4000); + // setTimeout(() => { + // setLoading('.loading') + // }, 5000); + + } + const handleSubmit = e => { + setToggle(!toggle) + e.preventDefault(); + console.log(input); + //change user/1/ to be :id number handle submit currently does + axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + }).catch(err => { + console.log(err) + }) + + } + const flash = () => { + setTimeout(() => { + return "flash" + }, 1000); + } + + return ( + +
+

Welcome to the dashboard.

+ +
+
+ + + {/* */} +
+ {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} +

upload your letterboxd csv file here to get all past movie ratings

+
+ {/*
Container for settings
*/} +
+ + {ratings.length > 0 ? ratings.map((x, index) => { + if(index < 200){ + + + return ( + +
+ {/*
+ Looks Cool šŸ‘Ž + Not interested šŸ‘ +
*/} + +
+ +
+

{x.Name}

+

{x.Year}

+

Rating: {x.Rating}

+

Votes:

+

Like by fans of:

+ {/*

{x.Letterboxd_URI}

*/} + {/*
+ + +
*/} +
+ +
+ ) + } + }) + : loading} + {/* //loading} */} + {/* {toggle == true ? +
+
+
+
+

alskdjflsjadf

+

asldkfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjfsdflsjadf

+

asldkfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjflsjadf

+

asldkfsdfljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjflsjadf

+

asldkfljsfd

+

owerisdfuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjflsjadf

+

asldksdffljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+
+
+
+

alskdjflsjadf

+

asldksdffljsfd

+

oweriuoiw

+

x,cvn,mncvx

+
+ + +
+
+
+ +
: true} */} + + +
+ +
+ + + ) +} + +export default Dashboardv1; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 99aa5a1..2388cc9 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,221 +1,15 @@ import React, {useState} from 'react'; -import './dash.scss' -import axios from 'axios'; - + +import Dashboardv1 from './dashboardv1'; const Dashboard = () => { - const [input, setInput] = useState({file:''}) - const [ratings, setRatings] = useState({}) - const [loading, setLoading] = useState() - const [toggle, setToggle] = useState(true); - const changeHandler = e => { - - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) - //change user/1/ to be :id number - //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://localhost:4000/api/users/1/upload', data,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - setRatings(res.data) - }).catch(err => { - console.log(err) - }) - data = new FormData() - - setTimeout(() => { - setLoading(

.loading

) - }, 1000); - setTimeout(() => { - setLoading(

..loading

) - }, 2000); - setTimeout(() => { - setLoading(

...loading

) - }, 3000); - setTimeout(() => { - setLoading(

....loading

) - }, 4000); - // setTimeout(() => { - // setLoading('..loading') - // }, 4000); - // setTimeout(() => { - // setLoading('.loading') - // }, 5000); - - } - const handleSubmit = e => { - setToggle(!toggle) - e.preventDefault(); - console.log(input); - //change user/1/ to be :id number handle submit currently does - axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - }).catch(err => { - console.log(err) - }) - - } - const flash = () => { - setTimeout(() => { - return "flash" - }, 1000); - } + return ( -
-

Welcome to the dashboard.

- -
-
- - - {/* */} -
- {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} -

upload your letterboxd csv file here to get all past movie ratings

-
- {/*
Container for settings
*/} -
- - {ratings.length > 0 ? ratings.map((x, index) => { - if(index < 200){ - - - return ( +
+ -
- {/*
- Looks Cool šŸ‘Ž - Not interested šŸ‘ -
*/} - -
- -
-

{x.Name}

-

{x.Year}

-

Rating: {x.Rating}

-

Votes:

-

Like by fans of:

- {/*

{x.Letterboxd_URI}

*/} - {/*
- - -
*/} -
- -
- ) - } - }) - : loading} - {/* //loading} */} - {/* {toggle == true ? -
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
-
-
-

alskdjfsdflsjadf

-

asldkfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
-
-
-

alskdjflsjadf

-

asldkfsdfljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
-
-
-

alskdjflsjadf

-

asldkfljsfd

-

owerisdfuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
-
-
-

alskdjflsjadf

-

asldksdffljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
-
-
-
-

alskdjflsjadf

-

asldksdffljsfd

-

oweriuoiw

-

x,cvn,mncvx

-
- - -
-
-
- -
: true} */} - - -
From b5fb05f1ed9b10275bf1bb0c812baaa28047a748 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 07:47:59 -0600 Subject: [PATCH 038/822] added a .env file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4d29575..5fa505c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +.env # testing /coverage From e0a7bba33a1caa7b628a98c95afde52cdb923b33 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 07:48:38 -0600 Subject: [PATCH 039/822] removed not used package --- package-lock.json | 5 ----- package.json | 1 - 2 files changed, 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c591c4c..1d88307 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10951,11 +10951,6 @@ "tiny-warning": "^1.0.0" } }, - "react-router-ga": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-router-ga/-/react-router-ga-1.2.2.tgz", - "integrity": "sha512-VyV+pSHoGi9ih08KzJzxcCSvBa3DdIVaTRwG4mjZMPCORCVwLD6Tc75tKiJ/UhuaVOboVeSCrVqV8kahVBsj4Q==" - }, "react-scripts": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", diff --git a/package.json b/package.json index 3b4ff66..aee99e1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "react-hook-form": "^4.9.6", "react-redux": "^7.2.0", "react-router-dom": "^5.1.2", - "react-router-ga": "^1.2.2", "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", From 7ec773ec6c0789c4b46fdb33f19625084a80e3ff Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 07:49:06 -0600 Subject: [PATCH 040/822] created config function for analytics --- src/config/analytics.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/config/analytics.js diff --git a/src/config/analytics.js b/src/config/analytics.js new file mode 100644 index 0000000..9188cf1 --- /dev/null +++ b/src/config/analytics.js @@ -0,0 +1,32 @@ +import ReactGA from "react-ga"; +import { createBrowserHistory } from "history"; + +// article source: https://levelup.gitconnected.com/using-google-analytics-with-react-3d98d709399b + +export default function reactGAinitialization() { + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID, { + debug: true + }); + + // sets any user spefic data that we might want to track. + ReactGA.set({ + userId: 1 // hard coded until I can dynamically recieve userIds + }); + + // initialize google analytics page view tracking + createBrowserHistory().listen(location => { + ReactGA.set({ page: location.pathname }); // Update the user's current page + ReactGA.pageview(location.pathname); // Record a pageview for the given page + }); + + // can add modalviews + // ReactGA.modalview({route uri}) + + // loading times of js libraries? + ReactGA.timing({ + category: "JS Libraries", + variable: "load", + value: 20, + label: "CDN libs" + }); +} From 70cbfa61db3f8732ac0996fe8850d60dde5f4c6f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 07:50:42 -0600 Subject: [PATCH 041/822] initialized analytics in app --- src/App.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/App.js b/src/App.js index d72f33a..5e43128 100644 --- a/src/App.js +++ b/src/App.js @@ -1,11 +1,18 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; + +// local imports // import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; +// config imports +import reactGAinitialization from "./config/analytics.js"; + function App() { + reactGAinitialization(); + return (
From eecf4e46119e13a5cfef57a02659b6993e809f3c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 08:31:21 -0600 Subject: [PATCH 042/822] added source comment --- src/config/analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index 9188cf1..85f388e 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -5,7 +5,7 @@ import { createBrowserHistory } from "history"; export default function reactGAinitialization() { ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID, { - debug: true + debug: true // please take me out when debugging is done. }); // sets any user spefic data that we might want to track. From 5136ca8af892ed0dd761496ee008eb0679a7f236 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 08:31:56 -0600 Subject: [PATCH 043/822] changed where we imported router for tests --- src/App.js | 20 +++++++++++--------- src/index.js | 5 +---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/App.js b/src/App.js index 5e43128..300648d 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,5 @@ import React from "react"; -import { Route, Switch } from "react-router-dom"; +import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; // local imports // import Dashboard from "./components/dashboard/index.js"; @@ -12,16 +12,18 @@ import reactGAinitialization from "./config/analytics.js"; function App() { reactGAinitialization(); - + return ( -
- - {/* */} - {/* + +
+ + {/* */} + {/* */} - - -
+ +
+
+ ); } diff --git a/src/index.js b/src/index.js index 611e277..a0f95cc 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,6 @@ import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; -import { BrowserRouter as Router } from "react-router-dom"; import { Provider } from "react-redux"; import { createStore, compose, applyMiddleware } from "redux"; import thunk from "redux-thunk"; @@ -19,9 +18,7 @@ const store = createStore( ReactDOM.render( - - - + , document.getElementById("root") From 3ff8f8dd147efc1f94a939d6529041eeb1f87f11 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 08:32:11 -0600 Subject: [PATCH 044/822] wrote test for App --- src/App.test.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/App.test.js diff --git a/src/App.test.js b/src/App.test.js new file mode 100644 index 0000000..27a50d5 --- /dev/null +++ b/src/App.test.js @@ -0,0 +1,23 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "./utils/test-utils.js"; + +// component to be tested. +import App from "./App.js"; + +// creating a mock function to test if GA initialization was called. +import reactGAinitialization from "./config/analytics.js"; +jest.mock("./config/analytics.js"); +reactGAinitialization.mockImplementation(() => true); + +it("renders App component", () => { + const { container } = render(); + + const component = getAllByTestId(container, "App-component"); + expect(component.length).toBe(1); +}); + +it("calls reactGAinitialization once", () => { + render(); + expect(reactGAinitialization).toBeCalled(); +}); From f72ed74b8448ea3e04c3e7dcc176b11a3f6d45e2 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 11:00:12 -0600 Subject: [PATCH 045/822] added comment and set env variable in aws --- src/config/analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index 85f388e..dfb8aac 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -22,7 +22,7 @@ export default function reactGAinitialization() { // can add modalviews // ReactGA.modalview({route uri}) - // loading times of js libraries? + // loading times of js libraries? <-- waiting to hook up to proper domain name for google analytics. ReactGA.timing({ category: "JS Libraries", variable: "load", From aa05fb34e44990f14b960329292c0e902758e19b Mon Sep 17 00:00:00 2001 From: marielapg Date: Wed, 26 Feb 2020 09:19:25 -0800 Subject: [PATCH 046/822] readded the scss file and path --- src/App.js | 3 +- src/components/auth/register.scss | 118 ++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/components/auth/register.scss diff --git a/src/App.js b/src/App.js index d3f08cb..8937e51 100644 --- a/src/App.js +++ b/src/App.js @@ -2,7 +2,8 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -import Register from "./components/auth/Register.js"; +import Register from "../src/components/auth/register.js"; +import "../src/components/auth/register.scss"; // this is needed for the styling // function App() { return ( diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss new file mode 100644 index 0000000..28d6d54 --- /dev/null +++ b/src/components/auth/register.scss @@ -0,0 +1,118 @@ +.container{ + min-height: 100vh; + background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), + rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); + + h3{ + color:white; + display: flex; + justify-content: flex-end; + padding: 3px 20px 3px 20px; + } + .H1{ + display: flex; + + .boxLeft{ + width: 50%; + padding: 1px 20px; + } + .text{ + font-size:320%; + color: white; + margin: 0 0 0 15%; + display: flex; + flex-direction: column; + justify-content: flex-start; + + } + + .box1{ + margin: -15% 2% 2% 0; + background:rgb(97, 97, 97); + width: 407px; + height: 436px; + padding: 15px; + } + } + + .box2{ + margin: -30% 0 0 40%; + color: black; + background: #C4C4C4; + width: 407px; + height: 288px; + font-size: 200%; + color: black; + padding-left: 25px; + } + + + .boxRight{ + display: flex; + justify-content: flex-end; + padding: 5%; + width: 50%; + h2{ + padding: 5px 10px 5px 10px; + } + } + .form{ + display: flex; + flex-direction: column; + width: 518px; + height: 647px; + background: #FFFFFF; + + } + + .form-control{ + padding: 7px; + margin: 2% 12% 2% 12%; + border: 1px solid black; + border-radius: 4px; + } + .checkBox{ + display: flex; + + .CheckB{ + padding-top: 20px; + padding-right: 5px; + padding-left: 60px; + } + h5{ + display: flex; + justify-content: left; + } + } + h4{ + display: flex; + justify-content: center; + } + + .LogBtn { + margin: 2% 12% 2% 12%; + padding: 8px; + background:#7A7A7A; + border-radius: 4px; + color: white; + } + + .BottomLogin { + display: flex; + justify-content: flex-end; + .LoginBtn{ + margin: 4% 12% 0 0; + width: 115px; + height:36px; + background:#21242C; + color: white; + border-radius: 4px; + } + } + + .callingError{ + color: red; + display: flex; + justify-content: center; + } +} \ No newline at end of file From 4fe801db42de05e6f4a0c6479177bff88d73baad Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 26 Feb 2020 12:40:42 -0500 Subject: [PATCH 047/822] test --- src/components/auth/postLogin.js | 36 ++++++---- src/components/auth/postLogin.scss | 102 +++++++++++++++++------------ 2 files changed, 84 insertions(+), 54 deletions(-) diff --git a/src/components/auth/postLogin.js b/src/components/auth/postLogin.js index 0fe5e3a..97f3960 100644 --- a/src/components/auth/postLogin.js +++ b/src/components/auth/postLogin.js @@ -50,37 +50,47 @@ const [input, setInput] = useState({file:''}) return (
-

Welcome to Groa

+
+

Groa grows with you.

+

The more movies your rate, +
+ the better your recommenations.

-

As you give us more data, the richer the experience we can deliver.

-

Show, don't just tell

+

Select how you'd like to join:

+
- -

Upload your letterboxd csv file here.

+
+
+

Upload ratings from Letterboxd or IMDb

+

For users who already have accounts on these popular film rating sites.

+
- Select +
+ + {/* UPLOAD FILE */} + {/* -
- {/* */} + /> */} + {/* END FORM */}
{/* END BOX LEFT */}
- -

If you dont have a Letterboxd Account take our quiz, so we can get a - recommenation of movies for you.

+
+

Recommendation
setup wizard

+

For users who want to use Groa without uploading data.

- +
diff --git a/src/components/auth/postLogin.scss b/src/components/auth/postLogin.scss index a2fa754..1b7ea03 100644 --- a/src/components/auth/postLogin.scss +++ b/src/components/auth/postLogin.scss @@ -1,66 +1,84 @@ .PostLoginPage{ display: flex; justify-content: center; - min-height: 100vh; - background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), - rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); + border: 2px solid blue; } +.textholder1{ + + justify-content: center; + border: 2px solid green; + + h1{ + display: flex; + justify-content: center; + font-size: 350%; + } + h2{ + display: flex; + justify-content: center; + }z -.container{ - display: flex; - flex-direction: column; - margin-top: 2%; - h1{ - display: flex; - justify-content: center; - color: white; - - } + h3{ + display: flex; + justify-content: center; + } +} - h2{ - display: flex; - justify-content: center; - color: white; - } +.image1{ + display: flex; + justify-content: center; + height: 100px; + width: 200px; + background: gray; + margin-bottom: 8%; +} - h3{ - display: flex; - justify-content: center; - } +.image2{ + height: 100px; + width: 200px; + background: gray; +} +.container{ + display: flex; + flex-direction: column; + width: 90%; + border: 2px solid red; } + .boxContainer{ display: flex; + justify-content: center; margin-top: 5%; + border: 2px solid blue; .boxLeft{ - background: white; - width: 500px; - height: 256px; - margin-right: 4%; + width: 285px; + height: 500px; + margin-right: 20%; + border: 2px solid black; .boxInside{ display: flex; + justify-content: center; flex-direction: column; padding: 25px; - - .holder{ - display: flex; - justify-content: center; - padding-top: 50px; - } - } + + .holder{ + display: flex; + justify-content: center; + } } .boxRight{ - background: white; - width: 500px; - height: 256px; - margin-left: 4%; + width: 285px; + height: 400px; + // margin-left: 40%; + border: 2px solid black; .boxInside{ display: flex; @@ -82,8 +100,10 @@ width: 300px; } -.btnQuiz{ - padding: 10px; - background: gray; - width: 256px; +.btn{ + color: white; + font-size: 25px; + background: black; + height: 51px; + width: 255px; } \ No newline at end of file From fdf9925373c1c6e8398ad4af489dd7f4a22fdc93 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 26 Feb 2020 13:01:55 -0500 Subject: [PATCH 048/822] changed email to username --- src/components/auth/login.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 9e019ad..c90f068 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -13,11 +13,11 @@ class LoginPage extends React.Component { this.state = { user: { - email: '', + username: '', password: '' }, errors: { - email: '', + username: '', password: '' } @@ -38,10 +38,10 @@ class LoginPage extends React.Component { }, }); switch (name) { - case 'email' : - errors.email = + case 'username' : + errors.username = value.length < 5 - ? 'must be a valid email address' + ? 'must be a valid username' : ''; break; case 'password': @@ -66,14 +66,14 @@ class LoginPage extends React.Component { //console.log(user) axiosWithAuth() - .post("/api/login", this.state.user) + .post("/api/users/login", this.state.user) .then(res => { localStorage.setItem('token', res.data.payload); console.log(res.data.payload) // redirect to Groas dashboard page this.setState({submitted: true}); - if (this.user.email && this.user.password) { + if (this.user.username && this.user.password) { this.props.history.push('/'); } @@ -113,19 +113,19 @@ class LoginPage extends React.Component {

Log in

-
+
{/* ERROR MESSAGE */} - {errors.email.length > 0 && - {errors.email}} + {errors.username.length > 0 && + {errors.username}} Date: Wed, 26 Feb 2020 10:05:40 -0800 Subject: [PATCH 049/822] added username --- src/components/auth/Register.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f034d63..f9ded09 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -10,6 +10,7 @@ class Register extends React.Component { user: { email: '', + username:'', password: '', confirmPassword: '' }, @@ -36,7 +37,7 @@ class Register extends React.Component { this.setState({ submitted: true }); const { user } = this.state; - if (user.email && user.password && user.ConfirmPassword) { + if (user.email && user.username && user.password && user.ConfirmPassword) { this.props.register(user); } } @@ -78,6 +79,18 @@ class Register extends React.Component { {submitted && !user.Email &&
Email is required
} + +
+ + {submitted && !user.Username && +
Username is required
+ }
Date: Wed, 26 Feb 2020 10:50:10 -0800 Subject: [PATCH 050/822] created a navigation file --- src/components/dashboard/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 2388cc9..c6036ed 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,6 +1,7 @@ import React, {useState} from 'react'; import Dashboardv1 from './dashboardv1'; +import Navigation from './navigation.js'; const Dashboard = () => { @@ -9,6 +10,7 @@ const Dashboard = () => {
+
From 21636eb0e758eb09f968446c7c8ec5092177b411 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 13:51:11 -0500 Subject: [PATCH 051/822] app.js uncommented added /compnoents to path --- src/App.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index 33d6ac4..c3ee801 100644 --- a/src/App.js +++ b/src/App.js @@ -2,7 +2,7 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -// import Register from './auth/Register'; +import Register from './components/auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; function App() { @@ -10,8 +10,8 @@ function App() {
- {/* - */} + {/* */} + {/* */}
From c802f8a500a5975f5fb4e025c794a520790da70e Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 13:57:39 -0500 Subject: [PATCH 052/822] navigation file structure --- src/components/dashboard/navigation.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index e69de29..31b0350 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -0,0 +1,22 @@ +import React from 'react'; + + + + +function Navigation () { + + + + return ( + +
+ + + +
+ + + ) +} + +export default Navigation; \ No newline at end of file From aced8207b854639674ea1245b56956b1dc6506da Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 13:49:47 -0600 Subject: [PATCH 053/822] set up of watchlist component to test router on aws --- src/App.js | 2 ++ src/components/movies/WatchList.js | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 src/components/movies/WatchList.js diff --git a/src/App.js b/src/App.js index 300648d..fe220fc 100644 --- a/src/App.js +++ b/src/App.js @@ -6,6 +6,7 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; // import Login from './auth/Login'; // import Register from './auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; +import WatchList from "./components/movies/WatchList.js"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -20,6 +21,7 @@ function App() { {/* */} {/* */} +
diff --git a/src/components/movies/WatchList.js b/src/components/movies/WatchList.js new file mode 100644 index 0000000..84f53c0 --- /dev/null +++ b/src/components/movies/WatchList.js @@ -0,0 +1,9 @@ +import React from "react"; + +export default function WatchList() { + return ( +
+

Hello

+
+ ); +} From 6817a967a229fafde19e52f4c3113866c789afeb Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 14:55:09 -0500 Subject: [PATCH 054/822] added url --- src/components/dashboard/dashboardv1.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 00b8cf4..dbea338 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,9 +14,9 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://localhost:4000/api/users/1/upload', data,{ + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ headers:{ - 'Content-Type':'multipart/form-data' + 'Content-Type':'multipart/form-data' } }) .then(res => { From 7fac9e44f776e0ac1b97be67a80548de018226d7 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 15:01:10 -0500 Subject: [PATCH 055/822] changed to https --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index dbea338..7976d60 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,7 +14,7 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ + axios.post('https://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } From 100ec0a5cc772079f59b541c54333fba0b5c05aa Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 14:04:14 -0600 Subject: [PATCH 056/822] fixed aws routing issue and testing GA --- src/config/analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index dfb8aac..1870c99 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -4,7 +4,7 @@ import { createBrowserHistory } from "history"; // article source: https://levelup.gitconnected.com/using-google-analytics-with-react-3d98d709399b export default function reactGAinitialization() { - ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID, { + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { debug: true // please take me out when debugging is done. }); From 308c270df9808893e5d84596d8147a0231984133 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 15:09:07 -0500 Subject: [PATCH 057/822] minor changes --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 7976d60..dbea338 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,7 +14,7 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('https://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } From 0b2dced85eef8691075b10cd9b58b410aa51e82a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 14:14:56 -0600 Subject: [PATCH 058/822] experimenting with GA --- public/index.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/public/index.html b/public/index.html index aa069f2..302da5e 100644 --- a/public/index.html +++ b/public/index.html @@ -25,6 +25,20 @@ Learn how to configure a non-root public URL by running `npm run build`. --> React App + + + From 6258ed773bda9560a403138ef510f7b1f6278fc7 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 14:22:31 -0600 Subject: [PATCH 059/822] trying to work with react-ga --- public/index.html | 14 -------------- src/config/analytics.js | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/public/index.html b/public/index.html index 302da5e..aa069f2 100644 --- a/public/index.html +++ b/public/index.html @@ -25,20 +25,6 @@ Learn how to configure a non-root public URL by running `npm run build`. --> React App - - - diff --git a/src/config/analytics.js b/src/config/analytics.js index 1870c99..91ab7bb 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -5,13 +5,13 @@ import { createBrowserHistory } from "history"; export default function reactGAinitialization() { ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { - debug: true // please take me out when debugging is done. + // debug: true // please take me out when debugging is done. }); // sets any user spefic data that we might want to track. - ReactGA.set({ - userId: 1 // hard coded until I can dynamically recieve userIds - }); + // ReactGA.set({ + // userId: 1 // hard coded until I can dynamically recieve userIds + // }); // initialize google analytics page view tracking createBrowserHistory().listen(location => { @@ -23,10 +23,10 @@ export default function reactGAinitialization() { // ReactGA.modalview({route uri}) // loading times of js libraries? <-- waiting to hook up to proper domain name for google analytics. - ReactGA.timing({ - category: "JS Libraries", - variable: "load", - value: 20, - label: "CDN libs" - }); + // ReactGA.timing({ + // category: "JS Libraries", + // variable: "load", + // value: 20, + // label: "CDN libs" + // }); } From fb629754d0c1740ec48c04812e1288075d59468f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 14:23:56 -0600 Subject: [PATCH 060/822] forgot history --- src/App.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index fe220fc..517bf58 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,6 @@ import React from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; +import { createBrowserHistory } from "history"; // local imports // import Dashboard from "./components/dashboard/index.js"; @@ -15,7 +16,7 @@ function App() { reactGAinitialization(); return ( - +
{/* */} From 910c3f3b0d4ccac7126b4512f6e60cbc2c6a2391 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 14:33:52 -0600 Subject: [PATCH 061/822] trying standardImp from react-ga docs --- public/index.html | 25 +++++++++++++++++++++++++ src/config/analytics.js | 1 + 2 files changed, 26 insertions(+) diff --git a/public/index.html b/public/index.html index aa069f2..3bddced 100644 --- a/public/index.html +++ b/public/index.html @@ -25,6 +25,31 @@ Learn how to configure a non-root public URL by running `npm run build`. --> React App + + + diff --git a/src/config/analytics.js b/src/config/analytics.js index 91ab7bb..4b3d83a 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -6,6 +6,7 @@ import { createBrowserHistory } from "history"; export default function reactGAinitialization() { ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { // debug: true // please take me out when debugging is done. + standardImplementation: true }); // sets any user spefic data that we might want to track. From 17d47f3cf0bb820f55a31e2c8fbbfc39d15d50cb Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 16:08:31 -0500 Subject: [PATCH 062/822] url to be 3 --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index dbea338..865846d 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,7 +14,7 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/1/upload', data,{ + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/3/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } From cf9f5339bec80ada708151d36edbe54e1856251a Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 26 Feb 2020 16:09:11 -0500 Subject: [PATCH 063/822] made it so able to see login via local host --- src/App.js | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/App.js b/src/App.js index c7d74e6..6baf339 100644 --- a/src/App.js +++ b/src/App.js @@ -1,14 +1,9 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; -<<<<<<< HEAD -import Dashboard from "./components/dashboard/index.js"; -import Login from './components/auth/login' -======= // import Dashboard from "./components/dashboard/index.js"; -// import Login from './auth/Login'; ->>>>>>> ed52cd8203f86bb702b466b22731ec8836a9b37a +import Login from './components/auth/login'; // import Register from './auth/Register'; -import LoadingScreen from "./components/layout/LoadingScreen.js"; +//import LoadingScreen from "./components/layout/LoadingScreen.js"; import './components/auth/login.scss' @@ -18,16 +13,10 @@ function App() { return (
-<<<<<<< HEAD - - - {/* */} -======= {/* */} - {/* - */} - ->>>>>>> ed52cd8203f86bb702b466b22731ec8836a9b37a + + {/* */} + {/* */}
); From f5bbf66185ce71272dffdafff5fae841c6acc5c2 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 15:17:31 -0600 Subject: [PATCH 064/822] tried moving the setup --- public/index.html | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/public/index.html b/public/index.html index 3bddced..34d8e7d 100644 --- a/public/index.html +++ b/public/index.html @@ -10,21 +10,14 @@ content="Web site created using create-react-app" /> - + - - React App + Gróa + + + +
- - - -
- From f4222c645704010e848cc75acbc2d3e7a2f86bf0 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 26 Feb 2020 16:32:48 -0500 Subject: [PATCH 065/822] added code and styling for data upload --- src/components/auth/dataUpload.js | 114 ++++++++++++++++++++++++++++ src/components/auth/dataUpload.scss | 86 +++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 src/components/auth/dataUpload.js create mode 100644 src/components/auth/dataUpload.scss diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js new file mode 100644 index 0000000..6bef263 --- /dev/null +++ b/src/components/auth/dataUpload.js @@ -0,0 +1,114 @@ +import React, {useState} from 'react'; +import axios from 'axios'; + +export default function PostLogin() { + + + +const [input, setInput] = useState({file:''}) + const [ratings, setRatings] = useState({}) + const [loading, setLoading] = useState() + + const handleChange = e => { + let data = new FormData() + data.append('movies', e.target.files[0] , e.target.files[0].name) + //change user/1/ to be :id number + //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axios.post('http://localhost:4000/api/users/1/upload', data,{ + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + setRatings(res.data) + }).catch(err => { + console.log(err) + }) + data = new FormData() + setTimeout(() => { + setLoading(

.loading

) + }, 3000); + // setTimeout(() => { + // setLoading(

..loading

) + // }, 2000); + // setTimeout(() => { + // setLoading(

...loading

) + // }, 3000); + // setTimeout(() => { + // setLoading(

....loading

) + // }, 4000); + + // setTimeout(() => { + // setLoading('..loading') + // }, 4000); + // setTimeout(() => { + // setLoading('.loading') + // }, 5000); + +} + +return ( +
+
+
+

Already rated movies elsewhere?

+

Groa lets you easily upload your ratings from +
+ either LetterBoxd or IMDb:

+ +
+
+
+ +
+

1.Log in to Letterboxd

+

2.Click on your username and select SETTINGS from the dropdown menu.

+

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere + convenient like your desktop or downloads folder.

+

4.Click to browse or simply drop your .csv file below

+ + + + {/* END FORM */} +
+ {/* END BOX LEFT */} +
+
+
+

1.Log in to IMDb

+

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

+

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

+

4.Click to browse or simply drop your .csv file below

+ +
+
+{/* END BOX RIGHT */} +
+ +{/* UPLOAD FILE */} +
+
+ +
+
+ +
Groa values your privacy strives to be transparent to all users. +
+ Your data will be kept strictly confidential-you're the only one + who will be able to view or access it. +
+{/* END BOX CONTAINER */} +
+{/* END CONTAINER */} +
+ ) + + +} diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss new file mode 100644 index 0000000..35f8a98 --- /dev/null +++ b/src/components/auth/dataUpload.scss @@ -0,0 +1,86 @@ +.DataUploadPage{ + display: flex; + justify-content: center; +} + +.textholder1{ + + justify-content: center; + + h1{ + display: flex; + justify-content: center; + font-size: 350%; + } + + h2{ + display: flex; + justify-content: center; + } + + h3{ + display: flex; + justify-content: center; + } +} + +.ptext{ +font-weight: 500; +} + +.DboxContainer{ + display: flex; + justify-content: center; + margin-top: 2%; + + .DboxLeft{ + width: 285px; + height: 500px; + margin-right: 20%; + + .boxInside{ + display: flex; + justify-content: center; + flex-direction: column; + padding: 25px; + } + + } + + .DboxRight{ + width: 285px; + height: 500px; + + .boxInside{ + display: flex; + flex-direction: column; + padding: 25px; + } + } + +} + +////////////////////UPLOAD DATA BOX/////////////////// +.UploadContainer{ + // padding-top: 25px; + display: flex; + justify-content: center; + .inputholder{ + display: flex; + justify-content: center; + padding: 10px; + width: 420px; + height: 120px; + border: 2px dashed black; + + .uploadData{ + margin-top: 45px; + height: 50px; + } + } + + + .inputholder:hover{ + border: 2px solid red; + } +} \ No newline at end of file From 7e896da80a6255e836fc6707fa570c12a2f38c70 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 15:39:02 -0600 Subject: [PATCH 066/822] the ga script might work --- public/index.html | 39 ++++++++++++++------------------------- src/config/analytics.js | 18 ++++++++++-------- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/public/index.html b/public/index.html index 34d8e7d..a8b2659 100644 --- a/public/index.html +++ b/public/index.html @@ -14,34 +14,23 @@ Gróa + + +
- - - diff --git a/src/config/analytics.js b/src/config/analytics.js index 4b3d83a..8539d17 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -4,10 +4,12 @@ import { createBrowserHistory } from "history"; // article source: https://levelup.gitconnected.com/using-google-analytics-with-react-3d98d709399b export default function reactGAinitialization() { - ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { - // debug: true // please take me out when debugging is done. - standardImplementation: true - }); + console.log(process.env.REACT_APP_ANALYTICS_ID_TEST); + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); + // , { + // debug: true // please take me out when debugging is done. + // standardImplementation: true + // }); // sets any user spefic data that we might want to track. // ReactGA.set({ @@ -15,10 +17,10 @@ export default function reactGAinitialization() { // }); // initialize google analytics page view tracking - createBrowserHistory().listen(location => { - ReactGA.set({ page: location.pathname }); // Update the user's current page - ReactGA.pageview(location.pathname); // Record a pageview for the given page - }); + // createBrowserHistory().listen(location => { + // ReactGA.set({ page: location.pathname }); // Update the user's current page + // ReactGA.pageview(location.pathname); // Record a pageview for the given page + // }); // can add modalviews // ReactGA.modalview({route uri}) From 752cf6004fcf94dfb535c0d5cec6b24dc4dbbe45 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:36:48 -0600 Subject: [PATCH 067/822] added initialization to useEffect --- public/index.html | 4 ++-- src/App.js | 8 ++++---- src/App.test.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/index.html b/public/index.html index a8b2659..a08c3fd 100644 --- a/public/index.html +++ b/public/index.html @@ -15,7 +15,7 @@ Gróa - @@ -27,7 +27,7 @@ gtag("js", new Date()); gtag("config", "UA-159194392-1"); - + --> diff --git a/src/App.js b/src/App.js index 517bf58..283bec9 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ -import React from "react"; +import React, { useEffect } from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; -import { createBrowserHistory } from "history"; +// import { createBrowserHistory } from "history"; // local imports // import Dashboard from "./components/dashboard/index.js"; @@ -13,10 +13,10 @@ import WatchList from "./components/movies/WatchList.js"; import reactGAinitialization from "./config/analytics.js"; function App() { - reactGAinitialization(); + useEffect(() => reactGAinitialization(), []); return ( - +
{/* */} diff --git a/src/App.test.js b/src/App.test.js index 27a50d5..62c9644 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -8,7 +8,7 @@ import App from "./App.js"; // creating a mock function to test if GA initialization was called. import reactGAinitialization from "./config/analytics.js"; jest.mock("./config/analytics.js"); -reactGAinitialization.mockImplementation(() => true); +reactGAinitialization.mockImplementation(() => () => null); it("renders App component", () => { const { container } = render(); From 17a0fa81fa3faadfa83317e3f6e1fc776ac2b399 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:42:54 -0600 Subject: [PATCH 068/822] added logPageView function --- src/config/analytics.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index 8539d17..aa662fd 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -3,14 +3,20 @@ import { createBrowserHistory } from "history"; // article source: https://levelup.gitconnected.com/using-google-analytics-with-react-3d98d709399b +function logPageView() { + ReactGA.set({ page: window.location.pathname }); + ReactGA.pageview(window.location.pathname); +} + export default function reactGAinitialization() { - console.log(process.env.REACT_APP_ANALYTICS_ID_TEST); ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); // , { // debug: true // please take me out when debugging is done. // standardImplementation: true // }); + logPageView(); + // sets any user spefic data that we might want to track. // ReactGA.set({ // userId: 1 // hard coded until I can dynamically recieve userIds From c2019608b8e32922bdb81888e47dd67d396f63ad Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:48:37 -0600 Subject: [PATCH 069/822] react-ga worksgit add .! trying to add standard impl --- package.json | 1 - public/index.html | 37 ++++++++++++++++++++++++------------- src/config/analytics.js | 9 ++++----- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index aee99e1..caf355b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "dotenv": "^8.2.0", - "history": "^4.10.1", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", "react": "^16.12.0", diff --git a/public/index.html b/public/index.html index a08c3fd..18966a8 100644 --- a/public/index.html +++ b/public/index.html @@ -14,20 +14,31 @@ Gróa - - --> + (function(i, s, o, g, r, a, m) { + i["GoogleAnalyticsObject"] = r; + (i[r] = + i[r] || + function() { + (i[r].q = i[r].q || []).push(arguments); + }), + (i[r].l = 1 * new Date()); + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); + })( + window, + document, + "script", + "<%=htmlWebpackPlugin.options.analyticsURL%>", + "ga" + ); + ga("create", "UA-XXX-X", "auto"); + ga("send", "pageview"); + + diff --git a/src/config/analytics.js b/src/config/analytics.js index aa662fd..67806fb 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -9,11 +9,10 @@ function logPageView() { } export default function reactGAinitialization() { - ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); - // , { - // debug: true // please take me out when debugging is done. - // standardImplementation: true - // }); + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { + // debug: true // please take me out when debugging is done. + standardImplementation: true + }); logPageView(); From 10abe40e045f9336c35b0305e171bdbb9016e848 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:55:19 -0600 Subject: [PATCH 070/822] standard did not work --- public/index.html | 4 ++-- src/config/analytics.js | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/public/index.html b/public/index.html index 18966a8..3616188 100644 --- a/public/index.html +++ b/public/index.html @@ -15,7 +15,7 @@ Gróa - --> diff --git a/src/config/analytics.js b/src/config/analytics.js index 67806fb..d200710 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -9,10 +9,7 @@ function logPageView() { } export default function reactGAinitialization() { - ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST, { - // debug: true // please take me out when debugging is done. - standardImplementation: true - }); + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); logPageView(); From d1cc65ae53309ad0a8eb2fc1dec54274bbc208d3 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:59:09 -0600 Subject: [PATCH 071/822] cleaned analytics.js --- src/config/analytics.js | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index d200710..1f88c94 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -1,7 +1,4 @@ import ReactGA from "react-ga"; -import { createBrowserHistory } from "history"; - -// article source: https://levelup.gitconnected.com/using-google-analytics-with-react-3d98d709399b function logPageView() { ReactGA.set({ page: window.location.pathname }); @@ -12,26 +9,4 @@ export default function reactGAinitialization() { ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); logPageView(); - - // sets any user spefic data that we might want to track. - // ReactGA.set({ - // userId: 1 // hard coded until I can dynamically recieve userIds - // }); - - // initialize google analytics page view tracking - // createBrowserHistory().listen(location => { - // ReactGA.set({ page: location.pathname }); // Update the user's current page - // ReactGA.pageview(location.pathname); // Record a pageview for the given page - // }); - - // can add modalviews - // ReactGA.modalview({route uri}) - - // loading times of js libraries? <-- waiting to hook up to proper domain name for google analytics. - // ReactGA.timing({ - // category: "JS Libraries", - // variable: "load", - // value: 20, - // label: "CDN libs" - // }); } From 9b4ba39e7bdd09bb3cc1e2864de22369b291544c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 16:59:29 -0600 Subject: [PATCH 072/822] cleaned up html --- public/index.html | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/public/index.html b/public/index.html index 3616188..d9973c9 100644 --- a/public/index.html +++ b/public/index.html @@ -14,31 +14,6 @@ Gróa - - - From 1a61ddaa8ce3e44355c83836c9e4d1b541eb9d28 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 17:00:10 -0600 Subject: [PATCH 073/822] removed import for deleted package --- src/App.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/App.js b/src/App.js index 283bec9..1d63aa9 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,5 @@ import React, { useEffect } from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; -// import { createBrowserHistory } from "history"; // local imports // import Dashboard from "./components/dashboard/index.js"; From 07a10c10a229d3836d0c2b8f8ce41311d6d6c0e9 Mon Sep 17 00:00:00 2001 From: marielapg Date: Wed, 26 Feb 2020 15:15:29 -0800 Subject: [PATCH 074/822] added scss file --- src/components/dashboard/navigation.js | 31 ++++++++++++++++++++++++ src/components/dashboard/navigation.scss | 0 2 files changed, 31 insertions(+) create mode 100644 src/components/dashboard/navigation.scss diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index e69de29..5edb2d5 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -0,0 +1,31 @@ +import React from 'react'; + + +function Navigation (){ + + + return( + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+ ) +} + +export default Navigation; \ No newline at end of file diff --git a/src/components/dashboard/navigation.scss b/src/components/dashboard/navigation.scss new file mode 100644 index 0000000..e69de29 From db6a16a980826d567bd841df78f8d68cde9bf248 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 26 Feb 2020 18:22:04 -0500 Subject: [PATCH 075/822] working --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 865846d..7aa70b2 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,7 +14,7 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/3/upload', data,{ + axios.post('https://stylingbranch-groa-be.herokuapp.com/api/users/3/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } From 24c4a47b2728adf085252dfed90a89a8c4751395 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 26 Feb 2020 18:38:23 -0500 Subject: [PATCH 076/822] changed username to user_name --- src/components/auth/login.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index c90f068..1a2a35d 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -13,11 +13,11 @@ class LoginPage extends React.Component { this.state = { user: { - username: '', + user_name: '', password: '' }, errors: { - username: '', + user_name: '', password: '' } @@ -38,10 +38,10 @@ class LoginPage extends React.Component { }, }); switch (name) { - case 'username' : - errors.username = + case 'user_name' : + errors.user_name = value.length < 5 - ? 'must be a valid username' + ? 'must be a valid user name' : ''; break; case 'password': @@ -72,8 +72,7 @@ class LoginPage extends React.Component { localStorage.setItem('token', res.data.payload); console.log(res.data.payload) // redirect to Groas dashboard page - this.setState({submitted: true}); - if (this.user.username && this.user.password) { + if (this.user.user_name && this.user.password) { this.props.history.push('/'); } @@ -113,19 +112,19 @@ class LoginPage extends React.Component {

Log in

-
+
{/* ERROR MESSAGE */} - {errors.username.length > 0 && - {errors.username}} + {errors.user_name.length > 0 && + {errors.user_name}} Date: Wed, 26 Feb 2020 18:17:25 -0600 Subject: [PATCH 077/822] showing that routing on push does work --- src/components/layout/LoadingScreen.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index f596fac..7053fd1 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,9 +1,13 @@ import React, { useState, useEffect } from "react"; import popMovieQuote from "popular-movie-quotes"; // src: https://www.npmjs.com/package/popular-movie-quotes -export default function LoadingScreen() { +export default function LoadingScreen({ history }) { const [movieQuote, setMovieQuote] = useState("Loading..."); + const pushTo = () => { + history.push("/watch-list"); + }; + useEffect(() => { setMovieQuote(popMovieQuote.getSomeRandom(1)[0]); }, []); @@ -13,6 +17,8 @@ export default function LoadingScreen() {

"{movieQuote.quote}"

-{movieQuote.movie}

Year: {movieQuote.year}

+ +
); } From ae4a12ee1bb11f5d6e889f676c75f89c8a0ee72c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 19:52:14 -0600 Subject: [PATCH 078/822] added a function to remove data-test attrs from production --- src/utils/removeAttribute.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/utils/removeAttribute.js diff --git a/src/utils/removeAttribute.js b/src/utils/removeAttribute.js new file mode 100644 index 0000000..05b0363 --- /dev/null +++ b/src/utils/removeAttribute.js @@ -0,0 +1,6 @@ +export function ifDev(val) { + console.log("node env", process.env.NODE_ENV); + if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") + return val; + else return undefined; +} From 915949d14ba92da203c656841779e9f5b8f0c9e3 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 19:52:39 -0600 Subject: [PATCH 079/822] implemented the ifDev fn where I used data-test attrs --- src/App.js | 3 ++- src/components/layout/LoadingScreen.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 1d63aa9..64d4e2e 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,6 @@ import React, { useEffect } from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; +import { ifDev } from "./utils/removeAttribute.js"; // local imports // import Dashboard from "./components/dashboard/index.js"; @@ -16,7 +17,7 @@ function App() { return ( -
+
{/* */} {/* diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 7053fd1..ab68aa0 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,4 +1,5 @@ import React, { useState, useEffect } from "react"; +import { ifDev } from "../../utils/removeAttribute.js"; import popMovieQuote from "popular-movie-quotes"; // src: https://www.npmjs.com/package/popular-movie-quotes export default function LoadingScreen({ history }) { @@ -13,7 +14,7 @@ export default function LoadingScreen({ history }) { }, []); return ( -
+

"{movieQuote.quote}"

-{movieQuote.movie}

Year: {movieQuote.year}

From 21b62a824483908162c7a98b483997dccf345a84 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 26 Feb 2020 19:55:30 -0600 Subject: [PATCH 080/822] added a comment how the ifDev fn works --- src/utils/removeAttribute.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils/removeAttribute.js b/src/utils/removeAttribute.js index 05b0363..7967013 100644 --- a/src/utils/removeAttribute.js +++ b/src/utils/removeAttribute.js @@ -1,3 +1,10 @@ +/** + * Removes data-test attributes in components in production + * @param {string} val - the string value of the data-test attribute you give to a component for testing + * @returns {val} || {undefined} + * + * note - this function works because if an attribute is undefined it will not show up in the element. + */ export function ifDev(val) { console.log("node env", process.env.NODE_ENV); if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") From 920d0c63c6e0332cc299837fe64ed7f8d420ca44 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Thu, 27 Feb 2020 08:28:46 -0500 Subject: [PATCH 081/822] testing puppeteer and register hooked with dashboard --- package-lock.json | 98 +++++++++++++ package.json | 1 + src/App.js | 11 +- src/components/auth/Register.js | 139 ++++++++++++++++--- src/components/dashboard/dashboardv1.js | 10 +- src/components/dashboard/dashboardv1.test.js | 79 +++++++++++ src/utils/axiosWithAuth.js | 13 ++ src/utils/privateRoute.js | 11 ++ 8 files changed, 332 insertions(+), 30 deletions(-) create mode 100644 src/components/dashboard/dashboardv1.test.js diff --git a/package-lock.json b/package-lock.json index cec6e38..af15257 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1509,6 +1509,11 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1875,6 +1880,11 @@ } } }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -5147,6 +5157,32 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -5217,6 +5253,14 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -6156,6 +6200,15 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9456,6 +9509,11 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -10567,6 +10625,11 @@ "ipaddr.js": "1.9.0" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10630,6 +10693,33 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "requires": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -15416,6 +15506,14 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } } } } diff --git a/package.json b/package.json index c2e6513..076ccd8 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dotenv": "^8.2.0", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", + "puppeteer": "^2.1.1", "react": "^16.12.0", "react-dom": "^16.12.0", "react-hook-form": "^4.9.6", diff --git a/src/App.js b/src/App.js index c3ee801..174807c 100644 --- a/src/App.js +++ b/src/App.js @@ -4,14 +4,21 @@ import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; import Register from './components/auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; +import { PrivateRoute } from './utils/privateRoute.js'; + + + + + function App() { return (
- + + {/* */} - + {/* */}
diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f9ded09..0e811af 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,8 +1,11 @@ import React from 'react'; import { connect } from 'react-redux'; - - +import './register.scss' +import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; +import { withRouter } from 'react-router-dom'; +import axios from 'axios'; class Register extends React.Component { + constructor(props) { super(props); @@ -12,16 +15,22 @@ class Register extends React.Component { email: '', username:'', password: '', - confirmPassword: '' + confirmpassword: '' + }, + submitted: false, + input: { + file:"", + movies:"" }, - submitted: false }; this.handleChange = this.handleChange.bind(this); + this.changeHandler = this.changeHandler.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { + console.log(event.target.value) const { name, value } = event.target; const { user } = this.state; this.setState({ @@ -29,22 +38,86 @@ class Register extends React.Component { ...user, [name]: value } + + + }); + } + + changeHandler(e) { + + let data = new FormData() + data.append('movies', e.target.files[0] , e.target.files[0].name) + + console.log('data change handler', data); + const { input } = this.state; + this.setState({ + input: { + + [e.target.name]: data + } + + }); } handleSubmit(event) { event.preventDefault(); - + this.setState({ submitted: true }); - const { user } = this.state; - if (user.email && user.username && user.password && user.ConfirmPassword) { - this.props.register(user); + console.log('username, and password', this.state.user.username, this.state.user.password) + // const { user } = this.state; + if (this.state.user.email && this.state.user.username && this.state.user.password && this.state.user.confirmpassword) { + // this.props.register(user); + console.log('username, and password', this.state.user.username, this.state.user.password) + + axiosWithAuth() + .post('/register', {username: this.state.user.username, password: this.state.user.password}) + .then(res => { + axiosWithAuth() + .post('/login', {username: this.state.user.username, password: this.state.user.password}) + .then(res2 => { + console.log('nested login successful', res) + localStorage.setItem('token', res.data.token) + const userid = res.data.id; + this.props.history.push('/dashboard') + + + console.log('form data', this.state.input.movies) + + + axios.post(`https://stylingbranch-groa-be.herokuapp.com/api/users/${userid}/upload`, this.state.input.movies, { + headers:{ + 'Content-Type':'multipart/form-data' + } + }) + .then(res => { + console.log(res); + + }).catch(err => { + console.log(err) + }) + + }) + .catch(err2 => { + console.log(err2) + this.props.history.push('/Error') + }) + + }) + .catch(err => { + console.log('Registration Error', err) + this.props.history.push('/Error') + }) + + + } } render() { const { registering } = this.props; const { user, submitted } = this.state; + const { location, history } = this.props; return (
@@ -71,24 +144,24 @@ class Register extends React.Component {
- {submitted && !user.Email && + {submitted && !user.email &&
Email is required
}
- {submitted && !user.Username && + {submitted && !user.username &&
Username is required
} @@ -105,15 +178,15 @@ class Register extends React.Component { } -
-
+ - {submitted && !user.ConfirmPassword && + {submitted && !user.confirmpassword &&
Confirm Password is required
} @@ -129,10 +202,30 @@ class Register extends React.Component {

_________________________ or ________________________

- + {/* - + */} + {/*
+ */} + + + +

upload your letterboxd csv file here to get all past movie ratings

+ {/* +
*/}
{registering} @@ -158,5 +251,5 @@ const mapStateToProps = state => { }; }; -export default connect -(mapStateToProps)(Register); \ No newline at end of file +export default withRouter(connect +(mapStateToProps)(Register)); \ No newline at end of file diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 7aa70b2..0555e28 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,7 +14,7 @@ const Dashboardv1 = () => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('https://stylingbranch-groa-be.herokuapp.com/api/users/3/upload', data,{ + axios.post('https://stylingbranch-groa-be.herokuapp.com/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -72,7 +72,7 @@ const Dashboardv1 = () => { return ( -
+

Welcome to the dashboard.

@@ -96,15 +96,15 @@ const Dashboardv1 = () => {

upload your letterboxd csv file here to get all past movie ratings

{/*
Container for settings
*/} -
+
{ratings.length > 0 ? ratings.map((x, index) => { - if(index < 200){ + if(index < 201){ return ( -
+
{/*
Looks Cool šŸ‘Ž Not interested šŸ‘ diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js new file mode 100644 index 0000000..da46725 --- /dev/null +++ b/src/components/dashboard/dashboardv1.test.js @@ -0,0 +1,79 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; +import puppeteer from 'puppeteer'; + +// component to be tested. +import Dashboardv1 from "./dashboardv1.js"; + +it("renders dashboardv1", () => { + const { container } = render(); + + const component = getAllByTestId(container, "dashboard-screen"); + expect(component.length).toBe(1); +}); +it("renders dashboardv1", () => { + const { container } = render(); + + const component = getAllByTestId(container, "box-container"); + expect(component.length).toBe(1); +}); +it("renders dashboardv1", () => { + const { container } = render(); + + const component = getAllByTestId(container, "box"); + expect(component.length).toBe(200); +}); + +//------------puppeteer +test('Validating movie form button', async() => { + const browser = await puppeteer.launch({headless:false,defaultViewport: null}); + const page = await browser.newPage(); + + await page.goto('localhost:3000/') + await page.waitFor(4000); + await page.waitForSelector('.forms') + // await page.$eval('input[name=email]', el => el.value = 'puppeteertj123@gmail.com'); + // await page.waitFor(400); + // await page.$eval('input[name=username]', el => el.value = 'puppeteer3'); + // await page.waitFor(400); + // await page.$eval('input[name=password]', el => el.value = 'Groa123'); + // await page.waitFor(400); + // await page.$eval('input[name=confirmpassword]', el => el.value = 'Groa123'); + // await page.waitFor(2000) + await page.click('input[name=email]') + await page.keyboard.type('puppeteertj123@gmail.com'); + await page.waitFor(300); + await page.click('input[name=username]') + await page.keyboard.type('puppeteer8'); + await page.waitFor(300); + await page.click('input[name=password]') + await page.keyboard.type('Groa123'); + await page.waitFor(300); + await page.click('input[name=confirmpassword]') + await page.keyboard.type('Groa123'); + + const movieInput = await page.$eval('input#confirmPass', (input) => input.className); + expect(movieInput).toBe('form-control') + + await page.waitFor(1500); + + + + // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); + // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; + + // await inputUploadHandle.uploadFile(fileToUpload); + + + + // await page.click('.LoginBtn'); + + + + + + + +},20000) + diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index e69de29..5b87864 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -0,0 +1,13 @@ +import axios from 'axios' + +export const axiosWithAuth = () => { + const token = localStorage.getItem('token') + + return axios.create({ + baseURL: 'https://stylingbranch-groa-be.herokuapp.com/api/users', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `${token}` + } + }) +} \ No newline at end of file diff --git a/src/utils/privateRoute.js b/src/utils/privateRoute.js index e69de29..7c2bb95 100644 --- a/src/utils/privateRoute.js +++ b/src/utils/privateRoute.js @@ -0,0 +1,11 @@ +import React from 'react' +import { Route, Redirect } from 'react-router-dom' + +export const PrivateRoute = ({ component: Component, ...rest }) => ( + + localStorage.getItem('token') ? + () + : + () + } /> +) \ No newline at end of file From fee70df178c6c96c7475e1628c0a66b945ec2804 Mon Sep 17 00:00:00 2001 From: marielapg Date: Thu, 27 Feb 2020 08:45:17 -0800 Subject: [PATCH 082/822] changed username --- src/components/auth/Register.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f9ded09..2119e9d 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -10,7 +10,7 @@ class Register extends React.Component { user: { email: '', - username:'', + user_name:'', password: '', confirmPassword: '' }, @@ -80,16 +80,16 @@ class Register extends React.Component {
Email is required
} -
+
- {submitted && !user.Username && -
Username is required
+ {submitted && !user.User_name && +
User_name is required
}
From 62a53c81563748abf9222a499c9b14f2b929941c Mon Sep 17 00:00:00 2001 From: marielapg Date: Thu, 27 Feb 2020 09:16:07 -0800 Subject: [PATCH 083/822] commited changes --- src/components/dashboard/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index c6036ed..1f6d02e 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,4 +1,4 @@ -import React, {useState} from 'react'; +import React from 'react'; import Dashboardv1 from './dashboardv1'; import Navigation from './navigation.js'; From f9331fb5091175906f138202957fe870f4c9c9f6 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 27 Feb 2020 17:40:46 -0500 Subject: [PATCH 084/822] commented out text for now, simplified --- src/components/auth/login.js | 46 ++++++++++++++++++++++------------ src/components/auth/login.scss | 3 ++- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 1a2a35d..dc3b592 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -1,5 +1,6 @@ import React from 'react'; import axiosWithAuth from '../../utils/axiosWithAuth' +import { NavLink } from "react-router-dom"; import { connect } from 'react-redux'; import {loginAction} from '../../store/actions/loginAction'; @@ -55,7 +56,7 @@ class LoginPage extends React.Component { } this.setState({errors, [name]: value}, ()=> { - console.log(errors) + }) }; @@ -69,16 +70,15 @@ class LoginPage extends React.Component { .post("/api/users/login", this.state.user) .then(res => { - localStorage.setItem('token', res.data.payload); - console.log(res.data.payload) - // redirect to Groas dashboard page + localStorage.setItem('token', res.data.token); + //redirect to Groas dashboard page if (this.user.user_name && this.user.password) { this.props.history.push('/'); } }) .catch(err => console.log(err)); - console.log('Login error post') + }; @@ -92,20 +92,21 @@ class LoginPage extends React.Component {
GroaLogo -

Register

+ {/*

Register

*/} + {/*

Register

*/}

Your movies,
your way.

-
+ {/*
Groa helps you pick the perfect film.
So you can save your popcorn for the good stuff.
-
+
*/}
@@ -127,7 +128,7 @@ class LoginPage extends React.Component { {errors.user_name}}
-

or

+ {/*
*/} + + + {/*
*/} + + {/*

or

*/} - {/* Log in Google */} - - {/* Log in Facebook */} - - {/* Log in Reddit */} - + {/* Log in Google */} + {/* */} + {/* Log in Facebook */} + {/* */} + {/* Log in Reddit */} + {/* */}
+ +
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index ba5d544..0a39770 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -29,7 +29,8 @@ .Register{ color: white; padding: 3% 0 0 4%; - //border: 2px solid red; + text-decoration: none; + } } From 4304e6aa38c545bbe56372d560052b3e01c7d978 Mon Sep 17 00:00:00 2001 From: marielapg Date: Thu, 27 Feb 2020 15:37:13 -0800 Subject: [PATCH 085/822] added nav bar --- package-lock.json | 37 +++++++++ package.json | 4 + src/App.js | 3 + src/components/dashboard/navigation.js | 95 +++++++++++++++++++----- src/components/dashboard/navigation.scss | 41 ++++++++++ 5 files changed, 163 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index cec6e38..592d6c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1047,6 +1047,43 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.27.tgz", + "integrity": "sha512-97GaByGaXDGMkzcJX7VmR/jRJd8h1mfhtA7RsxDBN61GnWE/PPCZhOdwG/8OZYktiRUF0CvFOr+VgRkJrt6TWg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.27.tgz", + "integrity": "sha512-sOD3DKynocnHYpuw2sLPnTunDj7rLk91LYhi2axUYwuGe9cPCw7Bsu9EWtVdNJP+IYgTCZIbyARKXuy5K/nv+Q==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.27" + } + }, + "@fortawesome/free-regular-svg-icons": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.12.1.tgz", + "integrity": "sha512-bGda18seHXb+24K6DPUFzqn4kG7B+JViP/BscMcNUXvT00M86xNhdgP2TXSdflQXn53QWqymKjx/8rhaDOJyhA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.27" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.1.tgz", + "integrity": "sha512-k3MwRFFUhyL4cuCJSaHDA0YNYMELDXX0h8JKtWYxO5XD3Dn+maXOMrVAAiNGooUyM2v/wz/TOaM0jxYVKeXX7g==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.27" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz", + "integrity": "sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw==", + "requires": { + "prop-types": "^15.5.10" + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", diff --git a/package.json b/package.json index c2e6513..7608f6a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.27", + "@fortawesome/free-regular-svg-icons": "^5.12.1", + "@fortawesome/free-solid-svg-icons": "^5.12.1", + "@fortawesome/react-fontawesome": "^0.1.8", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", diff --git a/src/App.js b/src/App.js index 33d6ac4..197d0e2 100644 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,8 @@ import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; import LoadingScreen from "./components/layout/LoadingScreen.js"; +import Navigation from "./components/dashboard/navigation.js"; + function App() { return ( @@ -13,6 +15,7 @@ function App() { {/* */} {/* */} +
); diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 5edb2d5..a66aeb9 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -1,31 +1,92 @@ -import React from 'react'; +import React, { Component } from 'react'; +import { NavLink } from "react-router-dom"; +import { faSearch,faUserCircle,faAngleDown } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import "../dashboard/navigation.scss"; +import {faBell, faQuestionCircle} from '@fortawesome/free-regular-svg-icons'; -function Navigation (){ +class Navigation extends Component { + state = { - return( + search: '' + }; + -
-
-
+ handleChange = e =>{ + this.setState({search: e.target.value}) + } + + render() { + return( -
-
- -
-
+
-
-
+
+ + + Groa + -
-
+ + Trending + + + Recommended + + + Watchlist + -
- ) + + Explore + +
+ + +
+ + +
+ + + + + + + + + + + + +
+ ) + } } export default Navigation; \ No newline at end of file diff --git a/src/components/dashboard/navigation.scss b/src/components/dashboard/navigation.scss index e69de29..cf9392b 100644 --- a/src/components/dashboard/navigation.scss +++ b/src/components/dashboard/navigation.scss @@ -0,0 +1,41 @@ +.mainContainer{ + border: 2px solid red; + background: #373737; + margin: 30px; + display: flex; + justify-content: space-evenly; + + + .Links{ + width: 75%; + display: flex; + justify-content: space-evenly; + + .NavLink{ + color: white; + text-decoration: none; + } + } + + .searchContainer { + border: 1px solid black; + border-radius: 5px; + width: 200px; + padding-left: 15px; + background:white ; + + .search-icon{ + padding-left: 10px; + } + + .searchBox { + padding: 0.5rem; + } + } + + .bell-icon, .question-icon, .user-circle-icon, .angle-down-icon{ + color: white; + + } + +} \ No newline at end of file From e239223dbc25771ea5be702597f4a633ca2cd746 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 27 Feb 2020 18:53:22 -0500 Subject: [PATCH 086/822] changed export to say DataUpload --- src/components/auth/dataUpload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 6bef263..3b33756 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,7 +1,7 @@ import React, {useState} from 'react'; import axios from 'axios'; -export default function PostLogin() { +export default function DataUpload() { From b3b5ab0a97ea679814732e23f1b1ca7b95169554 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 28 Feb 2020 11:31:48 -0500 Subject: [PATCH 087/822] added text back in --- src/components/auth/login.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index dc3b592..cf01305 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -92,21 +92,21 @@ class LoginPage extends React.Component {
GroaLogo - {/*

Register

*/} +

Register

{/*

Register

*/}

Your movies,
your way.

- {/*
+
Groa helps you pick the perfect film.
So you can save your popcorn for the good stuff.
-
*/} +
From d7c7550526f55694166116a0d8572bc7ee7dd09c Mon Sep 17 00:00:00 2001 From: marielapg Date: Fri, 28 Feb 2020 14:12:22 -0800 Subject: [PATCH 088/822] comment out the left box --- src/components/auth/Register.js | 4 ++-- src/components/auth/register.scss | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 42c2949..0c0ed29 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -130,11 +130,11 @@ class Register extends React.Component {

Your movies, your way.

-
+ {/*
Groa Helps you pick the perfect film,
So you can save your popcorn for the good stuff.
-
+
*/}
diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index 28d6d54..6100ad8 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -19,10 +19,11 @@ .text{ font-size:320%; color: white; - margin: 0 0 0 15%; - display: flex; - flex-direction: column; - justify-content: flex-start; + // margin: 0 0 0 15%; + // display: flex; + // // flex-direction: column; + // // justify-content: center; + padding:15% ; } From c174d246da2e3ebe7ccb5555af93b84f5e46a388 Mon Sep 17 00:00:00 2001 From: marielapg Date: Fri, 28 Feb 2020 15:14:22 -0800 Subject: [PATCH 089/822] navigation bar --- src/components/dashboard/navigation.js | 14 ++++++++-- src/components/dashboard/navigation.scss | 34 +++++++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index a66aeb9..0d14dc6 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { NavLink } from "react-router-dom"; -import { faSearch,faUserCircle,faAngleDown } from '@fortawesome/free-solid-svg-icons'; +import { faSearch,faUserCircle,faAngleDown,faBars } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import "../dashboard/navigation.scss"; import {faBell, faQuestionCircle} from '@fortawesome/free-regular-svg-icons'; @@ -22,10 +22,18 @@ class Navigation extends Component { return(
+
+ + +
+
- + Groa @@ -84,6 +92,8 @@ class Navigation extends Component { icon={faAngleDown} /> + +
) } diff --git a/src/components/dashboard/navigation.scss b/src/components/dashboard/navigation.scss index cf9392b..29c7dab 100644 --- a/src/components/dashboard/navigation.scss +++ b/src/components/dashboard/navigation.scss @@ -1,15 +1,33 @@ .mainContainer{ - border: 2px solid red; background: #373737; margin: 30px; display: flex; justify-content: space-evenly; + padding: 10px; + + .Bars{ + background: rgba(255, 255, 255, 0.24); + width: 230px; + .bars-icon{ + color: white; + padding: 10px; + font-size: 140%; + } + } .Links{ - width: 75%; + width: 60%; display: flex; justify-content: space-evenly; + padding: 10px; + + .Groa{ + font-size: 20px ; + font-weight: bold; + color: white; + text-decoration: none; + } .NavLink{ color: white; @@ -20,22 +38,30 @@ .searchContainer { border: 1px solid black; border-radius: 5px; - width: 200px; + width: 250px; padding-left: 15px; background:white ; + padding-top: 5px; + margin-right: 30px; .search-icon{ padding-left: 10px; + } .searchBox { + border: 2px solid white; padding: 0.5rem; + text-decoration: none; + font-size: 16px; } } .bell-icon, .question-icon, .user-circle-icon, .angle-down-icon{ color: white; - + padding: 10px; + font-size: 140%; + margin-right: 10px; } } \ No newline at end of file From 3d01cced8c62d2fd4a167ddd29eec9e6aadff320 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Sat, 29 Feb 2020 08:29:34 -0500 Subject: [PATCH 090/822] toggle instructions almost done --- src/App.js | 6 +- src/components/auth/dataUpload.js | 101 ++++++++++++++++++++++------ src/components/auth/dataUpload.scss | 64 ++++++++++++++++-- 3 files changed, 144 insertions(+), 27 deletions(-) diff --git a/src/App.js b/src/App.js index d72f33a..75bb651 100644 --- a/src/App.js +++ b/src/App.js @@ -3,7 +3,8 @@ import { Route, Switch } from "react-router-dom"; // import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; -import LoadingScreen from "./components/layout/LoadingScreen.js"; +// import LoadingScreen from "./components/layout/LoadingScreen.js"; +import DataUpload from './components/auth/dataUpload'; function App() { return ( @@ -12,7 +13,8 @@ function App() { {/* */} {/* */} - + {/* */} +
); diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 3b33756..9bc5372 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,14 +1,44 @@ import React, {useState} from 'react'; import axios from 'axios'; +import './dataUpload.scss' export default function DataUpload() { - const [input, setInput] = useState({file:''}) const [ratings, setRatings] = useState({}) const [loading, setLoading] = useState() + + + +function clikL() { + document.getElementById("myDropdownL").classList.toggle("show"); + } + +function clikR() { + document.getElementById("myDropdownR").classList.toggle("show"); + } + + window.onclick = function(event) { + if (!event.target.matches('.dropbtn')) { + var dropdowns = document.getElementsByClassName("dropdown-content"); + var i; + for (i = 0; i < dropdowns.length; i++) { + var openDropdown = dropdowns[i]; + if (openDropdown.classList.contains('show')) { + openDropdown.classList.remove('show'); + } + } + } + } + + + + + + + const handleChange = e => { let data = new FormData() data.append('movies', e.target.files[0] , e.target.files[0].name) @@ -22,6 +52,7 @@ const [input, setInput] = useState({file:''}) .then(res => { console.log(res); setRatings(res.data) + // this.props.history.push('/dashboard'); }).catch(err => { console.log(err) }) @@ -58,28 +89,56 @@ return ( either LetterBoxd or IMDb:
-
-
-
-
-

1.Log in to Letterboxd

-

2.Click on your username and select SETTINGS from the dropdown menu.

-

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere - convenient like your desktop or downloads folder.

-

4.Click to browse or simply drop your .csv file below

- - - - {/* END FORM */} -
- {/* END BOX LEFT */} + + {/*
+ +
+ Home + About + Contact +
+
*/} + + +
+ +
+ +
+
+
+

1.Log in to Letterboxd

+

2.Click on your username and select SETTINGS from the dropdown menu.

+

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere + convenient like your desktop or downloads folder.

+

4.Click to browse or simply drop your .csv file below

+
+
+
+
+ + +
+ +
+
+
+

1.Log in to IMDb

+

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

+

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

+

4.Click to browse or simply drop your .csv file below

+
+
+
+
+ + + +
-
-

1.Log in to IMDb

-

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

-

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

-

4.Click to browse or simply drop your .csv file below

+ +
diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss index 35f8a98..f292b45 100644 --- a/src/components/auth/dataUpload.scss +++ b/src/components/auth/dataUpload.scss @@ -32,9 +32,9 @@ font-weight: 500; display: flex; justify-content: center; margin-top: 2%; - + border:2px solid blue; .DboxLeft{ - width: 285px; + width: 300px; height: 500px; margin-right: 20%; @@ -48,18 +48,74 @@ font-weight: 500; } .DboxRight{ - width: 285px; + width: 300px; height: 500px; - + .boxInside{ display: flex; flex-direction: column; padding: 25px; } } + } +/////////////////////////HIDE/SHOW TEXT INFO///////////////// +////////////////////////////////////////////////////////// + +.dropbtn { + background-color: rgb(0, 123, 206); + color: white; + padding: 16px; + font-size: 16px; + border: none; + cursor: pointer; + } + + .dropbtn:hover, .dropbtn:focus { + background-color: rgb(0, 153, 255); + } + + .dropdown { + + // width: 50%; + position: relative; + display: inline-block; + border:2px solid red; + } + + +.dropdown-content { + display: none; + position: absolute; + background-color: #f1f1f1; + min-width: 160px; + overflow: auto; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; + } + + .dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + } + + .dropdown-content p { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + } + + .dropdown a:hover {background-color: #ddd;} + +.show {display: block;} + + + ////////////////////UPLOAD DATA BOX/////////////////// .UploadContainer{ // padding-top: 25px; From 0639df82c6afb6064e96018b4b70576f6e6ac13d Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Sat, 29 Feb 2020 09:43:39 -0500 Subject: [PATCH 091/822] text instructions hide/display working! --- src/components/auth/dataUpload.js | 75 ++++++++++++----------------- src/components/auth/dataUpload.scss | 71 +++++++++++---------------- 2 files changed, 57 insertions(+), 89 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 9bc5372..2ad49de 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -81,7 +81,7 @@ function clikR() { return (
-
+

Already rated movies elsewhere?

Groa lets you easily upload your ratings from @@ -89,63 +89,46 @@ return ( either LetterBoxd or IMDb:

- - {/*
- -
- Home - About - Contact -
-
*/} - - -
+ +
- +
-
+

1.Log in to Letterboxd

2.Click on your username and select SETTINGS from the dropdown menu.

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

4.Click to browse or simply drop your .csv file below

- +
+ {/* END DboxLeft*/}
+ {/* END dropdown-content*/}
+ {/* END DROPDOWN */} - +
- +
-
-

1.Log in to IMDb

-

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

-

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

-

4.Click to browse or simply drop your .csv file below

-
+

1.Log in to IMDb

+

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

+

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

+

4.Click to browse or simply drop your .csv file below

+ {/* END DboxRight*/}
+ {/* END dropdown-content*/}
- - - - -
-
- - - -
+{/* END DROPDOWN */}
-{/* END BOX RIGHT */} -
- -{/* UPLOAD FILE */} +{/* END DboxContainer */} + +{/* ///////////////UPLOAD FILE //////////////////// */}
+
+
Groa values your privacy strives to be transparent to all users. +
+ Your data will be kept strictly confidential-you're the only one + who will be able to view or access it. +
+
-
Groa values your privacy strives to be transparent to all users. -
- Your data will be kept strictly confidential-you're the only one - who will be able to view or access it. -
-{/* END BOX CONTAINER */}
-{/* END CONTAINER */} +
+// END DataUploadPage ) diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss index f292b45..c327ca6 100644 --- a/src/components/auth/dataUpload.scss +++ b/src/components/auth/dataUpload.scss @@ -5,7 +5,7 @@ .textholder1{ - justify-content: center; + h1{ display: flex; @@ -13,63 +13,42 @@ font-size: 350%; } - h2{ + h2, h3{ display: flex; justify-content: center; } - - h3{ - display: flex; - justify-content: center; - } + } .ptext{ font-weight: 500; + } .DboxContainer{ display: flex; - justify-content: center; + justify-content: space-around; margin-top: 2%; - border:2px solid blue; - .DboxLeft{ + height: 450px; + // border:2px solid blue; + .DboxLeft, .DboxRight{ width: 300px; height: 500px; - margin-right: 20%; - - .boxInside{ - display: flex; - justify-content: center; - flex-direction: column; - padding: 25px; - } - } - - .DboxRight{ - width: 300px; - height: 500px; - - .boxInside{ - display: flex; - flex-direction: column; - padding: 25px; - } - } - + } -/////////////////////////HIDE/SHOW TEXT INFO///////////////// -////////////////////////////////////////////////////////// +//////////////////HIDE/SHOW INSTRUCTION INFO- LETTERBOX/IMDB///////////////////////// +//////////////////////////////////////////////////////////////////////////////////// .dropbtn { - background-color: rgb(0, 123, 206); + background-color: rgb(0, 93, 155); color: white; padding: 16px; - font-size: 16px; + font-size: 22px; border: none; + border-radius: 6px; cursor: pointer; } @@ -77,23 +56,22 @@ font-weight: 500; background-color: rgb(0, 153, 255); } + .dropdown { - - // width: 50%; position: relative; display: inline-block; - border:2px solid red; } .dropdown-content { + display: none; position: absolute; - background-color: #f1f1f1; min-width: 160px; - overflow: auto; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - z-index: 1; + // background-color: #f1f1f1; + // overflow: auto; + // box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + // z-index: 1; } .dropdown-content a { @@ -115,7 +93,6 @@ font-weight: 500; .show {display: block;} - ////////////////////UPLOAD DATA BOX/////////////////// .UploadContainer{ // padding-top: 25px; @@ -135,8 +112,14 @@ font-weight: 500; } } - .inputholder:hover{ border: 2px solid red; } +} + +// TEXT BOTTOM SCREEN +.textholder2{ + display: flex; + justify-content: center; + } \ No newline at end of file From d6ecd1b867c09cfde81a91f994c2a725e217aac8 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 2 Mar 2020 09:51:44 -0600 Subject: [PATCH 092/822] changed analytics id var --- src/config/analytics.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config/analytics.js b/src/config/analytics.js index 1f88c94..7ff79fe 100644 --- a/src/config/analytics.js +++ b/src/config/analytics.js @@ -6,7 +6,6 @@ function logPageView() { } export default function reactGAinitialization() { - ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID_TEST); - + ReactGA.initialize(process.env.REACT_APP_ANALYTICS_ID); logPageView(); } From a93fce2562c094114cbaf532307f591a1462da76 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 12:11:41 -0500 Subject: [PATCH 093/822] dashboard --- src/components/dashboard/dashboardv1.test.js | 23 ++++++++------------ 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index da46725..cc99887 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -18,12 +18,12 @@ it("renders dashboardv1", () => { const component = getAllByTestId(container, "box-container"); expect(component.length).toBe(1); }); -it("renders dashboardv1", () => { - const { container } = render(); +// it("renders dashboardv1", () => { +// const { container } = render(); - const component = getAllByTestId(container, "box"); - expect(component.length).toBe(200); -}); +// const component = getAllByTestId(container, "box"); +// expect(component.length).toBe(200); +// }); //------------puppeteer test('Validating movie form button', async() => { @@ -45,7 +45,7 @@ test('Validating movie form button', async() => { await page.keyboard.type('puppeteertj123@gmail.com'); await page.waitFor(300); await page.click('input[name=username]') - await page.keyboard.type('puppeteer8'); + await page.keyboard.type('puppeteer10'); await page.waitFor(300); await page.click('input[name=password]') await page.keyboard.type('Groa123'); @@ -53,21 +53,16 @@ test('Validating movie form button', async() => { await page.click('input[name=confirmpassword]') await page.keyboard.type('Groa123'); - const movieInput = await page.$eval('input#confirmPass', (input) => input.className); + const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); expect(movieInput).toBe('form-control') await page.waitFor(1500); - - // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; // await inputUploadHandle.uploadFile(fileToUpload); - - - - // await page.click('.LoginBtn'); + await page.click('.LoginBtn'); @@ -75,5 +70,5 @@ test('Validating movie form button', async() => { -},20000) +},40000) From ee3cbf43bb706e836346f707596aeef826b460a6 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 2 Mar 2020 12:36:35 -0500 Subject: [PATCH 094/822] added 2 tests --- src/components/auth/login.test.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/components/auth/login.test.js diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js new file mode 100644 index 0000000..b255294 --- /dev/null +++ b/src/components/auth/login.test.js @@ -0,0 +1,23 @@ +import React from 'react'; +import { render } from '@testing-library/react'; + +import Login from './login' + +test('Login Component renders', () => { + const container = render() + console.log(container); + + const logincomponent = getAllByTestId(container, "Login"); + expect(logincomponent.length).toBe(1); + }) + +//////////////////////////////////////////////////// + +const addClick = clicked => { + return clicked + 1; +} + + test('on Login clicked', () => { + expect(addClick(0)).toBe(1); + }) + From 027322410379b902240af6447c553d435703aac3 Mon Sep 17 00:00:00 2001 From: marielapg Date: Mon, 2 Mar 2020 10:06:41 -0800 Subject: [PATCH 095/822] added comments --- src/components/auth/Register.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 0c0ed29..683f9b8 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -85,7 +85,7 @@ class Register extends React.Component { console.log('form data', this.state.input.movies) - axios.post(`https://stylingbranch-groa-be.herokuapp.com/api/users/${userid}/upload`, this.state.input.movies, { + axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/uploading`, this.state.input.movies, { headers:{ 'Content-Type':'multipart/form-data' } @@ -134,9 +134,12 @@ class Register extends React.Component {
Groa Helps you pick the perfect film,
So you can save your popcorn for the good stuff.
-
*/} +
*/} +
- + + {/* the input boxes */} +

Register

From 4a9cc8da598b7befd5f837247755881cb64d7fc4 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 14:03:14 -0500 Subject: [PATCH 096/822] changed register page styling --- src/components/auth/Groa-logo-B2.png | Bin 0 -> 50192 bytes src/components/auth/GroaWhite.png | Bin 0 -> 14132 bytes src/components/auth/Register.js | 38 +++++++++++++++------------ src/components/auth/register.scss | 29 +++++++++++++------- 4 files changed, 41 insertions(+), 26 deletions(-) create mode 100644 src/components/auth/Groa-logo-B2.png create mode 100644 src/components/auth/GroaWhite.png diff --git a/src/components/auth/Groa-logo-B2.png b/src/components/auth/Groa-logo-B2.png new file mode 100644 index 0000000000000000000000000000000000000000..6318373aee70f90c9808245ee41b90c97228c37c GIT binary patch literal 50192 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 literal 0 HcmV?d00001 diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 0e811af..acc16ea 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -4,6 +4,8 @@ import './register.scss' import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; import { withRouter } from 'react-router-dom'; import axios from 'axios'; +import Groa from './Groa-logo-B2.png'; +import GroaWhite from './GroaWhite.png' class Register extends React.Component { constructor(props) { @@ -100,7 +102,7 @@ class Register extends React.Component { }) .catch(err2 => { console.log(err2) - this.props.history.push('/Error') + // this.props.history.push('/Error') }) }) @@ -125,16 +127,17 @@ class Register extends React.Component {
-
-
-

Your movies, your way.

-
+
+ + groa logo + {/*

Your movies, your way.

*/} + -
-
+ {/*
*/} + {/*
Groa Helps you pick the perfect film,
So you can save your popcorn for the good stuff.
-
+
*/}
@@ -198,9 +201,13 @@ class Register extends React.Component {
Remember me
+
+ + {registering}
- -

_________________________ or ________________________

+
+ + {/*

_________________________ or ________________________

*/} {/* @@ -209,7 +216,7 @@ class Register extends React.Component { {/*
*/} - + /> */} -

upload your letterboxd csv file here to get all past movie ratings

+ {/*

upload your letterboxd csv file here to get all past movie ratings

*/} {/*
*/} -
- - {registering} -
+ diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index 28d6d54..eb1f50f 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -1,8 +1,9 @@ .container{ + margin-top: -50px; min-height: 100vh; background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - + h3{ color:white; display: flex; @@ -13,18 +14,25 @@ display: flex; .boxLeft{ + height: 30%; width: 50%; padding: 1px 20px; + .logo{ + height: 600px; + margin-left:100px;; + object-fit: contain; + // border: 2px solid red; + } } - .text{ - font-size:320%; - color: white; - margin: 0 0 0 15%; - display: flex; - flex-direction: column; - justify-content: flex-start; + // .text{ + // font-size:320%; + // color: white; + // margin: 0 0 0 15%; + // display: flex; + // flex-direction: column; + // justify-content: flex-start; - } + // } .box1{ margin: -15% 2% 2% 0; @@ -100,6 +108,9 @@ .BottomLogin { display: flex; justify-content: flex-end; + + + margin-left: 100px; .LoginBtn{ margin: 4% 12% 0 0; width: 115px; From 50385197e50bf2365879904d6120b423d2315ce2 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 14:07:08 -0500 Subject: [PATCH 097/822] took away loading --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index b2f9747..2a66e48 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -129,7 +129,7 @@ const Dashboardv1 = () => { ) } }) - : loading} + : true} {toggle == true ?
From 399be3d35df262b3173b68c8e2d1e9dbfc69afa8 Mon Sep 17 00:00:00 2001 From: marielapg Date: Mon, 2 Mar 2020 11:14:20 -0800 Subject: [PATCH 098/822] idk --- src/components/auth/Register.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 683f9b8..a18613d 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -127,7 +127,7 @@ class Register extends React.Component {
-

Your movies, your way.

+ {/*

Your movies, your way.

*/}
{/*
@@ -203,7 +203,7 @@ class Register extends React.Component {
Remember me
-

_________________________ or ________________________

+ {/*

_________________________ or ________________________

*/} {/* From 91a2a01160a116660076056987072c9c746710ba Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 2 Mar 2020 14:24:27 -0500 Subject: [PATCH 099/822] added large groa logo --- src/GroaLogoBen.png | Bin 29996 -> 0 bytes src/components/auth/Groa-logo-B2.png | Bin 0 -> 14132 bytes src/components/auth/login.js | 17 ++++++++------- src/components/auth/login.scss | 31 ++++++++++++++++++--------- src/components/auth/login.test.js | 2 +- 5 files changed, 31 insertions(+), 19 deletions(-) delete mode 100644 src/GroaLogoBen.png create mode 100644 src/components/auth/Groa-logo-B2.png diff --git a/src/GroaLogoBen.png b/src/GroaLogoBen.png deleted file mode 100644 index bc3c507b6e8ee39d2e9b02154ad1af4c209eeb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29996 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 literal 0 HcmV?d00001 diff --git a/src/components/auth/login.js b/src/components/auth/login.js index cf01305..156ef9b 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -5,7 +5,7 @@ import { NavLink } from "react-router-dom"; import { connect } from 'react-redux'; import {loginAction} from '../../store/actions/loginAction'; import './login.scss'; -import GroaLogoBen from '../../GroaLogoBen.png' +import Groa from '../auth/Groa-logo-B2.png' class LoginPage extends React.Component { @@ -91,22 +91,23 @@ class LoginPage extends React.Component {
- GroaLogo + GroaLogo

Register

{/*

Register

*/}
-

Your movies,
your way.

-
+ GroaLogo + {/*

Your movies,
your way.

*/} + {/*
Groa helps you pick the perfect film.
So you can save your popcorn for the good stuff.
- +
-
+
*/}
@@ -152,13 +153,13 @@ class LoginPage extends React.Component { {/*
*/} - + /> */} {/*
*/} {/*

or

*/} diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 0a39770..3104cb7 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -38,14 +38,23 @@ .Middle{ display: flex; + border: 2px solid blue; + //Text Motto - your movies your way. .boxLeft{ color: white; - font-size: 300%; + // font-size: 300%; width: 70%; - //border: 2px solid blue; + border: 2px solid blue; +// LOGO BIG + .Logo2{ + + height: 40%; + // border: 2px solid red; + + } .Text{ margin: 0 0 0 1px; //margin: 0 0 0 13%; @@ -75,21 +84,21 @@ justify-content: center; padding: 35px 15px 15px 15px; - //border: 2px solid red; + } .h6text1{ padding:0 8px 30px 8px; font-size: 35px; font-weight: normal; text-align: center; - //border: 2px solid purple; + } .h6text2{ font-size: 30px; font-weight: 640; text-align: center; - //border: 2px solid purple; + } } } @@ -99,14 +108,15 @@ display: flex; justify-content: flex-end; margin-top: 3%; - //border: 2px solid red; + border: 2px solid red; //////// Login Form ///////////////// .LoginForm{ display: flex; flex-direction: column; width:518px; - height:589px; + height:310px; + // height:589px; background: #FFFFFF; } @@ -172,8 +182,8 @@ justify-content: center; .BtnContainer{ display: flex; -justify-content: flex-end; - +//justify-content: flex-end; +justify-content: center; } @@ -186,7 +196,8 @@ justify-content: flex-end; } .BtnLogin{ - margin: 4% 12% 0 0; + + // margin: 4% 12% 0 0; width: 115px; height:36px; background:#21242C; diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index b255294..60ae4be 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { render } from '@testing-library/react'; +import { render, getAllByTestId } from '@testing-library/react'; import Login from './login' From 6c9fe37a71b0a744ae0485a4f50da791b4637b28 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 2 Mar 2020 14:46:07 -0500 Subject: [PATCH 100/822] move login form down --- src/components/auth/login.scss | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 3104cb7..3b3702a 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -38,7 +38,7 @@ .Middle{ display: flex; - border: 2px solid blue; + // border: 2px solid blue; //Text Motto - your movies your way. @@ -46,7 +46,7 @@ color: white; // font-size: 300%; width: 70%; - border: 2px solid blue; + // border: 2px solid blue; // LOGO BIG .Logo2{ @@ -103,12 +103,13 @@ } } +// BOX RIGHT SIDE OF SCREEN - Login form .boxRight{ width: 50%; display: flex; justify-content: flex-end; margin-top: 3%; - border: 2px solid red; + // border: 2px solid red; //////// Login Form ///////////////// .LoginForm{ @@ -150,12 +151,10 @@ } -.textOr{ -display: flex; -justify-content: center; - - -} +// .textOr{ +// display: flex; +// justify-content: center; +// } @@ -182,8 +181,8 @@ justify-content: center; .BtnContainer{ display: flex; -//justify-content: flex-end; -justify-content: center; +justify-content: flex-end; +// justify-content: center; } @@ -197,7 +196,7 @@ justify-content: center; .BtnLogin{ - // margin: 4% 12% 0 0; + margin: 4% 12% 0 0; width: 115px; height:36px; background:#21242C; From 4718daa512c6174bd6640c724a619730a4f75830 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 14:49:19 -0500 Subject: [PATCH 101/822] changed token to be on login --- package-lock.json | 3167 +++--- src/components/auth/Register.js | 9 +- src/components/dashboard/navigation.js | 3 + yarn.lock | 12269 ----------------------- 4 files changed, 1558 insertions(+), 13890 deletions(-) delete mode 100644 yarn.lock diff --git a/package-lock.json b/package-lock.json index 073c4ef..4cb8dbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,20 +13,13 @@ } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz", + "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==", "requires": { "browserslist": "^4.8.5", "invariant": "^2.2.4", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/core": { @@ -51,10 +44,18 @@ "source-map": "^0.5.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "source-map": { "version": "0.5.7", @@ -64,11 +65,11 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.6.tgz", + "integrity": "sha512-4bpOR5ZBz+wWcMeVtcf7FbjcFzCp+817z2/gHNncIRcM9MmKzUhtWCYAq27RAfUrAFwb+OCG1s9WEaVxfi6cjg==", "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -118,42 +119,36 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.6.tgz", + "integrity": "sha512-UrJdk27hKVJSnibFcUWYLkCL0ZywTUoot8yii1lsHJcvwrypagmYKjHLMWivQPm4s6GdyygCL8fiH5EYLxhQwQ==", "requires": { - "@babel/compat-data": "^7.8.4", + "@babel/compat-data": "^7.8.6", "browserslist": "^4.8.5", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz", + "integrity": "sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A==", "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" } @@ -220,15 +215,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", + "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.8.6", "lodash": "^4.17.13" } }, @@ -266,14 +262,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { @@ -325,9 +321,9 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.6.tgz", + "integrity": "sha512-trGNYSfwq5s0SgM1BMEB8hX3NDmO7EP2wsDGDexiaKMB92BaRpS+qZfpkMqUBhcsOTBwNy9B/jieo4ad/t/z2g==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.8.3", @@ -570,16 +566,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz", + "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==", "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", "@babel/helper-function-name": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" } @@ -636,9 +632,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz", + "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -822,13 +818,6 @@ "@babel/helper-plugin-utils": "^7.8.3", "resolve": "^1.8.1", "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/plugin-transform-shorthand-properties": { @@ -893,12 +882,12 @@ } }, "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.6.tgz", + "integrity": "sha512-M5u8llV9DIVXBFB/ArIpqJuvXpO+ymxcJ6e8ZAmzeK3sQeBNOD1y+rHvHCGG4TlEmsNpIrdecsHGHT8ZCoOSJg==", "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", + "@babel/compat-data": "^7.8.6", + "@babel/helper-compilation-targets": "^7.8.6", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", @@ -921,13 +910,13 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.6", "@babel/plugin-transform-computed-properties": "^7.8.3", "@babel/plugin-transform-destructuring": "^7.8.3", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-for-of": "^7.8.6", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", @@ -948,19 +937,12 @@ "@babel/plugin-transform-template-literals": "^7.8.3", "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.6", "browserslist": "^4.8.5", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/preset-react": { @@ -993,35 +975,50 @@ } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", + "@babel/generator": "^7.8.6", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.6.tgz", + "integrity": "sha512-wqz7pgWMIrht3gquyEFPVXeXCti72Rm8ep9b5tQKz9Yg9LzJA3HxosF1SB3Kc81KD1A3XBkkVYtJvCKS2Z/QrA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1167,6 +1164,14 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -1372,6 +1377,13 @@ "@svgr/plugin-jsx": "^4.3.3", "camelcase": "^5.3.1", "cosmiconfig": "^5.2.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } }, "@svgr/hast-util-to-babel-ast": { @@ -1448,11 +1460,11 @@ } }, "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.1.tgz", + "integrity": "sha512-sta3ui24HPgW92quHyQj6gpOkNgLNx8BX/QOU4k1bddo43ZdqlGwmzCYwL93bExfhergwiau+IzBGl7TCsSFeA==", "requires": { - "@babel/runtime": "^7.7.6", + "@babel/runtime": "^7.8.3", "@testing-library/dom": "^6.11.0", "@types/testing-library__react": "^9.1.2" } @@ -1463,9 +1475,9 @@ "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" }, "@types/babel__core": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", - "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1492,13 +1504,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1557,9 +1574,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" + "version": "13.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", + "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" }, "@types/parse-json": { "version": "4.0.0", @@ -1577,9 +1594,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.9.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.20.tgz", - "integrity": "sha512-jRrWBr25zzEVNa4QbESKLPluvrZ3W6Odfwrfe2F5vzbrDuNvlpnHa/xbZcXg8RH5D4CE181J5VxrRrLvzRH+5A==", + "version": "16.9.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.23.tgz", + "integrity": "sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -1629,11 +1646,11 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.22.0.tgz", + "integrity": "sha512-BvxRLaTDVQ3N+Qq8BivLiE9akQLAOUfxNHIEhedOcg8B2+jY8Rc4/D+iVprvuMX1AdezFYautuGDwr9QxqSxBQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", + "@typescript-eslint/experimental-utils": "2.22.0", "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -1641,30 +1658,30 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.22.0.tgz", + "integrity": "sha512-sJt1GYBe6yC0dWOQzXlp+tiuGglNhJC9eXZeC8GBVH98Zv9jtatccuhz0OF5kC/DwChqsNfghHx7OlIDQjNYAQ==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", + "@typescript-eslint/typescript-estree": "2.22.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.22.0.tgz", + "integrity": "sha512-FaZKC1X+nvD7qMPqKFUYHz3H0TAioSVFGvG29f796Nc5tBluoqfHgLbSFKsh7mKjRoeTm8J9WX2Wo9EyZWjG7w==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", + "@typescript-eslint/experimental-utils": "2.22.0", + "@typescript-eslint/typescript-estree": "2.22.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.22.0.tgz", + "integrity": "sha512-2HFZW2FQc4MhIBB8WhDm9lVFaBDy6h9jGrJ4V2Uzxe/ON29HCHBTj3GkgcsgMWfsl2U5as+pTOr30Nibaw7qRQ==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -1673,6 +1690,26 @@ "lodash": "^4.17.15", "semver": "^6.3.0", "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "@webassemblyjs/ast": { @@ -1863,9 +1900,9 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-globals": { "version": "4.3.4", @@ -1884,9 +1921,9 @@ } }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, "acorn-walk": { "version": "6.2.0", @@ -1914,6 +1951,29 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } } } }, @@ -1932,9 +1992,9 @@ } }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1968,11 +2028,18 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } } }, "ansi-html": { @@ -2014,30 +2081,6 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "argparse": { @@ -2248,29 +2291,6 @@ "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", "requires": { "follow-redirects": "1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "axobject-query": { @@ -2288,11 +2308,6 @@ "js-tokens": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -2315,14 +2330,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -2400,6 +2407,16 @@ "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } } }, "babel-plugin-jest-hoist": { @@ -2515,6 +2532,72 @@ "@babel/runtime": "7.8.4", "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/preset-env": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + } } }, "babel-runtime": { @@ -2688,11 +2771,6 @@ "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -2845,13 +2923,13 @@ } }, "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", + "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" + "caniuse-lite": "^1.0.30001030", + "electron-to-chromium": "^1.3.363", + "node-releases": "^1.1.50" } }, "bser": { @@ -2922,13 +3000,18 @@ "unique-filename": "^1.1.1" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "glob": "^7.1.3" + "yallist": "^3.0.2" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -2975,18 +3058,18 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "camelcase-keys": { "version": "2.1.0", @@ -2995,13 +3078,6 @@ "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } } }, "caniuse-api": { @@ -3016,9 +3092,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" + "version": "1.0.30001031", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001031.tgz", + "integrity": "sha512-DpAP5a1NGRLgYfaNCaXIRyGARi+3tJA2quZXNNA1Du26VyVkqvy2tznNu5ANyN1Y5aX44QDotZSVSUSi2uMGjg==" }, "capture-exit": { "version": "2.0.0", @@ -3188,35 +3264,13 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone-deep": { @@ -3356,11 +3410,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -3378,30 +3427,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "confusing-browser-globals": { @@ -3518,6 +3543,17 @@ "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } } }, "create-ecdh": { @@ -3555,22 +3591,12 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", + "lru-cache": "^4.0.1", "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "crypto-browserify": { @@ -3669,6 +3695,11 @@ "schema-utils": "^2.6.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3884,11 +3915,11 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "decamelize": { @@ -4083,11 +4114,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -4113,6 +4139,21 @@ "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "dns-equal": { @@ -4204,6 +4245,15 @@ "domelementtype": "1" } }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "dot-prop": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", @@ -4236,30 +4286,6 @@ "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "ecc-jsbn": { @@ -4277,9 +4303,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.354", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", - "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==" + "version": "1.3.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.364.tgz", + "integrity": "sha512-V6hyxQ9jzt6Jy6w8tAv4HHKhIaVS6psG/gmwtQ+2+itdkWMHJLHJ4m1sFep/fWkdKvfJcPXuywfnECRzfNa7gw==" }, "elliptic": { "version": "6.5.2", @@ -4301,9 +4327,9 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", @@ -4336,28 +4362,6 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -4505,6 +4509,33 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, "globals": { "version": "12.3.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", @@ -4522,6 +4553,11 @@ "resolve-from": "^4.0.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -4531,6 +4567,19 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -4558,11 +4607,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -4612,11 +4656,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4638,6 +4677,11 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -4720,11 +4764,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4746,13 +4785,10 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-type": { "version": "2.0.0", @@ -4762,11 +4798,6 @@ "pify": "^2.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -4785,6 +4816,11 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, @@ -4865,12 +4901,12 @@ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz", + "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==", "requires": { "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -4954,6 +4990,20 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, "exit": { @@ -4998,11 +5048,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5069,10 +5114,10 @@ "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "qs": { "version": "6.7.0", @@ -5212,11 +5257,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5381,11 +5421,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5400,11 +5435,12 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "locate-path": "^3.0.0" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -5415,6 +5451,16 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -5434,48 +5480,14 @@ "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } + "debug": "=3.1.0" } }, "for-in": { @@ -5509,13 +5521,6 @@ "semver": "^5.6.0", "tapable": "^1.0.0", "worker-rpc": "^0.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "form-data": { @@ -5553,30 +5558,6 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "fs-extra": { @@ -5606,30 +5587,6 @@ "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "fs.realpath": { @@ -5677,39 +5634,6 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "gaze": { @@ -5726,9 +5650,9 @@ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" }, "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-own-enumerable-property-symbols": { "version": "3.0.2", @@ -5836,6 +5760,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -6035,9 +5964,9 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "hpack.js": { "version": "2.1.6", @@ -6048,30 +5977,6 @@ "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "hsl-regex": { @@ -6108,17 +6013,17 @@ "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" }, "html-minifier-terser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz", - "integrity": "sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", + "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^4.0.0", + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", "he": "^1.2.0", - "param-case": "^2.1.1", + "param-case": "^3.0.3", "relateurl": "^0.2.7", - "terser": "^4.3.9" + "terser": "^4.6.3" }, "dependencies": { "commander": { @@ -6169,6 +6074,16 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } } } }, @@ -6244,6 +6159,21 @@ "requires": { "agent-base": "5", "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "iconv-lite": { @@ -6369,23 +6299,97 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.5.tgz", + "integrity": "sha512-6Z5cP+LAO0rzNE7xWjWtT84jxKa5ScLEGLgegPXeO3dGeU8lNe5Ii7SlXH6KVtLGlDuaEhsvsFjrjWjw8j5lFg==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "internal-ip": { @@ -6406,9 +6410,9 @@ } }, "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", @@ -6421,9 +6425,9 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-absolute-url": { "version": "2.1.0", @@ -6543,9 +6547,12 @@ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-generator-fn": { "version": "2.1.0", @@ -6718,6 +6725,13 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "istanbul-lib-report": { @@ -6750,10 +6764,25 @@ "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "2.2.7", + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "istanbul-reports": { + "version": "2.2.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "requires": { @@ -6769,6 +6798,44 @@ "jest-cli": "^24.9.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "jest-cli": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", @@ -6788,6 +6855,75 @@ "realpath-native": "^1.1.0", "yargs": "^13.3.0" } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -6934,14 +7070,6 @@ "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } } } }, @@ -7625,6 +7753,120 @@ "slash": "^2.0.0", "strip-bom": "^3.0.0", "yargs": "^13.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { @@ -7650,6 +7892,13 @@ "natural-compare": "^1.4.0", "pretty-format": "^24.9.0", "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "jest-util": { @@ -7689,6 +7938,13 @@ "jest-get-type": "^24.9.0", "leven": "^3.1.0", "pretty-format": "^24.9.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } }, "jest-watch-typeahead": { @@ -7718,6 +7974,14 @@ "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -7822,6 +8086,14 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } } } }, @@ -7942,11 +8214,11 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -7982,14 +8254,15 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-fs-cache": { @@ -8011,23 +8284,6 @@ "pkg-dir": "^1.0.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, "pkg-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", @@ -8044,12 +8300,12 @@ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", + "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "dependencies": { @@ -8070,6 +8326,13 @@ "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } } }, "lodash": { @@ -8137,23 +8400,20 @@ } }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -8169,11 +8429,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -8253,30 +8508,6 @@ "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "meow": { @@ -8296,15 +8527,6 @@ "trim-newlines": "^1.0.0" }, "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -8313,91 +8535,21 @@ "repeating": "^2.0.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "error-ex": "^1.2.0" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "^4.0.1" } } } @@ -8563,6 +8715,13 @@ "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", "requires": { "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "minipass-collect": { @@ -8670,9 +8829,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -8749,11 +8908,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.1", + "tslib": "^1.10.0" } }, "node-forge": { @@ -8822,48 +8982,22 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } } } } @@ -8883,21 +9017,21 @@ "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", "requires": { "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "node-sass": { @@ -8924,11 +9058,6 @@ "true-case-path": "^1.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -8946,41 +9075,10 @@ "supports-color": "^2.0.0" } }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } }, @@ -9001,13 +9099,6 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "normalize-path": { @@ -9299,13 +9390,11 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -9400,38 +9489,15 @@ "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", "requires": { - "no-case": "^2.2.0" + "dot-case": "^3.0.3", + "tslib": "^1.10.0" } }, "parent-module": { @@ -9463,12 +9529,11 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -9481,6 +9546,15 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -9497,9 +9571,12 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } }, "path-is-absolute": { "version": "1.0.1", @@ -9522,16 +9599,28 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "pify": "^3.0.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { @@ -9562,9 +9651,9 @@ "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", @@ -9593,6 +9682,16 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } } }, "pkg-up": { @@ -9601,6 +9700,16 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } } }, "pn": { @@ -9638,6 +9747,11 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -10622,9 +10736,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } @@ -10654,12 +10768,12 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "proxy-from-env": { @@ -10747,13 +10861,18 @@ "ws": "^6.1.0" }, "dependencies": { - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "async-limiter": "~1.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -10840,9 +10959,9 @@ } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz", + "integrity": "sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10918,6 +11037,11 @@ "which": "^2.0.1" } }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -10932,6 +11056,64 @@ "path-exists": "^4.0.0" } }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -10971,6 +11153,16 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -10990,14 +11182,14 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.0.tgz", + "integrity": "sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.0" } }, "react-error-overlay": { @@ -11006,14 +11198,14 @@ "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==" }, "react-hook-form": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-4.9.6.tgz", - "integrity": "sha512-t5EQdfATwOOlj0rsBmHYBgf6s5L/dzakPzhzr2kdqTVhRnxSI73ZthJofZ+dYiXrXa6ds0VRso49GCHwDXL66Q==" + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-4.10.1.tgz", + "integrity": "sha512-ZXEa4YbHqUKxuuTGSVa36NjL7bhIcFEPmXxvq1p/Bq1EAo1cUlgZxcFV7MbAQiK4Nw2+1qg8Oz0mZIITTM8y/g==" }, "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==" }, "react-redux": { "version": "7.2.0", @@ -11042,21 +11234,6 @@ "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - } } }, "react-router-dom": { @@ -11131,35 +11308,59 @@ "webpack-dev-server": "3.10.2", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "4.3.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "^4.0.0", + "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "path-type": "^1.0.0" } }, "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -11326,11 +11527,6 @@ "utila": "^0.4.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -11355,14 +11551,6 @@ "dom-serializer": "0", "domelementtype": "1" } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } } } }, @@ -11435,9 +11623,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "requires-port": { "version": "1.0.0", @@ -11445,9 +11633,9 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "requires": { "path-parse": "^1.0.6" } @@ -11492,14 +11680,42 @@ "source-map": "0.6.1" }, "dependencies": { - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -11563,9 +11779,9 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -11585,9 +11801,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "requires": { "is-promise": "^2.1.0" } @@ -11656,211 +11872,6 @@ "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", "yargs": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } - } } }, "sass-loader": { @@ -11890,6 +11901,11 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -11914,9 +11930,9 @@ } }, "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.0.tgz", + "integrity": "sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -11964,9 +11980,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { "version": "0.17.1", @@ -12058,11 +12074,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -12261,11 +12272,6 @@ "is-extendable": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -12369,6 +12375,11 @@ "requires": { "websocket-driver": ">=0.5.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -12454,6 +12465,21 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "spdy-transport": { @@ -12467,6 +12493,31 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "split-string": { @@ -12547,30 +12598,6 @@ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "requires": { "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stealthy-require": { @@ -12585,30 +12612,6 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stream-each": { @@ -12630,30 +12633,6 @@ "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stream-shift": { @@ -12691,28 +12670,13 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string.prototype.trimleft": { @@ -12734,18 +12698,11 @@ } }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - } + "safe-buffer": "~5.1.0" } }, "stringify-object": { @@ -12766,17 +12723,27 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } }, "strip-comments": { "version": "1.0.2", @@ -12857,9 +12824,9 @@ } }, "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "1.3.2", @@ -12921,6 +12888,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -12940,9 +12915,9 @@ } }, "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", + "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -12966,12 +12941,12 @@ }, "dependencies": { "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.0.tgz", + "integrity": "sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==", "requires": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, @@ -13019,43 +12994,120 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "find-up": "^4.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "requires": { - "has-flag": "^4.0.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13078,30 +13130,6 @@ "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "thunky": { @@ -13224,9 +13252,9 @@ "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", @@ -13403,11 +13431,6 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -14138,20 +14161,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -14161,14 +14170,6 @@ "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -14251,6 +14252,14 @@ "estraverse": "^4.1.1" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -14284,6 +14293,16 @@ "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -14340,15 +14359,20 @@ }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -14378,11 +14402,6 @@ "wrap-ansi": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -14393,6 +14412,22 @@ } } }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "fsevents": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", @@ -14883,11 +14918,6 @@ } } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -14907,6 +14937,11 @@ } } }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -14925,23 +14960,32 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "readdirp": { @@ -14954,11 +14998,6 @@ "readable-stream": "^2.0.2" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -14969,6 +15008,11 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -14978,11 +15022,6 @@ "strip-ansi": "^4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -14993,22 +15032,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -15017,42 +15040,10 @@ "has-flag": "^3.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "yargs": { "version": "12.0.5", @@ -15177,9 +15168,9 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "wide-align": { "version": "1.1.3", @@ -15187,35 +15178,6 @@ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "word-wrap": { @@ -15401,35 +15363,12 @@ } }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -15456,9 +15395,9 @@ } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { "async-limiter": "~1.0.0" } @@ -15479,14 +15418,14 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yaml": { "version": "1.7.2", @@ -15497,51 +15436,45 @@ } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", + "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } } }, "yauzl": { diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index acc16ea..dc6439c 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -79,21 +79,22 @@ class Register extends React.Component { .post('/login', {username: this.state.user.username, password: this.state.user.password}) .then(res2 => { console.log('nested login successful', res) - localStorage.setItem('token', res.data.token) - const userid = res.data.id; - this.props.history.push('/dashboard') + const userid = res.data.id; console.log('form data', this.state.input.movies) - axios.post(`https://stylingbranch-groa-be.herokuapp.com/api/users/${userid}/upload`, this.state.input.movies, { + axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { headers:{ 'Content-Type':'multipart/form-data' } }) .then(res => { console.log(res); + localStorage.setItem('token', res.data.token) + + this.props.history.push('/dashboard') }).catch(err => { console.log(err) diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 0d14dc6..db5545f 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -36,6 +36,9 @@ class Navigation extends Component { Groa + + Dairies + Trending diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 642f0ee..0000000 --- a/yarn.lock +++ /dev/null @@ -1,12269 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.8.3", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/compat-data@^7.8.4": - version "7.8.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.5.tgz#d28ce872778c23551cbb9432fc68d28495b613b9" - integrity sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg== - dependencies: - browserslist "^4.8.5" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" - integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" - integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== - dependencies: - "@babel/types" "^7.7.4" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== - dependencies: - "@babel/types" "^7.8.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" - integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" - integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-builder-react-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" - integrity sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA== - dependencies: - "@babel/types" "^7.7.4" - esutils "^2.0.0" - -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== - dependencies: - "@babel/types" "^7.8.3" - esutils "^2.0.0" - -"@babel/helper-call-delegate@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" - integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== - dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-compilation-targets@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" - integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== - dependencies: - "@babel/compat-data" "^7.8.4" - browserslist "^4.8.5" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" - integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" - integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== - dependencies: - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" - integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== - dependencies: - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" - -"@babel/helper-define-map@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" - integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== - dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/types" "^7.7.4" - lodash "^4.17.13" - -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" - integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== - dependencies: - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== - dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" - integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== - dependencies: - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-get-function-arity@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" - integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" - integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-member-expression-to-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" - integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" - integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a" - integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA== - dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-simple-access" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - lodash "^4.17.13" - -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" - integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== - dependencies: - lodash "^4.17.13" - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" - integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-wrap-function" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" - integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-replace-supers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" - integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-simple-access@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" - integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== - dependencies: - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" - integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-wrap-function@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" - integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== - dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" - integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== - dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" - integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== - -"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== - -"@babel/plugin-proposal-async-generator-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" - integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" - -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - -"@babel/plugin-proposal-class-properties@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-proposal-decorators@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" - integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-decorators" "^7.8.3" - -"@babel/plugin-proposal-dynamic-import@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" - integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" - -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - -"@babel/plugin-proposal-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" - integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.7.4" - -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-numeric-separator@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - -"@babel/plugin-proposal-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" - integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" - -"@babel/plugin-proposal-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" - integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" - -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" - integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-async-generators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" - integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-async-generators@^7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-dynamic-import@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" - integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-flow@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" - integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec" - integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" - integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" - integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" - integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-arrow-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" - integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" - integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== - dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" - -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - -"@babel/plugin-transform-block-scoped-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" - integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-block-scoping@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" - integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" - integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-define-map" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" - integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" - integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-destructuring@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" - integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-dotall-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" - integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-duplicate-keys@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" - integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" - integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz#da705a655466b2a9b36046b57bf0cbcd53551bd4" - integrity sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" - integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" - integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" - integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== - dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" - integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-member-expression-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" - integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-modules-amd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" - integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== - dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" - integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== - dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.4" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" - integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== - dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" - integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== - dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" - integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - -"@babel/plugin-transform-new-target@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" - integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-object-super@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" - integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" - integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== - dependencies: - "@babel/helper-call-delegate" "^7.7.4" - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-parameters@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== - dependencies: - "@babel/helper-call-delegate" "^7.8.3" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-property-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" - integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.7.4.tgz#499cf732a21ffd62cc4b0016e27c3906097f8982" - integrity sha512-U6XkHZ8RnmeEb8jBUOpeo6oFka5RhLgxAVvK4/fBbwoYlsHQYLb8I37ymTPDVsrWjqb94+hueuWQA/1OAA4rAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-react-display-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz#9f2b80b14ebc97eef4a9b29b612c58ed9c0d10dd" - integrity sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-jsx-self@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.7.4.tgz#81b8fbfd14b2215e8f1c2c3adfba266127b0231c" - integrity sha512-PWYjSfqrO273mc1pKCRTIJXyqfc9vWYBax88yIhQb+bpw3XChVC7VWS4VwRVs63wFHKxizvGSd00XEr+YB9Q2A== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.7.4" - -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-react-jsx-source@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.7.4.tgz#8994b1bf6014b133f5a46d3b7d1ee5f5e3e72c10" - integrity sha512-5ZU9FnPhqtHsOXxutRtXZAzoEJwDaP32QcobbMP1/qt7NYcsCNK8XgzJcJfoEr/ZnzVvUNInNjIW22Z6I8p9mg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.7.4" - -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-react-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz#d91205717fae4e2f84d020cd3057ec02a10f11da" - integrity sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw== - dependencies: - "@babel/helper-builder-react-jsx" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.7.4" - -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== - dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-regenerator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" - integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-regenerator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" - integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-runtime@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" - integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" - integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" - integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" - integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - -"@babel/plugin-transform-template-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" - integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typeof-symbol@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" - integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" - integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" - -"@babel/plugin-transform-unicode-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" - integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/preset-env@7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" - integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== - dependencies: - "@babel/compat-data" "^7.8.4" - "@babel/helper-compilation-targets" "^7.8.4" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.3" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.4" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.4" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.3" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.3" - browserslist "^4.8.5" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-env@^7.4.5": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8" - integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g== - dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.4" - "@babel/plugin-proposal-dynamic-import" "^7.7.4" - "@babel/plugin-proposal-json-strings" "^7.7.4" - "@babel/plugin-proposal-object-rest-spread" "^7.7.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" - "@babel/plugin-syntax-json-strings" "^7.7.4" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" - "@babel/plugin-syntax-top-level-await" "^7.7.4" - "@babel/plugin-transform-arrow-functions" "^7.7.4" - "@babel/plugin-transform-async-to-generator" "^7.7.4" - "@babel/plugin-transform-block-scoped-functions" "^7.7.4" - "@babel/plugin-transform-block-scoping" "^7.7.4" - "@babel/plugin-transform-classes" "^7.7.4" - "@babel/plugin-transform-computed-properties" "^7.7.4" - "@babel/plugin-transform-destructuring" "^7.7.4" - "@babel/plugin-transform-dotall-regex" "^7.7.4" - "@babel/plugin-transform-duplicate-keys" "^7.7.4" - "@babel/plugin-transform-exponentiation-operator" "^7.7.4" - "@babel/plugin-transform-for-of" "^7.7.4" - "@babel/plugin-transform-function-name" "^7.7.4" - "@babel/plugin-transform-literals" "^7.7.4" - "@babel/plugin-transform-member-expression-literals" "^7.7.4" - "@babel/plugin-transform-modules-amd" "^7.7.4" - "@babel/plugin-transform-modules-commonjs" "^7.7.4" - "@babel/plugin-transform-modules-systemjs" "^7.7.4" - "@babel/plugin-transform-modules-umd" "^7.7.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" - "@babel/plugin-transform-new-target" "^7.7.4" - "@babel/plugin-transform-object-super" "^7.7.4" - "@babel/plugin-transform-parameters" "^7.7.4" - "@babel/plugin-transform-property-literals" "^7.7.4" - "@babel/plugin-transform-regenerator" "^7.7.4" - "@babel/plugin-transform-reserved-words" "^7.7.4" - "@babel/plugin-transform-shorthand-properties" "^7.7.4" - "@babel/plugin-transform-spread" "^7.7.4" - "@babel/plugin-transform-sticky-regex" "^7.7.4" - "@babel/plugin-transform-template-literals" "^7.7.4" - "@babel/plugin-transform-typeof-symbol" "^7.7.4" - "@babel/plugin-transform-unicode-regex" "^7.7.4" - "@babel/types" "^7.7.4" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/preset-react@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" - -"@babel/preset-react@^7.0.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.7.4.tgz#3fe2ea698d8fb536d8e7881a592c3c1ee8bf5707" - integrity sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.7.4" - "@babel/plugin-transform-react-jsx" "^7.7.4" - "@babel/plugin-transform-react-jsx-self" "^7.7.4" - "@babel/plugin-transform-react-jsx-source" "^7.7.4" - -"@babel/preset-typescript@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" - integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.8.3" - -"@babel/runtime-corejs3@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz#f861adc1cecb9903dfd66ea97917f02ff8d79888" - integrity sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.2" - -"@babel/runtime@7.8.4", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b" - integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.4.0", "@babel/template@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" - integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" - integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@csstools/normalize.css@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" - integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== - -"@fortawesome/fontawesome-common-types@^0.2.27": - version "0.2.27" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.27.tgz#19706345859fc46adf3684ed01d11b40903b87e9" - integrity sha512-97GaByGaXDGMkzcJX7VmR/jRJd8h1mfhtA7RsxDBN61GnWE/PPCZhOdwG/8OZYktiRUF0CvFOr+VgRkJrt6TWg== - -"@fortawesome/fontawesome-svg-core@^1.2.27": - version "1.2.27" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.27.tgz#e4db8e3be81a40988213507c3e3d0c158a6641a3" - integrity sha512-sOD3DKynocnHYpuw2sLPnTunDj7rLk91LYhi2axUYwuGe9cPCw7Bsu9EWtVdNJP+IYgTCZIbyARKXuy5K/nv+Q== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.27" - -"@fortawesome/free-regular-svg-icons@^5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.12.1.tgz#4b378d93655acc5e432d5ed7ee127768dd351a99" - integrity sha512-bGda18seHXb+24K6DPUFzqn4kG7B+JViP/BscMcNUXvT00M86xNhdgP2TXSdflQXn53QWqymKjx/8rhaDOJyhA== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.27" - -"@fortawesome/free-solid-svg-icons@^5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.1.tgz#76b6f958a3471821ff146f8f955e6d7cfe87147c" - integrity sha512-k3MwRFFUhyL4cuCJSaHDA0YNYMELDXX0h8JKtWYxO5XD3Dn+maXOMrVAAiNGooUyM2v/wz/TOaM0jxYVKeXX7g== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.27" - -"@fortawesome/react-fontawesome@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz#cb6d4dd3aeec45b6ff2d48c812317a6627618511" - integrity sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw== - dependencies: - prop-types "^15.5.10" - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a" - integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw== - -"@hapi/joi@^15.0.0": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.3.0", "@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@sheerun/mutationobserver-shim@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" - integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== - -"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" - integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== - -"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" - integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" - integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" - integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== - -"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" - integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== - -"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" - integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== - -"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" - integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== - -"@svgr/babel-plugin-transform-svg-component@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" - integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== - -"@svgr/babel-preset@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" - integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" - "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" - "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" - "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" - "@svgr/babel-plugin-transform-svg-component" "^4.2.0" - -"@svgr/core@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" - integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w== - dependencies: - "@svgr/plugin-jsx" "^4.3.3" - camelcase "^5.3.1" - cosmiconfig "^5.2.1" - -"@svgr/hast-util-to-babel-ast@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" - integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg== - dependencies: - "@babel/types" "^7.4.4" - -"@svgr/plugin-jsx@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" - integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w== - dependencies: - "@babel/core" "^7.4.5" - "@svgr/babel-preset" "^4.3.3" - "@svgr/hast-util-to-babel-ast" "^4.3.2" - svg-parser "^2.0.0" - -"@svgr/plugin-svgo@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" - integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w== - dependencies: - cosmiconfig "^5.2.1" - merge-deep "^3.0.2" - svgo "^1.2.2" - -"@svgr/webpack@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" - integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg== - dependencies: - "@babel/core" "^7.4.5" - "@babel/plugin-transform-react-constant-elements" "^7.0.0" - "@babel/preset-env" "^7.4.5" - "@babel/preset-react" "^7.0.0" - "@svgr/core" "^4.3.3" - "@svgr/plugin-jsx" "^4.3.3" - "@svgr/plugin-svgo" "^4.3.1" - loader-utils "^1.2.3" - -"@testing-library/dom@^6.11.0": - version "6.12.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.12.2.tgz#5d549acf43f2e0c23b2abfd4e36d65594c3b2741" - integrity sha512-KCnvHra5fV+wDxg3wJObGvZFxq7v1DJt829GNFLuRDjKxVNc/B5AdsylNF5PMHFbWMXDsHwM26d2NZcZO9KjbQ== - dependencies: - "@babel/runtime" "^7.6.2" - "@sheerun/mutationobserver-shim" "^0.3.2" - "@types/testing-library__dom" "^6.0.0" - aria-query "3.0.0" - pretty-format "^24.9.0" - wait-for-expect "^3.0.0" - -"@testing-library/jest-dom@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" - integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== - dependencies: - "@babel/runtime" "^7.5.1" - chalk "^2.4.1" - css "^2.2.3" - css.escape "^1.5.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" - redent "^3.0.0" - -"@testing-library/react@^9.3.2": - version "9.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.4.0.tgz#b021ac8cb987c8dc54c6841875f745bf9b2e88e5" - integrity sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg== - dependencies: - "@babel/runtime" "^7.7.6" - "@testing-library/dom" "^6.11.0" - "@types/testing-library__react" "^9.1.2" - -"@testing-library/user-event@^7.1.2": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" - integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== - -"@types/babel__core@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" - integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" - integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" - integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/json-schema@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" - integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== - -"@types/mime-types@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" - integrity sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM= - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "12.12.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" - integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== - -"@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== - -"@types/react-dom@*": - version "16.9.5" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7" - integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "16.9.20" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.20.tgz#e83285766340fb1a7fafe7e5c4708c53832e3641" - integrity sha512-jRrWBr25zzEVNa4QbESKLPluvrZ3W6Odfwrfe2F5vzbrDuNvlpnHa/xbZcXg8RH5D4CE181J5VxrRrLvzRH+5A== - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0": - version "6.12.1" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.12.1.tgz#37af28fae051f9e3feed5684535b1540c97ae28b" - integrity sha512-cgqnEjxKk31tQt29j4baSWaZPNjQf3bHalj2gcHQTpW5SuHRal76gOpF0vypeEo6o+sS5inOvvNdzLY0B3FB2A== - dependencies: - pretty-format "^24.3.0" - -"@types/testing-library__react@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351" - integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q== - dependencies: - "@types/react-dom" "*" - "@types/testing-library__dom" "*" - -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^2.10.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz#a522d0e1e4898f7c9c6a8e1ed3579b60867693fa" - integrity sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ== - dependencies: - "@typescript-eslint/experimental-utils" "2.20.0" - eslint-utils "^1.4.3" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.20.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz#3b6fa5a6b8885f126d5a4280e0d44f0f41e73e32" - integrity sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.20.0" - eslint-scope "^5.0.0" - -"@typescript-eslint/parser@^2.10.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.20.0.tgz#608e5bb06ba98a415b64ace994c79ab20f9772a9" - integrity sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.20.0" - "@typescript-eslint/typescript-estree" "2.20.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.20.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz#90a0f5598826b35b966ca83483b1a621b1a4d0c9" - integrity sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" - tsutils "^3.17.1" - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== - -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - -address@1.1.2, address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -adjust-sourcemap-loader@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" - integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== - dependencies: - assert "1.4.1" - camelcase "5.0.0" - loader-utils "1.2.3" - object-path "0.11.4" - regex-parser "2.2.10" - -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== - -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== - dependencies: - type-fest "^0.8.1" - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -aria-query@3.0.0, aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= - dependencies: - util "0.10.3" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^9.6.1: - version "9.7.3" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" - integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q== - dependencies: - browserslist "^4.8.0" - caniuse-lite "^1.0.30001012" - chalk "^2.4.2" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.23" - postcss-value-parser "^4.0.2" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" - integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== - -axios@^0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== - dependencies: - follow-redirects "1.5.10" - -axobject-query@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.1.tgz#2a3b1271ec722d48a4cd4b3fcc20c853326a49a7" - integrity sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw== - dependencies: - "@babel/runtime" "^7.7.4" - "@babel/runtime-corejs3" "^7.7.4" - -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-eslint@10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" - integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== - dependencies: - babylon "^6.18.0" - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-loader@8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== - dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - pify "^4.0.1" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -babel-plugin-named-asset-import@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" - integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-remove-prop-types@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - -babel-preset-react-app@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz#d1ceb47cbe48b285fdd5c562c54c432ed5a41e0e" - integrity sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q== - dependencies: - "@babel/core" "7.8.4" - "@babel/plugin-proposal-class-properties" "7.8.3" - "@babel/plugin-proposal-decorators" "7.8.3" - "@babel/plugin-proposal-numeric-separator" "7.8.3" - "@babel/plugin-transform-flow-strip-types" "7.8.3" - "@babel/plugin-transform-react-display-name" "7.8.3" - "@babel/plugin-transform-runtime" "7.8.3" - "@babel/preset-env" "7.8.4" - "@babel/preset-react" "7.8.3" - "@babel/preset-typescript" "7.8.3" - "@babel/runtime" "7.8.4" - babel-plugin-macros "2.8.0" - babel-plugin-transform-react-remove-prop-types "0.4.24" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.8.6: - version "4.8.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" - integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== - dependencies: - caniuse-lite "^1.0.30001023" - electron-to-chromium "^1.3.341" - node-releases "^1.1.47" - -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.0.tgz#6f06b0f974a7cc3a84babc2ccc56493668e3c789" - integrity sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA== - dependencies: - caniuse-lite "^1.0.30001012" - electron-to-chromium "^1.3.317" - node-releases "^1.1.41" - -browserslist@^4.8.3, browserslist@^4.8.5: - version "4.8.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.7.tgz#ec8301ff415e6a42c949d0e66b405eb539c532d0" - integrity sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA== - dependencies: - caniuse-lite "^1.0.30001027" - electron-to-chromium "^1.3.349" - node-releases "^1.1.49" - -bser@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001012: - version "1.0.30001015" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz#15a7ddf66aba786a71d99626bc8f2b91c6f0f5f0" - integrity sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ== - -caniuse-lite@^1.0.30001023, caniuse-lite@^1.0.30001027: - version "1.0.30001028" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz#f2241242ac70e0fa9cda55c2776d32a0867971c2" - integrity sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -case-sensitive-paths-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^2.0.2, chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.3.0" - optionalDependencies: - fsevents "~2.1.2" - -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@^4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-deep@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" - integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= - dependencies: - for-own "^0.1.3" - is-plain-object "^2.0.1" - kind-of "^3.0.2" - lazy-cache "^1.0.3" - shallow-clone "^0.1.2" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0, commander@^2.20.0, commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-tags@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - -compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== - dependencies: - mime-db ">= 1.40.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@1.6.2, concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -confusing-browser-globals@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.1.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.7.tgz#39f8080b1d92a524d6d90505c42b9c5c1eb90611" - integrity sha512-57+mgz/P/xsGdjwQYkwtBZR3LuISaxD1dEwVDtbk8xJMqAmwqaxLOvnNT7kdJ7jYE/NjNptyzXi+IQFMi/2fCw== - dependencies: - browserslist "^4.8.0" - semver "^6.3.0" - -core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== - dependencies: - browserslist "^4.8.3" - semver "7.0.0" - -core-js-pure@^3.0.0: - version "3.4.7" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.4.7.tgz#c998e1892da9949200c7452cbd33c0df95be9f54" - integrity sha512-Am3uRS8WCdTFA3lP7LtKR0PxgqYzjAMGKXaZKSNSC/8sqU0Wfq8R/YzoRs2rqtOVEunfgH+0q3O0BKOg0AvjPw== - -core-js@^2.4.0: - version "2.6.10" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" - integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== - -core-js@^3.5.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-unit-converter@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" - integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= - -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - -css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -css@^2.0.0, css@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== - dependencies: - css-tree "1.0.0-alpha.37" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - -csstype@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -damerau-levenshtein@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" - integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0, data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-diff@^0.3.5: - version "0.3.8" - resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" - integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== - -detect-port-alt@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-converter@^0.2: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1, domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -dotenv-expand@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@8.2.0, dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== - -duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.317: - version "1.3.322" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" - integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== - -electron-to-chromium@^1.3.341, electron-to-chromium@^1.3.349: - version "1.3.354" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz#6c6ad9ef63654c4c022269517c5a3095cebc94db" - integrity sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw== - -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1, emoji-regex@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: - version "1.16.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161" - integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.7.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@^1.11.0, escodegen@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-react-app@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz#135110ba56a9e378f7acfe5f36e2ae76a2317899" - integrity sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw== - dependencies: - confusing-browser-globals "^1.0.9" - -eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-loader@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" - integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw== - dependencies: - fs-extra "^8.1.0" - loader-fs-cache "^1.0.2" - loader-utils "^1.2.3" - object-hash "^2.0.1" - schema-utils "^2.6.1" - -eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-flowtype@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" - integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ== - dependencies: - lodash "^4.17.15" - -eslint-plugin-import@2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz#d749a7263fb6c29980def8e960d380a6aa6aecaa" - integrity sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ== - dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.0" - read-pkg-up "^2.0.0" - resolve "^1.12.0" - -eslint-plugin-jsx-a11y@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" - integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== - dependencies: - "@babel/runtime" "^7.4.5" - aria-query "^3.0.0" - array-includes "^3.0.3" - ast-types-flow "^0.0.7" - axobject-query "^2.0.2" - damerau-levenshtein "^1.0.4" - emoji-regex "^7.0.2" - has "^1.0.3" - jsx-ast-utils "^2.2.1" - -eslint-plugin-react-hooks@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" - integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== - -eslint-plugin-react@7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz#2317831284d005b30aff8afb7c4e906f13fa8e7e" - integrity sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ== - dependencies: - array-includes "^3.1.1" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.1" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.14.2" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint@^6.6.0: - version "6.7.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" - integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== - dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" - eslint-visitor-keys "^1.1.0" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= - dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= - dependencies: - pend "~1.2.0" - -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-loader@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" - integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" - -filesize@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" - integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" - integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.0" - pkg-dir "^4.1.0" - -find-up@4.1.0, find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - -follow-redirects@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" - integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== - dependencies: - debug "^3.0.0" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -fork-ts-checker-webpack-plugin@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" - integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== - dependencies: - babel-code-frame "^6.22.0" - chalk "^2.4.1" - chokidar "^3.3.0" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" - integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== - dependencies: - minipass "^3.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@2.1.2, fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" - integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== - dependencies: - type-fest "^0.8.1" - -globby@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" - integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== - dependencies: - glob "~7.1.1" - lodash "~4.17.12" - minimatch "~3.0.2" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== - dependencies: - duplexer "^0.1.1" - pify "^4.0.1" - -handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== - -handlebars@^4.1.2: - version "4.5.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" - integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= - -html-minifier-terser@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz#b33549b57be7f0357be0d0b892995aaed1ed90f8" - integrity sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw== - dependencies: - camel-case "^3.0.0" - clean-css "^4.2.1" - commander "^4.0.0" - he "^1.2.0" - param-case "^2.1.1" - relateurl "^0.2.7" - terser "^4.3.9" - -html-webpack-plugin@4.0.0-beta.11: - version "4.0.0-beta.11" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" - integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== - dependencies: - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -htmlparser2@^3.3.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - 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" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== - dependencies: - agent-base "5" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -identity-obj-proxy@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -immer@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" - integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== - -ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.0.2, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.0, is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-root@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-diff@^24.0.0, jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom-fourteen@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" - integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== - dependencies: - "@jest/environment" "^24.3.0" - "@jest/fake-timers" "^24.3.0" - "@jest/types" "^24.3.0" - jest-mock "^24.0.0" - jest-util "^24.0.0" - jsdom "^14.1.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.0.0, jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== - dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" - -jest-resolve@24.9.0, jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.0.0, jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watch-typeahead@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" - integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.1" - jest-regex-util "^24.9.0" - jest-watcher "^24.3.0" - slash "^3.0.0" - string-length "^3.1.0" - strip-ansi "^5.0.0" - -jest-watcher@^24.3.0, jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== - dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" - -js-base64@^2.1.8: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsdom@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" - integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== - dependencies: - abab "^2.0.0" - acorn "^6.0.4" - acorn-globals "^4.3.0" - array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.0" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.3" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.5" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^2.5.0" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^6.1.2" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== - dependencies: - array-includes "^3.0.3" - object.assign "^4.1.0" - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-fs-cache@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" - integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== - dependencies: - find-cache-dir "^0.1.1" - mkdirp "0.5.1" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.template@^4.4.0, lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-deep@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" - integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== - dependencies: - arr-union "^3.1.0" - clone-deep "^0.2.4" - kind-of "^3.0.2" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": - version "1.42.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" - integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== - -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.25" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" - integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== - dependencies: - mime-db "1.42.0" - -mime-types@^2.1.25: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== - dependencies: - mime-db "1.43.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.0.3, mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= - -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== - dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" - -mini-css-extract-plugin@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" - integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== - dependencies: - minipass "^3.0.0" - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== - dependencies: - yallist "^4.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.41: - version "1.1.42" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.42.tgz#a999f6a62f8746981f6da90627a8d2fc090bbad7" - integrity sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA== - dependencies: - semver "^6.3.0" - -node-releases@^1.1.47, node-releases@^1.1.49: - version "1.1.49" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.49.tgz#67ba5a3fac2319262675ef864ed56798bb33b93e" - integrity sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg== - dependencies: - semver "^6.3.0" - -node-sass@^4.13.1: - version "4.13.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" - integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2, nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7, nwsapi@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" - integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" - integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-path@0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" - integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -open@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.2.tgz#fb3681f11f157f2361d2392307548ca1792960e8" - integrity sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optimize-css-assets-webpack-plugin@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" - integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.1, optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@0, osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= - dependencies: - no-case "^2.2.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -pnp-webpack-plugin@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz#d5c068013a2fdc82224ca50ed179c8fba9036a8e" - integrity sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ== - dependencies: - ts-pnp "^1.1.2" - -popular-movie-quotes@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/popular-movie-quotes/-/popular-movie-quotes-1.2.4.tgz#7d283bf403db4b215efdeba540ea076afaa4c081" - integrity sha512-YOwjB6cKq+RIwbrlPONH0jP14XoBfSHtBGWxm+ZQGGvHLKYBhdoaPZcTBZgC+HV7xY4W4GTQO2Wj7Go5hP1n/w== - -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.1" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" - integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0" - -postcss-browser-comments@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" - integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== - dependencies: - postcss "^7" - -postcss-calc@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== - dependencies: - css-unit-converter "^1.1.1" - postcss "^7.0.5" - postcss-selector-parser "^5.0.0-rc.4" - postcss-value-parser "^3.3.1" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" - integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== - dependencies: - postcss "^7.0.0" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== - dependencies: - lodash.template "^4.5.0" - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.16" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" - -postcss-modules-scope@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" - integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" - integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== - dependencies: - "@csstools/normalize.css" "^10.1.0" - browserslist "^4.6.2" - postcss "^7.0.17" - postcss-browser-comments "^3.0.0" - sanitize.css "^10.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" - -postcss-safe-parser@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" - integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== - dependencies: - postcss "^7.0.0" - -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" - integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== - -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@7.0.21: - version "7.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" - integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" - integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -pretty-bytes@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" - integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== - -pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= - dependencies: - renderkid "^2.0.1" - utila "~0.4" - -pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0, progress@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.3.tgz#f592e099c6cddc000d538ee7283bb190452b0bf6" - integrity sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" - integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.3" - -prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -proxy-addr@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.0" - -proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24, psl@^1.1.28: - version "1.5.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.5.0.tgz#47fd1292def7fdb1e138cd78afa8814cebcf7b13" - integrity sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -puppeteer@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.1.1.tgz#ccde47c2a688f131883b50f2d697bd25189da27e" - integrity sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg== - dependencies: - "@types/mime-types" "^2.1.0" - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^4.0.0" - mime "^2.0.3" - mime-types "^2.1.25" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-app-polyfill@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" - integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== - dependencies: - core-js "^3.5.0" - object-assign "^4.1.1" - promise "^8.0.3" - raf "^3.4.1" - regenerator-runtime "^0.13.3" - whatwg-fetch "^3.0.0" - -react-dev-utils@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.0.tgz#b11cc48aa2be2502fb3c27a50d1dfa95cfa9dfe0" - integrity sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g== - dependencies: - "@babel/code-frame" "7.8.3" - address "1.1.2" - browserslist "4.8.6" - chalk "2.4.2" - cross-spawn "7.0.1" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.0.1" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "3.1.1" - global-modules "2.0.0" - globby "8.0.2" - gzip-size "5.1.1" - immer "1.10.0" - inquirer "7.0.4" - is-root "2.1.0" - loader-utils "1.2.3" - open "^7.0.2" - pkg-up "3.1.0" - react-error-overlay "^6.0.6" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - -react-dom@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.18.0" - -react-error-overlay@^6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.6.tgz#ac4d9dc4c1b5c536c2c312bf66aa2b09bfa384e2" - integrity sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw== - -react-hook-form@^4.9.6: - version "4.10.1" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-4.10.1.tgz#abd24888cb9db95a4760fd3b0750eea84d644dee" - integrity sha512-ZXEa4YbHqUKxuuTGSVa36NjL7bhIcFEPmXxvq1p/Bq1EAo1cUlgZxcFV7MbAQiK4Nw2+1qg8Oz0mZIITTM8y/g== - -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" - integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== - -react-is@^16.8.1, react-is@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - -react-redux@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" - integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== - dependencies: - "@babel/runtime" "^7.5.5" - hoist-non-react-statics "^3.3.0" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.9.0" - -react-router-dom@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.1.2" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-scripts@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.0.tgz#f413680f0b5b937c8879ba1ffdae9b8c5b364bf5" - integrity sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg== - dependencies: - "@babel/core" "7.8.4" - "@svgr/webpack" "4.3.3" - "@typescript-eslint/eslint-plugin" "^2.10.0" - "@typescript-eslint/parser" "^2.10.0" - babel-eslint "10.0.3" - babel-jest "^24.9.0" - babel-loader "8.0.6" - babel-plugin-named-asset-import "^0.3.6" - babel-preset-react-app "^9.1.1" - camelcase "^5.3.1" - case-sensitive-paths-webpack-plugin "2.3.0" - css-loader "3.4.2" - dotenv "8.2.0" - dotenv-expand "5.1.0" - eslint "^6.6.0" - eslint-config-react-app "^5.2.0" - eslint-loader "3.0.3" - eslint-plugin-flowtype "4.6.0" - eslint-plugin-import "2.20.0" - eslint-plugin-jsx-a11y "6.2.3" - eslint-plugin-react "7.18.0" - eslint-plugin-react-hooks "^1.6.1" - file-loader "4.3.0" - fs-extra "^8.1.0" - html-webpack-plugin "4.0.0-beta.11" - identity-obj-proxy "3.0.0" - jest "24.9.0" - jest-environment-jsdom-fourteen "1.0.1" - jest-resolve "24.9.0" - jest-watch-typeahead "0.4.2" - mini-css-extract-plugin "0.9.0" - optimize-css-assets-webpack-plugin "5.0.3" - pnp-webpack-plugin "1.6.0" - postcss-flexbugs-fixes "4.1.0" - postcss-loader "3.0.0" - postcss-normalize "8.0.1" - postcss-preset-env "6.7.0" - postcss-safe-parser "4.0.1" - react-app-polyfill "^1.0.6" - react-dev-utils "^10.2.0" - resolve "1.15.0" - resolve-url-loader "3.1.1" - sass-loader "8.0.2" - semver "6.3.0" - style-loader "0.23.1" - terser-webpack-plugin "2.3.4" - ts-pnp "1.1.5" - url-loader "2.3.0" - webpack "4.41.5" - webpack-dev-server "3.10.2" - webpack-manifest-plugin "2.2.0" - workbox-webpack-plugin "4.3.1" - optionalDependencies: - fsevents "2.1.2" - -react@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== - dependencies: - picomatch "^2.0.7" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - -recursive-readdir@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -redux-logger@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf" - integrity sha1-91VZZvMJjzyIYExEnPC69XeCdL8= - dependencies: - deep-diff "^0.3.5" - -redux-thunk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== - -redux@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@2.2.10: - version "2.2.10" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" - integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== - -regexp.prototype.flags@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" - integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== - dependencies: - define-properties "^1.1.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== - -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== - dependencies: - css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== - dependencies: - lodash "^4.17.15" - -request-promise-native@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== - dependencies: - request-promise-core "1.1.3" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0, request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve-url-loader@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" - integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== - dependencies: - adjust-sourcemap-loader "2.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.21" - rework "1.0.1" - rework-visit "1.0.0" - source-map "0.6.1" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" - integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" - integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.14.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - -rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sanitize.css@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" - integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== - -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -sass-loader@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== - dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" - -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - -scheduler@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" - integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f" - integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg== - dependencies: - ajv "^6.10.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" - integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== - dependencies: - ajv "^6.10.2" - ajv-keywords "^3.4.1" - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== - dependencies: - node-forge "0.9.0" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= - dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== - dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@6.0.0, strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-loader@0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -svg-parser@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.2.tgz#d134cc396fa2681dc64f518330784e98bd801ec8" - integrity sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg== - -svgo@^1.0.0, svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -terser-webpack-plugin@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz#ac045703bd8da0936ce910d8fb6350d0e1dee5fe" - integrity sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.4.3" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.3.9: - version "4.4.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.2.tgz#448fffad0245f4c8a277ce89788b458bfd7706e8" - integrity sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^4.4.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" - integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@0.2.0, text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tiny-invariant@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" - integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== - -tiny-warning@^1.0.0, tiny-warning@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - -ts-pnp@1.1.5, ts-pnp@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec" - integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA== - -tslib@^1.8.1, tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -uglify-js@^3.1.4: - version "3.7.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.1.tgz#35c7de17971a4aa7689cd2eae0a5b39bb838c0c5" - integrity sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-loader@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" - integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== - dependencies: - loader-utils "^1.2.3" - mime "^2.4.4" - schema-utils "^2.5.0" - -url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utila@^0.4.0, utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.0.1, uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" - integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" - -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - -wait-for-expect@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" - integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.10.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz#3403287d674c7407aab6d9b3f72259ecd0aa0874" - integrity sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.2.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.6" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.25" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "0.3.19" - sockjs-client "1.4.0" - spdy "^4.0.1" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "12.0.5" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-manifest-plugin@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" - integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== - dependencies: - fs-extra "^7.0.0" - lodash ">=3.5 <5" - object.entries "^1.1.0" - tapable "^1.0.0" - -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.41.5: - version "4.41.5" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" - integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.1" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" - webpack-sources "^1.4.1" - -websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== - dependencies: - http-parser-js ">=0.4.0 <0.4.11" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -workbox-background-sync@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" - integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== - dependencies: - workbox-core "^4.3.1" - -workbox-broadcast-update@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" - integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== - dependencies: - workbox-core "^4.3.1" - -workbox-build@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" - integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== - dependencies: - "@babel/runtime" "^7.3.4" - "@hapi/joi" "^15.0.0" - common-tags "^1.8.0" - fs-extra "^4.0.2" - glob "^7.1.3" - lodash.template "^4.4.0" - pretty-bytes "^5.1.0" - stringify-object "^3.3.0" - strip-comments "^1.0.2" - workbox-background-sync "^4.3.1" - workbox-broadcast-update "^4.3.1" - workbox-cacheable-response "^4.3.1" - workbox-core "^4.3.1" - workbox-expiration "^4.3.1" - workbox-google-analytics "^4.3.1" - workbox-navigation-preload "^4.3.1" - workbox-precaching "^4.3.1" - workbox-range-requests "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - workbox-streams "^4.3.1" - workbox-sw "^4.3.1" - workbox-window "^4.3.1" - -workbox-cacheable-response@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" - integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== - dependencies: - workbox-core "^4.3.1" - -workbox-core@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" - integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== - -workbox-expiration@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" - integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== - dependencies: - workbox-core "^4.3.1" - -workbox-google-analytics@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" - integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== - dependencies: - workbox-background-sync "^4.3.1" - workbox-core "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - -workbox-navigation-preload@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" - integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== - dependencies: - workbox-core "^4.3.1" - -workbox-precaching@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" - integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== - dependencies: - workbox-core "^4.3.1" - -workbox-range-requests@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" - integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== - dependencies: - workbox-core "^4.3.1" - -workbox-routing@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" - integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== - dependencies: - workbox-core "^4.3.1" - -workbox-strategies@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" - integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== - dependencies: - workbox-core "^4.3.1" - -workbox-streams@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" - integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== - dependencies: - workbox-core "^4.3.1" - -workbox-sw@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" - integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== - -workbox-webpack-plugin@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" - integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== - dependencies: - "@babel/runtime" "^7.0.0" - json-stable-stringify "^1.0.1" - workbox-build "^4.3.1" - -workbox-window@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" - integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== - dependencies: - workbox-core "^4.3.1" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== - dependencies: - microevent.ts "~0.1.1" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.1.0, ws@^6.1.2, ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" - -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= - dependencies: - fd-slicer "~1.0.1" From 4e8c0a2d1115c658e2a647c7fe327104ce01873c Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 14:53:16 -0500 Subject: [PATCH 102/822] added the endpoint for uploading --- src/components/auth/Register.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index dc6439c..e6d556c 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -81,7 +81,9 @@ class Register extends React.Component { console.log('nested login successful', res) const userid = res.data.id; - + localStorage.setItem('token', res.data.token) + + this.props.history.push('/dashboard') console.log('form data', this.state.input.movies) @@ -92,9 +94,7 @@ class Register extends React.Component { }) .then(res => { console.log(res); - localStorage.setItem('token', res.data.token) - this.props.history.push('/dashboard') }).catch(err => { console.log(err) From 373b4f71a4bc83ffb30e57f3096f133a0644336c Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 2 Mar 2020 15:18:08 -0500 Subject: [PATCH 103/822] tweaked logo png, looks way better now --- src/App.js | 8 ++++---- src/components/auth/Groa-logo-B2AA.png | Bin 54130 -> 15443 bytes src/components/auth/login.scss | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index 0455125..c829c85 100644 --- a/src/App.js +++ b/src/App.js @@ -6,7 +6,7 @@ import { ifDev } from "./utils/removeAttribute.js"; // import Dashboard from "./components/dashboard/index.js"; import Login from './components/auth/login'; // import Register from './auth/Register'; -import LoadingScreen from "./components/layout/LoadingScreen.js"; +// import LoadingScreen from "./components/layout/LoadingScreen.js"; import WatchList from "./components/movies/WatchList.js"; // config imports @@ -20,10 +20,10 @@ function App() {
{/* */} - {/* - */} + + {/* */} - + {/* */}
diff --git a/src/components/auth/Groa-logo-B2AA.png b/src/components/auth/Groa-logo-B2AA.png index ca899c384688b7a536a9fbe5b8ae05bab45e22cf..47d98f37ed2929cd5f7ba8181d125e49b5bccaa4 100644 GIT binary patch delta 12814 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 literal 54130 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�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 diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 464267c..df1acff 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -43,6 +43,7 @@ //Text Motto - your movies your way. .boxLeft{ + margin-top: 3%; color: white; // font-size: 300%; width: 70%; @@ -52,7 +53,7 @@ .Logo2{ height: 40%; - border: 2px solid red; + // border: 2px solid red; } .Text{ From 702e6301ca55024dd10ef675d5466cf54efcaddb Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Mon, 2 Mar 2020 15:59:26 -0500 Subject: [PATCH 104/822] fixing post login build fail issue --- src/App.js | 9 +-------- src/components/auth/postLogin.js | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/App.js b/src/App.js index 7efd202..1fc98c4 100644 --- a/src/App.js +++ b/src/App.js @@ -3,12 +3,8 @@ import { Route, Switch } from "react-router-dom"; // import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; // import Register from './auth/Register'; -<<<<<<< HEAD import PostLogin from './components/auth/postLogin'; -import './components/auth/postLogin.scss'; -======= import LoadingScreen from "./components/layout/LoadingScreen.js"; ->>>>>>> ed52cd8203f86bb702b466b22731ec8836a9b37a function App() { return ( @@ -17,11 +13,8 @@ function App() { {/* */} {/* */} -<<<<<<< HEAD - -======= + ->>>>>>> ed52cd8203f86bb702b466b22731ec8836a9b37a
); diff --git a/src/components/auth/postLogin.js b/src/components/auth/postLogin.js index 97f3960..0a6f6f0 100644 --- a/src/components/auth/postLogin.js +++ b/src/components/auth/postLogin.js @@ -1,6 +1,6 @@ import React, {useState} from 'react'; import axios from 'axios'; - +import './postLogin.scss' export default function PostLogin() { From 38d3d76506681cb4838b4c8a666269b8c3b2ea70 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 17:13:27 -0500 Subject: [PATCH 105/822] fixed register page, and added state --- src/components/auth/Register.js | 50 ++++++++++++++----------- src/components/dashboard/dash.scss | 1 + src/components/dashboard/dashboardv1.js | 27 +++++++------ src/components/dashboard/navigation.js | 10 ++--- src/store/actions/backendUserActions.js | 4 +- src/store/actions/index.js | 2 +- src/store/reducers/dashboardMain.js | 20 ++++++++++ src/store/reducers/index.js | 5 ++- src/utils/axiosWithAuth.js | 2 +- 9 files changed, 77 insertions(+), 44 deletions(-) create mode 100644 src/store/reducers/dashboardMain.js diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index e6d556c..9da5d2a 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -6,6 +6,8 @@ import { withRouter } from 'react-router-dom'; import axios from 'axios'; import Groa from './Groa-logo-B2.png'; import GroaWhite from './GroaWhite.png' +import { Login } from '../../store/actions' + class Register extends React.Component { constructor(props) { @@ -15,7 +17,7 @@ class Register extends React.Component { user: { email: '', - username:'', + user_name:'', password: '', confirmpassword: '' }, @@ -66,39 +68,41 @@ class Register extends React.Component { event.preventDefault(); this.setState({ submitted: true }); - console.log('username, and password', this.state.user.username, this.state.user.password) + console.log('username, and password', this.state.user.user_name, this.state.user.password) // const { user } = this.state; - if (this.state.user.email && this.state.user.username && this.state.user.password && this.state.user.confirmpassword) { + if (this.state.user.email && this.state.user.user_name && this.state.user.password && this.state.user.confirmpassword) { // this.props.register(user); - console.log('username, and password', this.state.user.username, this.state.user.password) + console.log('username, and password', this.state.user.user_name, this.state.user.password) axiosWithAuth() - .post('/register', {username: this.state.user.username, password: this.state.user.password}) + .post('/register', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { + localStorage.setItem('token', res.data.token) axiosWithAuth() - .post('/login', {username: this.state.user.username, password: this.state.user.password}) + .post('/login', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res2 => { console.log('nested login successful', res) const userid = res.data.id; + this.props.Login(userid); localStorage.setItem('token', res.data.token) this.props.history.push('/dashboard') console.log('form data', this.state.input.movies) - axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); + // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { + // headers:{ + // 'Content-Type':'multipart/form-data' + // } + // }) + // .then(res => { + // console.log(res); - }).catch(err => { - console.log(err) - }) + // }).catch(err => { + // console.log(err) + // }) }) .catch(err2 => { @@ -109,7 +113,7 @@ class Register extends React.Component { }) .catch(err => { console.log('Registration Error', err) - this.props.history.push('/Error') + // this.props.history.push('/Error') }) @@ -157,15 +161,15 @@ class Register extends React.Component {
Email is required
} -
+
- {submitted && !user.username && + {submitted && !user.user_name &&
Username is required
} @@ -257,4 +261,6 @@ const mapStateToProps = state => { }; export default withRouter(connect -(mapStateToProps)(Register)); \ No newline at end of file +(mapStateToProps, { + Login, +})(Register)); \ No newline at end of file diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss index 19033c7..091baca 100644 --- a/src/components/dashboard/dash.scss +++ b/src/components/dashboard/dash.scss @@ -183,6 +183,7 @@ margin-right: -500px; margin-bottom:300px; height: 100px; + color:black; } #zip-input{ diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 2a66e48..53e3b31 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,20 +1,23 @@ import React, {useState} from 'react'; import './dash.scss' import axios from 'axios'; +import { connect } from 'react-redux'; -const Dashboardv1 = () => { +const Dashboardv1 = (props) => { const [input, setInput] = useState({file:''}) const [ratings, setRatings] = useState({}) const [loading, setLoading] = useState() const [toggle, setToggle] = useState(true); + + console.log('user data here', props.userid) const changeHandler = e => { - + // new FormData() needs to be used for the file upload to work. let data = new FormData() data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('https://stylingbranch-groa-be.herokuapp.com/api/users/1/upload', data,{ + axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${props.userData}/upload`, data,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -26,7 +29,7 @@ const Dashboardv1 = () => { console.log(err) }) data = new FormData() - + // do something when loading add loading paremeter in jsx where the turnery operator ends. right now set to true. setTimeout(() => { setLoading(

.loading

) }, 1000); @@ -39,18 +42,13 @@ const Dashboardv1 = () => { setTimeout(() => { setLoading(

....loading

) }, 4000); - // setTimeout(() => { - // setLoading('..loading') - // }, 4000); - // setTimeout(() => { - // setLoading('.loading') - // }, 5000); - + } const handleSubmit = e => { setToggle(!toggle) e.preventDefault(); console.log(input); + //handle submit not being used this is depreciated code. //change user/1/ to be :id number handle submit currently does axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ headers:{ @@ -212,4 +210,9 @@ const Dashboardv1 = () => { ) } -export default Dashboardv1; +const mapStateToProps = ({dashboardMain}) => { + return { + userid: dashboardMain.userid + }; +}; +export default connect(mapStateToProps)(Dashboardv1); diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index db5545f..ec363a7 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -27,7 +27,7 @@ class Navigation extends Component { className='bars-icon' icon={faBars} /> - +
@@ -76,25 +76,25 @@ class Navigation extends Component { className='bell-icon' icon={faBell} /> - + - + - + - +
diff --git a/src/store/actions/backendUserActions.js b/src/store/actions/backendUserActions.js index 0d70479..3cd323e 100644 --- a/src/store/actions/backendUserActions.js +++ b/src/store/actions/backendUserActions.js @@ -1,7 +1,7 @@ import { axiosWithAuth } from '../../utils/axiosWithAuth'; import constants from '../constants'; -export const Login = (userId) => { - return {type: constants.USER_LOGIN , payload: userId} +export const Login = (Id) => { + return {type: constants.USER_LOGIN , payload: Id} } diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 5420cb9..cf55f1f 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -4,7 +4,7 @@ import { import{ setLogin, -} from './backendUserActions' +} from './dsUserActions' export { Login, setLogin diff --git a/src/store/reducers/dashboardMain.js b/src/store/reducers/dashboardMain.js new file mode 100644 index 0000000..b5d6139 --- /dev/null +++ b/src/store/reducers/dashboardMain.js @@ -0,0 +1,20 @@ +import constants from "../constants"; + +const initialState = { + isPostingUser: false, + isPostingUserError: null, + userid: null +}; + +export const dashboardMain = (state = initialState, { type, payload }) => { + switch (type) { + case constants.USER_LOGIN: + return { + ...state, + isPostingUser: true, + userid: payload + }; + default: + return state; + } +}; \ No newline at end of file diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 2859077..6f0bf9f 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,6 +1,9 @@ import { combineReducers } from "redux"; import { watchListReducer } from "./watchListReducer.js"; +import { dashboardMain } from "./dashboardMain.js"; + export const reducer = combineReducers({ - watchListReducer: watchListReducer + watchListReducer: watchListReducer, + dashboardMain: dashboardMain }); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 5b87864..6f9c6a2 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem('token') return axios.create({ - baseURL: 'https://stylingbranch-groa-be.herokuapp.com/api/users', + baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/', headers: { 'Content-Type': 'application/json', 'Authorization': `${token}` From d239cf3eefc2044be4a9878f0183b7779d8fa35e Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 17:45:39 -0500 Subject: [PATCH 106/822] fixed register page and dynamically added state to the url --- src/components/dashboard/dashboardv1.js | 24 ++++++++++++------------ src/utils/axiosWithAuth.js | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 53e3b31..249f3d4 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,6 +1,6 @@ import React, {useState} from 'react'; import './dash.scss' -import axios from 'axios'; +import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; import { connect } from 'react-redux'; @@ -17,7 +17,7 @@ const Dashboardv1 = (props) => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${props.userData}/upload`, data,{ + axiosWithAuth().post(`/${props.userid}/upload`, data,{ headers:{ 'Content-Type':'multipart/form-data' } @@ -50,16 +50,16 @@ const Dashboardv1 = (props) => { console.log(input); //handle submit not being used this is depreciated code. //change user/1/ to be :id number handle submit currently does - axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - }).catch(err => { - console.log(err) - }) + // axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ + // headers:{ + // 'Content-Type':'multipart/form-data' + // } + // }) + // .then(res => { + // console.log(res); + // }).catch(err => { + // console.log(err) + // }) } const flash = () => { diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 6f9c6a2..f2dd2b3 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem('token') return axios.create({ - baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/', + baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users', headers: { 'Content-Type': 'application/json', 'Authorization': `${token}` From c6926da14c91c06d84584a62d64f4933abadd115 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 18:02:28 -0500 Subject: [PATCH 107/822] changed to axios --- src/components/auth/Register.js | 7 ++----- src/utils/axiosWithAuth.js | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 9da5d2a..e11e8f8 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,7 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; import './register.scss' -import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; import { withRouter } from 'react-router-dom'; import axios from 'axios'; import Groa from './Groa-logo-B2.png'; @@ -74,12 +73,10 @@ class Register extends React.Component { // this.props.register(user); console.log('username, and password', this.state.user.user_name, this.state.user.password) - axiosWithAuth() - .post('/register', {user_name: this.state.user.user_name, password: this.state.user.password}) + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { localStorage.setItem('token', res.data.token) - axiosWithAuth() - .post('/login', {user_name: this.state.user.user_name, password: this.state.user.password}) + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res2 => { console.log('nested login successful', res) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index f2dd2b3..6f9c6a2 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem('token') return axios.create({ - baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users', + baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/', headers: { 'Content-Type': 'application/json', 'Authorization': `${token}` From 74716ce67177e107f5a0d81f75fbdf22d721c0d9 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 18:24:07 -0500 Subject: [PATCH 108/822] put headers in to fix ssl error --- src/components/auth/Register.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index e11e8f8..be5ccad 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -73,10 +73,29 @@ class Register extends React.Component { // this.props.register(user); console.log('username, and password', this.state.user.user_name, this.state.user.password) - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', {user_name: this.state.user.user_name, password: this.state.user.password}) + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', { + + headers: { + "Pragma": "public", + "Expires": 0, + "Cache-Control": "must-revalidate, post-check=0, pre=check=0", + "Cache-Control": "public", + "Content-description": "File Transfer", + "Content-type": "application/octet-stream", + }}, + {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { localStorage.setItem('token', res.data.token) - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', {user_name: this.state.user.user_name, password: this.state.user.password}) + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { + headers: { + "Pragma": "public", + "Expires": 0, + "Cache-Control": "must-revalidate, post-check=0, pre=check=0", + "Cache-Control": "public", + "Content-description": "File Transfer", + "Content-type": "application/octet-stream", + }}, + {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res2 => { console.log('nested login successful', res) From 2354cc2bbb8ac3f823cb24aac97294368ff66bed Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 18:31:11 -0500 Subject: [PATCH 109/822] took out the login, now its just register --- src/components/auth/Register.js | 67 +++++++++++++++++---------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index be5ccad..1ee7779 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -86,45 +86,48 @@ class Register extends React.Component { {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { localStorage.setItem('token', res.data.token) - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { - headers: { - "Pragma": "public", - "Expires": 0, - "Cache-Control": "must-revalidate, post-check=0, pre=check=0", - "Cache-Control": "public", - "Content-description": "File Transfer", - "Content-type": "application/octet-stream", - }}, - {user_name: this.state.user.user_name, password: this.state.user.password}) - .then(res2 => { - console.log('nested login successful', res) + const userid = res.data.id; + this.props.Login(userid); + this.props.history.push('/dashboard') + // axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { + // headers: { + // "Pragma": "public", + // "Expires": 0, + // "Cache-Control": "must-revalidate, post-check=0, pre=check=0", + // "Cache-Control": "public", + // "Content-description": "File Transfer", + // "Content-type": "application/octet-stream", + // }}, + // {user_name: this.state.user.user_name, password: this.state.user.password}) + // .then(res2 => { + // console.log('nested login successful', res) - const userid = res.data.id; - this.props.Login(userid); - localStorage.setItem('token', res.data.token) + // const userid = res.data.id; + // this.props.Login(userid); + // localStorage.setItem('token', res.data.token) - this.props.history.push('/dashboard') - console.log('form data', this.state.input.movies) + // this.props.history.push('/dashboard') + // console.log('form data', this.state.input.movies) - // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { - // headers:{ - // 'Content-Type':'multipart/form-data' - // } - // }) - // .then(res => { - // console.log(res); + // // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { + // // headers:{ + // // 'Content-Type':'multipart/form-data' + // // } + // // }) + // // .then(res => { + // // console.log(res); - // }).catch(err => { - // console.log(err) - // }) + // // }).catch(err => { + // // console.log(err) + // // }) - }) - .catch(err2 => { - console.log(err2) - // this.props.history.push('/Error') - }) + // }) + // .catch(err2 => { + // console.log(err2) + // // this.props.history.push('/Error') + // }) }) .catch(err => { From f6f23447601c1ed1127d538c99f21d14f3d63cae Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 18:42:48 -0500 Subject: [PATCH 110/822] moved button back --- src/components/auth/Register.js | 23 +++++++---------------- src/components/auth/register.scss | 1 + 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1ee7779..5b8cac9 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -73,16 +73,7 @@ class Register extends React.Component { // this.props.register(user); console.log('username, and password', this.state.user.user_name, this.state.user.password) - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', { - - headers: { - "Pragma": "public", - "Expires": 0, - "Cache-Control": "must-revalidate, post-check=0, pre=check=0", - "Cache-Control": "public", - "Content-description": "File Transfer", - "Content-type": "application/octet-stream", - }}, + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { localStorage.setItem('token', res.data.token) @@ -225,10 +216,7 @@ class Register extends React.Component {
Remember me
-
- - {registering} -
+
{/*

_________________________ or ________________________

*/} @@ -257,7 +245,10 @@ class Register extends React.Component { {/*

upload your letterboxd csv file here to get all past movie ratings

*/} {/*
*/} - +
+ + {registering} +
@@ -282,4 +273,4 @@ const mapStateToProps = state => { export default withRouter(connect (mapStateToProps, { Login, -})(Register)); \ No newline at end of file +})(Register)); diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index eb1f50f..c420afb 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -118,6 +118,7 @@ background:#21242C; color: white; border-radius: 4px; + margin-top:100px; } } From 62710a834720bbddf870b9b751849b475e32f8e5 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 2 Mar 2020 17:43:46 -0600 Subject: [PATCH 111/822] added more headers from source in hopes of testing it --- src/components/auth/Register.js | 498 +++++++++++++++++--------------- 1 file changed, 258 insertions(+), 240 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1ee7779..5f1394b 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,246 +1,268 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import './register.scss' -import { withRouter } from 'react-router-dom'; -import axios from 'axios'; -import Groa from './Groa-logo-B2.png'; -import GroaWhite from './GroaWhite.png' -import { Login } from '../../store/actions' +import React from "react"; +import { connect } from "react-redux"; +import "./register.scss"; +import { withRouter } from "react-router-dom"; +import axios from "axios"; +// import Groa from './Groa-logo-B2.png'; +import GroaWhite from "./GroaWhite.png"; +import { Login } from "../../store/actions"; class Register extends React.Component { + constructor(props) { + super(props); - constructor(props) { - super(props); + this.state = { + user: { + email: "", + user_name: "", + password: "", + confirmpassword: "" + }, + submitted: false, + input: { + file: "", + movies: "" + } + }; - this.state = { - user: { - - email: '', - user_name:'', - password: '', - confirmpassword: '' - }, - submitted: false, - input: { - file:"", - movies:"" - }, - }; + this.handleChange = this.handleChange.bind(this); + this.changeHandler = this.changeHandler.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } - this.handleChange = this.handleChange.bind(this); - this.changeHandler = this.changeHandler.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - } + handleChange(event) { + console.log(event.target.value); + const { name, value } = event.target; + const { user } = this.state; + this.setState({ + user: { + ...user, + [name]: value + } + }); + } - handleChange(event) { - console.log(event.target.value) - const { name, value } = event.target; - const { user } = this.state; - this.setState({ - user: { - ...user, - [name]: value - } - - - }); - } - - changeHandler(e) { - - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) + changeHandler(e) { + let data = new FormData(); + data.append("movies", e.target.files[0], e.target.files[0].name); + + console.log("data change handler", data); + const { input } = this.state; + this.setState({ + input: { + [e.target.name]: data + } + }); + } - console.log('data change handler', data); - const { input } = this.state; - this.setState({ - input: { - - [e.target.name]: data + handleSubmit(event) { + event.preventDefault(); + + this.setState({ submitted: true }); + console.log( + "username, and password", + this.state.user.user_name, + this.state.user.password + ); + // const { user } = this.state; + if ( + this.state.user.email && + this.state.user.user_name && + this.state.user.password && + this.state.user.confirmpassword + ) { + // this.props.register(user); + console.log( + "username, and password", + this.state.user.user_name, + this.state.user.password + ); + axios + .post( + "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register", + { + headers: { + Pragma: "public", + Expires: 0, + "Cache-Control": + "must-revalidate, post-check=0, pre=check=0, public", + "Content-description": "File Transfer", + "Content-type": "application/octet-stream", + "Content-Disposition": "attachment;", + "Content-Transfer-Encoding": "binary" } - - - }); - } + }, + { + user_name: this.state.user.user_name, + password: this.state.user.password + } + ) + .then(res => { + localStorage.setItem("token", res.data.token); + const userid = res.data.id; + this.props.Login(userid); + this.props.history.push("/dashboard"); + // axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { + // headers: { + // "Pragma": "public", + // "Expires": 0, + // "Cache-Control": "must-revalidate, post-check=0, pre=check=0", + // "Cache-Control": "public", + // "Content-description": "File Transfer", + // "Content-type": "application/octet-stream", + // }}, + // {user_name: this.state.user.user_name, password: this.state.user.password}) + // .then(res2 => { + // console.log('nested login successful', res) - handleSubmit(event) { - event.preventDefault(); - - this.setState({ submitted: true }); - console.log('username, and password', this.state.user.user_name, this.state.user.password) - // const { user } = this.state; - if (this.state.user.email && this.state.user.user_name && this.state.user.password && this.state.user.confirmpassword) { - // this.props.register(user); - console.log('username, and password', this.state.user.user_name, this.state.user.password) - - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', { - - headers: { - "Pragma": "public", - "Expires": 0, - "Cache-Control": "must-revalidate, post-check=0, pre=check=0", - "Cache-Control": "public", - "Content-description": "File Transfer", - "Content-type": "application/octet-stream", - }}, - {user_name: this.state.user.user_name, password: this.state.user.password}) - .then(res => { - localStorage.setItem('token', res.data.token) - const userid = res.data.id; - this.props.Login(userid); - this.props.history.push('/dashboard') - // axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { - // headers: { - // "Pragma": "public", - // "Expires": 0, - // "Cache-Control": "must-revalidate, post-check=0, pre=check=0", - // "Cache-Control": "public", - // "Content-description": "File Transfer", - // "Content-type": "application/octet-stream", - // }}, - // {user_name: this.state.user.user_name, password: this.state.user.password}) - // .then(res2 => { - // console.log('nested login successful', res) - - // const userid = res.data.id; - // this.props.Login(userid); - // localStorage.setItem('token', res.data.token) - - // this.props.history.push('/dashboard') - // console.log('form data', this.state.input.movies) - + // const userid = res.data.id; + // this.props.Login(userid); + // localStorage.setItem('token', res.data.token) - // // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { - // // headers:{ - // // 'Content-Type':'multipart/form-data' - // // } - // // }) - // // .then(res => { - // // console.log(res); - - - // // }).catch(err => { - // // console.log(err) - // // }) - - // }) - // .catch(err2 => { - // console.log(err2) - // // this.props.history.push('/Error') - // }) - - }) - .catch(err => { - console.log('Registration Error', err) - // this.props.history.push('/Error') - }) + // this.props.history.push('/dashboard') + // console.log('form data', this.state.input.movies) - + // // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { + // // headers:{ + // // 'Content-Type':'multipart/form-data' + // // } + // // }) + // // .then(res => { + // // console.log(res); - } + // // }).catch(err => { + // // console.log(err) + // // }) + + // }) + // .catch(err2 => { + // console.log(err2) + // // this.props.history.push('/Error') + // }) + }) + .catch(err => { + console.log("Registration Error", err); + // this.props.history.push('/Error') + }); } + } - render() { - const { registering } = this.props; - const { user, submitted } = this.state; - const { location, history } = this.props; - return ( -
+ render() { + const { registering } = this.props; + const { user, submitted } = this.state; + const { location, history } = this.props; + return ( +
+

Login

-

Login

- -
- -
- - groa logo - {/*

Your movies, your way.

*/} - +
+
+ groa logo + {/*

Your movies, your way.

*/} - {/*
*/} - {/*
+ {/*
*/} + {/*
Groa Helps you pick the perfect film,
So you can save your popcorn for the good stuff.
*/} -
- -
-
-

Register

+
-
- - {submitted && !user.email && -
Email is required
- } +
+ +

Register

-
- - {submitted && !user.user_name && -
Username is required
- } - -
- - {submitted && !user.password && -
Password is required
- } - - -
- - {submitted && !user.confirmpassword && -
Confirm Password is required
- } - - +
+ + {submitted && !user.email && ( +
Email is required
+ )} -
-
- -
- -
Remember me
-
- - {registering} -
-
- - {/*

_________________________ or ________________________

*/} +
+ + {submitted && !user.user_name && ( +
Username is required
+ )} - {/* +
+ + {submitted && !user.password && ( +
Password is required
+ )} + +
+ + {submitted && !user.confirmpassword && ( +
Confirm Password is required
+ )} + +
+
+ +
+ +
Remember me
+
+ + {registering} +
+
+ + {/*

_________________________ or ________________________

*/} + + {/* */} - {/*
+ {/*
*/} - {/* */} - - - {/*

upload your letterboxd csv file here to get all past movie ratings

*/} - {/* + + {/*

upload your letterboxd csv file here to get all past movie ratings

*/} + {/*
*/} - - - - -
- {/* end box right */} -
- {/*ends H1*/} -
- ); - } + +
+ {/* end box right */} +
+ {/*ends H1*/} +
+ ); + } } - const mapStateToProps = state => { - return { - userData: state.userData, - isFetching: state.isFetching, - error: state.error - }; + return { + userData: state.userData, + isFetching: state.isFetching, + error: state.error + }; }; -export default withRouter(connect -(mapStateToProps, { - Login, -})(Register)); \ No newline at end of file +export default withRouter( + connect(mapStateToProps, { + Login + })(Register) +); From 762b6ebef84041767a9e45029b0016f9df900193 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 18:56:26 -0500 Subject: [PATCH 112/822] fixed map state to props --- src/components/auth/Register.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 5b8cac9..03df8aa 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -262,11 +262,11 @@ class Register extends React.Component { } -const mapStateToProps = state => { +const mapStateToProps = ({ dashboardMain }) => { return { - userData: state.userData, - isFetching: state.isFetching, - error: state.error + userData: dashboardMain.userid, + isFetching: dashboardMain.isPostingUser, + error: dashboardMain.isPostingUserError }; }; From 25192dee0201e83c69ea78f86d67b02501b6bb81 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 2 Mar 2020 20:15:32 -0500 Subject: [PATCH 113/822] commented out changeHandler --- src/components/auth/Register.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 03df8aa..3b7c576 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -28,7 +28,7 @@ class Register extends React.Component { }; this.handleChange = this.handleChange.bind(this); - this.changeHandler = this.changeHandler.bind(this); + // this.changeHandler = this.changeHandler.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } @@ -46,22 +46,22 @@ class Register extends React.Component { }); } - changeHandler(e) { + // changeHandler(e) { - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) + // let data = new FormData() + // data.append('movies', e.target.files[0] , e.target.files[0].name) - console.log('data change handler', data); - const { input } = this.state; - this.setState({ - input: { + // console.log('data change handler', data); + // const { input } = this.state; + // this.setState({ + // input: { - [e.target.name]: data - } + // [e.target.name]: data + // } - }); - } + // }); + // } handleSubmit(event) { event.preventDefault(); @@ -76,6 +76,7 @@ class Register extends React.Component { axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', {user_name: this.state.user.user_name, password: this.state.user.password}) .then(res => { + console.log('token: ', res.data.token) localStorage.setItem('token', res.data.token) const userid = res.data.id; this.props.Login(userid); @@ -123,6 +124,7 @@ class Register extends React.Component { }) .catch(err => { console.log('Registration Error', err) + // this.props.history.push('/Error') }) From ac6bbedf30e59e54de3de8807a78ae9c4d3aabb1 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 09:54:46 -0500 Subject: [PATCH 114/822] added test to login --- src/App.test.js | 1 + .../auth/__snapshots__/login.test.js.snap | 7 +++++ src/components/auth/login.js | 2 +- src/components/auth/login.test.js | 29 +++++++++---------- src/utils/test-utils.js | 6 ++++ 5 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 src/components/auth/__snapshots__/login.test.js.snap diff --git a/src/App.test.js b/src/App.test.js index 62c9644..ee8b934 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -21,3 +21,4 @@ it("calls reactGAinitialization once", () => { render(); expect(reactGAinitialization).toBeCalled(); }); + diff --git a/src/components/auth/__snapshots__/login.test.js.snap b/src/components/auth/__snapshots__/login.test.js.snap new file mode 100644 index 0000000..0c9de9e --- /dev/null +++ b/src/components/auth/__snapshots__/login.test.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Button should render correctly 1`] = ` + +`; diff --git a/src/components/auth/login.js b/src/components/auth/login.js index c9a70b2..9d3b3e1 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -175,7 +175,7 @@ class LoginPage extends React.Component { {/* */}
- +
diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 60ae4be..b87580d 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -1,23 +1,22 @@ import React from 'react'; -import { render, getAllByTestId } from '@testing-library/react'; +import { render } from '@testing-library/react'; -import Login from './login' +import Login from './login'; -test('Login Component renders', () => { - const container = render() - console.log(container); - const logincomponent = getAllByTestId(container, "Login"); - expect(logincomponent.length).toBe(1); - }) -//////////////////////////////////////////////////// +describe('Button', () => { + it('should be defined', () => { + expect(Login).toBeDefined(); + }); -const addClick = clicked => { - return clicked + 1; -} + it('should render correctly', () => { + const tree = ( + + ); + expect(tree).toMatchSnapshot(); + }); + }); - test('on Login clicked', () => { - expect(addClick(0)).toBe(1); - }) + \ No newline at end of file diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index d561f41..4a483a8 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -51,3 +51,9 @@ module.exports = { queryByTestId, queryAllByTestId }; + +//Login button clicked + +export const addClick = clik => { + return clik + 1; +} \ No newline at end of file From ac1ad897e1489a4d9485a7499045787d0fd010ed Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 09:58:55 -0500 Subject: [PATCH 115/822] made test for post-login --- .../auth/__snapshots__/postLogin.test.js.snap | 7 +++++++ src/components/auth/postLogin.test.js | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/components/auth/__snapshots__/postLogin.test.js.snap create mode 100644 src/components/auth/postLogin.test.js diff --git a/src/components/auth/__snapshots__/postLogin.test.js.snap b/src/components/auth/__snapshots__/postLogin.test.js.snap new file mode 100644 index 0000000..4d275b2 --- /dev/null +++ b/src/components/auth/__snapshots__/postLogin.test.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Button postlogin should render postlogin correctly 1`] = ` + +`; diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js new file mode 100644 index 0000000..676df8b --- /dev/null +++ b/src/components/auth/postLogin.test.js @@ -0,0 +1,18 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import postLogin from './postLogin'; + + + +describe('Button postlogin', () => { + it('postlogin be defined', () => { + expect(postLogin).toBeDefined(); + }); + + it('should render postlogin correctly', () => { + const tree = ( + + ); + expect(tree).toMatchSnapshot(); + }); + }); \ No newline at end of file From 3aa2b033353b3963c8491feacb83be1a0af18fdc Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 11:18:10 -0500 Subject: [PATCH 116/822] added a click test --- src/components/auth/postLogin.test.js | 9 +++++++-- src/utils/test-utils.js | 11 ++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js index 676df8b..d97d5a5 100644 --- a/src/components/auth/postLogin.test.js +++ b/src/components/auth/postLogin.test.js @@ -1,7 +1,7 @@ import React from "react"; import { render } from "@testing-library/react"; import postLogin from './postLogin'; - +import { clikpostLogin } from "../../utils/test-utils"; describe('Button postlogin', () => { @@ -15,4 +15,9 @@ describe('Button postlogin', () => { ); expect(tree).toMatchSnapshot(); }); - }); \ No newline at end of file + }); + + test('adds properly', () => { + expect(clikpostLogin.sum(0, 1)).toBe(1) +}) + diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index d561f41..1fc9cd8 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,11 +43,20 @@ export function getByTestId(...args) { return null; } +const clikpostLogin = { + sum: (a, b) => { + return a + b + } +} + // re-export with overrides module.exports = { ...domTestingLib, getByTestId, getAllByTestId, queryByTestId, - queryAllByTestId + queryAllByTestId, + clikpostLogin }; + + From afeacb4fab66f8d5bdd11179b8b7cee1d021f99b Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 11:21:48 -0500 Subject: [PATCH 117/822] added click test for auth/login --- src/components/auth/login.test.js | 5 ++++- src/utils/test-utils.js | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index b87580d..1cbb1d3 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -2,7 +2,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import Login from './login'; - +import { clikLogin } from "../../utils/test-utils"; describe('Button', () => { @@ -18,5 +18,8 @@ describe('Button', () => { }); }); + test('adds properly', () => { + expect(clikLogin.sum(0, 1)).toBe(1) +}) \ No newline at end of file diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 4a483a8..22e4aab 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,17 +43,28 @@ export function getByTestId(...args) { return null; } +const clikPostLogin = { + sum: (a, b) => { + return a + b + } +} + +const clikLogin = { + sum: (a, b) => { + return a + b + } +} + // re-export with overrides module.exports = { ...domTestingLib, getByTestId, getAllByTestId, queryByTestId, - queryAllByTestId + queryAllByTestId, + clikPostLogin, + clikLogin }; //Login button clicked -export const addClick = clik => { - return clik + 1; -} \ No newline at end of file From 7308a6f72117d20606758e20117e13359d2c105e Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 11:23:33 -0500 Subject: [PATCH 118/822] tests for click post-login donw --- src/utils/test-utils.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 1fc9cd8..3927f3a 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,7 +43,13 @@ export function getByTestId(...args) { return null; } -const clikpostLogin = { +const clikPostLogin = { + sum: (a, b) => { + return a + b + } +} + +const clikLogin = { sum: (a, b) => { return a + b } @@ -56,7 +62,8 @@ module.exports = { getAllByTestId, queryByTestId, queryAllByTestId, - clikpostLogin + clikPostLogin, + clikLogin }; From 03068076945e951f0c2b3fd59c5c4f7e37118830 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 11:25:41 -0500 Subject: [PATCH 119/822] test click post login working --- src/components/auth/postLogin.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js index d97d5a5..270c53c 100644 --- a/src/components/auth/postLogin.test.js +++ b/src/components/auth/postLogin.test.js @@ -1,7 +1,7 @@ import React from "react"; import { render } from "@testing-library/react"; import postLogin from './postLogin'; -import { clikpostLogin } from "../../utils/test-utils"; +import { clikPostLogin } from "../../utils/test-utils"; describe('Button postlogin', () => { @@ -17,7 +17,7 @@ describe('Button postlogin', () => { }); }); - test('adds properly', () => { - expect(clikpostLogin.sum(0, 1)).toBe(1) + test('click post login', () => { + expect(clikPostLogin.sum(0, 1)).toBe(1) }) From 5a4d0237deb913939a38e65089967d351b5f2890 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 11:58:19 -0500 Subject: [PATCH 120/822] changed axios with auth --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 6f9c6a2..f2dd2b3 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem('token') return axios.create({ - baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/', + baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users', headers: { 'Content-Type': 'application/json', 'Authorization': `${token}` From d7024d492a99146edc5d103165c7f4b2140f5740 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 12:27:21 -0500 Subject: [PATCH 121/822] added error at bottom --- src/components/auth/Register.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 3b7c576..7437ccd 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -25,6 +25,7 @@ class Register extends React.Component { file:"", movies:"" }, + errorStatus: false, }; this.handleChange = this.handleChange.bind(this); @@ -124,7 +125,7 @@ class Register extends React.Component { }) .catch(err => { console.log('Registration Error', err) - + this.setState({errorStatus:true}) // this.props.history.push('/Error') }) @@ -186,6 +187,7 @@ class Register extends React.Component { }
+
+
{registering} + {this.state.errorStatus ?

Login Error, try again

:

Success

}
From 3aa60c9f9e3246f901ebd6644bbbae16ce910ebb Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 13:05:16 -0500 Subject: [PATCH 122/822] automatic login --- src/components/auth/Register.js | 505 +++++++++++++++----------------- 1 file changed, 233 insertions(+), 272 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 7437ccd..2ef1c9f 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,281 +1,242 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import './register.scss' -import { withRouter } from 'react-router-dom'; -import axios from 'axios'; -import Groa from './Groa-logo-B2.png'; -import GroaWhite from './GroaWhite.png' -import { Login } from '../../store/actions' +import React from "react"; +import { connect } from "react-redux"; +import "./register.scss"; +import { withRouter } from "react-router-dom"; +import axios from "axios"; +import Groa from "./Groa-logo-B2.png"; +import GroaWhite from "./GroaWhite.png"; +import { Login } from "../../store/actions"; class Register extends React.Component { + constructor(props) { + super(props); + + this.state = { + user: { + email: "", + user_name: "", + password: "", + confirmpassword: "" + }, + submitted: false, + input: { + file: "", + movies: "" + }, + errorStatus: false + }; - constructor(props) { - super(props); - - this.state = { - user: { - - email: '', - user_name:'', - password: '', - confirmpassword: '' - }, - submitted: false, - input: { - file:"", - movies:"" - }, - errorStatus: false, - }; - - this.handleChange = this.handleChange.bind(this); - // this.changeHandler = this.changeHandler.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleChange(event) { - console.log(event.target.value) - const { name, value } = event.target; - const { user } = this.state; - this.setState({ - user: { - ...user, - [name]: value - } - - + this.handleChange = this.handleChange.bind(this); + // this.changeHandler = this.changeHandler.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + handleChange(event) { + console.log(event.target.value); + const { name, value } = event.target; + const { user } = this.state; + this.setState({ + user: { + ...user, + [name]: value + } + }); + } + + + + handleSubmit(event) { + event.preventDefault(); + + this.setState({ submitted: true }); + console.log( + "username, and password", + this.state.user.user_name, + this.state.user.password + ); + // const { user } = this.state; + if ( + this.state.user.email && + this.state.user.user_name && + this.state.user.password && + this.state.user.confirmpassword + ) { + // this.props.register(user); + console.log( + "username, and password", + this.state.user.user_name, + this.state.user.password + ); + + axios + .post( + "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register", + { + user_name: this.state.user.user_name, + password: this.state.user.password + } + ) + .then(res => { + // console.log("token: ", res.data.token); + + + + axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', + {user_name: this.state.user.user_name, password: this.state.user.password}) + .then(res2 => { + console.log('nested login successful', res2) + + const userid = res2.data.id; + this.props.Login(userid); + console.log('token: ', res2.data.token); + localStorage.setItem('token', res2.data.token) + + this.props.history.push('/dashboard') + + + }) + .catch(err2 => { + console.log(err2) + // this.props.history.push('/Error') + }) + }) + .catch(err => { + console.log("Registration Error", err); + this.setState({ errorStatus: true }); + // this.props.history.push('/Error') }); } - - // changeHandler(e) { - - // let data = new FormData() - // data.append('movies', e.target.files[0] , e.target.files[0].name) - - // console.log('data change handler', data); - // const { input } = this.state; - // this.setState({ - // input: { - - // [e.target.name]: data - // } - - - // }); - // } - - handleSubmit(event) { - event.preventDefault(); - - this.setState({ submitted: true }); - console.log('username, and password', this.state.user.user_name, this.state.user.password) - // const { user } = this.state; - if (this.state.user.email && this.state.user.user_name && this.state.user.password && this.state.user.confirmpassword) { - // this.props.register(user); - console.log('username, and password', this.state.user.user_name, this.state.user.password) - - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register', - {user_name: this.state.user.user_name, password: this.state.user.password}) - .then(res => { - console.log('token: ', res.data.token) - localStorage.setItem('token', res.data.token) - const userid = res.data.id; - this.props.Login(userid); - this.props.history.push('/dashboard') - // axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', { - // headers: { - // "Pragma": "public", - // "Expires": 0, - // "Cache-Control": "must-revalidate, post-check=0, pre=check=0", - // "Cache-Control": "public", - // "Content-description": "File Transfer", - // "Content-type": "application/octet-stream", - // }}, - // {user_name: this.state.user.user_name, password: this.state.user.password}) - // .then(res2 => { - // console.log('nested login successful', res) - - // const userid = res.data.id; - // this.props.Login(userid); - // localStorage.setItem('token', res.data.token) - - // this.props.history.push('/dashboard') - // console.log('form data', this.state.input.movies) - - - // // axios.post(`http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/${userid}/upload`, this.state.input.movies, { - // // headers:{ - // // 'Content-Type':'multipart/form-data' - // // } - // // }) - // // .then(res => { - // // console.log(res); - - - // // }).catch(err => { - // // console.log(err) - // // }) - - // }) - // .catch(err2 => { - // console.log(err2) - // // this.props.history.push('/Error') - // }) - - }) - .catch(err => { - console.log('Registration Error', err) - this.setState({errorStatus:true}) - // this.props.history.push('/Error') - }) - - - - } - } - - render() { - const { registering } = this.props; - const { user, submitted } = this.state; - const { location, history } = this.props; - return ( -
- -

Login

- -
- -
- - groa logo - {/*

Your movies, your way.

*/} - - - {/*
*/} - {/*
-
Groa Helps you pick the perfect film,
-
So you can save your popcorn for the good stuff.
-
*/} -
- -
-
-

Register

- -
- - {submitted && !user.email && -
Email is required
- } - -
- - {submitted && !user.user_name && -
Username is required
- } - -
- - - {submitted && !user.password && -
Password is required
- } - - -
- - {submitted && !user.confirmpassword && -
Confirm Password is required
- } - - - -
-
- -
- -
Remember me
- -
- - {/*

_________________________ or ________________________

*/} - - {/* - - - */} - {/*
- */} - {/* */} - - - {/*

upload your letterboxd csv file here to get all past movie ratings

*/} - {/* -
*/} -
- - {registering} - {this.state.errorStatus ?

Login Error, try again

:

Success

} -
- - - -
- {/* end box right */} -
- {/*ends H1*/} -
- ); - } + } + + render() { + const { registering } = this.props; + const { user, submitted } = this.state; + const { location, history } = this.props; + return ( +
+

Login

+ +
+
+ groa logo +
+ +
+
+

Register

+ +
+ + {submitted && !user.email && ( +
Email is required
+ )} + +
+ + {submitted && !user.user_name && ( +
Username is required
+ )} + +
+ + + {submitted && !user.password && ( +
Password is required
+ )} + +
+ + {submitted && !user.confirmpassword && ( +
Confirm Password is required
+ )} + +
+
+ +
+ +
Remember me
+
+ +
+ + {registering} + {this.state.errorStatus ? ( +

Login Error, try again

+ ) : ( +

Success

+ )} +
+
+
+ {/* end box right */} +
+ {/*ends H1*/} +
+ ); + } } - const mapStateToProps = ({ dashboardMain }) => { - return { - userData: dashboardMain.userid, - isFetching: dashboardMain.isPostingUser, - error: dashboardMain.isPostingUserError - }; + return { + userData: dashboardMain.userid, + isFetching: dashboardMain.isPostingUser, + error: dashboardMain.isPostingUserError + }; }; - -export default withRouter(connect -(mapStateToProps, { - Login, -})(Register)); +// with withRouter allowd this.props.history.push() to work. +export default withRouter( + connect(mapStateToProps, { + Login + })(Register) +); From db47959ef950f4a76a3c0c1ad61c479e8d922779 Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 3 Mar 2020 10:42:37 -0800 Subject: [PATCH 123/822] added a register test --- src/components/auth/Register.js | 1 + src/components/auth/register.test.js | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 src/components/auth/register.test.js diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index a18613d..1d77c49 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -4,6 +4,7 @@ import './register.scss' import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; import { withRouter } from 'react-router-dom'; import axios from 'axios'; + class Register extends React.Component { constructor(props) { diff --git a/src/components/auth/register.test.js b/src/components/auth/register.test.js new file mode 100644 index 0000000..b2696ad --- /dev/null +++ b/src/components/auth/register.test.js @@ -0,0 +1,13 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; + + +// component to be tested. +import Register from "./Register.js"; + +it("renders Register component", () => { + const { container } = render(); + const component = getAllByTestId(container, "Register-component"); + expect(component.length).toBe(1); +}); \ No newline at end of file From fad839c3dcd9b22b92fb94341de451ebb0fee79f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 3 Mar 2020 13:04:10 -0600 Subject: [PATCH 124/822] testing works, more implementation will need to happen to test with redux store --- src/App.js | 43 +- src/components/dashboard/dashboardv1.js | 407 ++++++++++--------- src/components/dashboard/dashboardv1.test.js | 87 ++-- src/index.js | 20 +- 4 files changed, 275 insertions(+), 282 deletions(-) diff --git a/src/App.js b/src/App.js index e190706..3ec8815 100644 --- a/src/App.js +++ b/src/App.js @@ -5,31 +5,46 @@ import { ifDev } from "./utils/removeAttribute.js"; // local imports import Dashboard from "./components/dashboard/index.js"; // import Login from './auth/Login'; -import Register from './components/auth/Register'; +import Register from "./components/auth/Register"; import LoadingScreen from "./components/layout/LoadingScreen.js"; -import { PrivateRoute } from './utils/privateRoute.js'; +import { PrivateRoute } from "./utils/privateRoute.js"; import Navigation from "./components/dashboard/navigation.js"; import WatchList from "./components/movies/WatchList.js"; // config imports import reactGAinitialization from "./config/analytics.js"; +// creating the store +import { Provider } from "react-redux"; +import { createStore, compose, applyMiddleware } from "redux"; +import thunk from "redux-thunk"; +import logger from "redux-logger"; +import { reducer } from "./store/reducers"; + +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const store = createStore( + reducer, + composeEnhancers(applyMiddleware(thunk, logger)) +); + function App() { useEffect(() => reactGAinitialization(), []); return ( - -
- - - - {/* */} - - {/* */} - - -
-
+ + +
+ + + + {/* */} + + {/* */} + + +
+
+
); } diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 249f3d4..e4f9a68 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,218 +1,221 @@ -import React, {useState} from 'react'; -import './dash.scss' -import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; -import { connect } from 'react-redux'; +import React, { useState } from "react"; +import "./dash.scss"; +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { connect } from "react-redux"; +import Dashboard from "."; +const Dashboardv1 = props => { + const [input, setInput] = useState({ file: "" }); + const [ratings, setRatings] = useState({}); + const [loading, setLoading] = useState(); + const [toggle, setToggle] = useState(true); -const Dashboardv1 = (props) => { - const [input, setInput] = useState({file:''}) - const [ratings, setRatings] = useState({}) - const [loading, setLoading] = useState() - const [toggle, setToggle] = useState(true); + console.log("user data here", props.userid); + const changeHandler = e => { + // new FormData() needs to be used for the file upload to work. + let data = new FormData(); + data.append("movies", e.target.files[0], e.target.files[0].name); + //change user/1/ to be :id number + //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axiosWithAuth() + .post(`/${props.userid}/upload`, data, { + headers: { + "Content-Type": "multipart/form-data" + } + }) + .then(res => { + console.log(res); + setRatings(res.data); + }) + .catch(err => { + console.log(err); + }); + data = new FormData(); + // do something when loading add loading paremeter in jsx where the turnery operator ends. right now set to true. + setTimeout(() => { + setLoading( +

+ .loading +

+ ); + }, 1000); + setTimeout(() => { + setLoading( +

+ ..loading +

+ ); + }, 2000); + setTimeout(() => { + setLoading( +

+ ...loading +

+ ); + }, 3000); + setTimeout(() => { + setLoading( +

+ ....loading +

+ ); + }, 4000); + }; + const handleSubmit = e => { + setToggle(!toggle); + e.preventDefault(); + console.log(input); + //handle submit not being used this is depreciated code. + //change user/1/ to be :id number handle submit currently does + // axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ + // headers:{ + // 'Content-Type':'multipart/form-data' + // } + // }) + // .then(res => { + // console.log(res); + // }).catch(err => { + // console.log(err) + // }) + }; + const flash = () => { + setTimeout(() => { + return "flash"; + }, 1000); + }; - console.log('user data here', props.userid) - const changeHandler = e => { - // new FormData() needs to be used for the file upload to work. - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) - //change user/1/ to be :id number - //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axiosWithAuth().post(`/${props.userid}/upload`, data,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - setRatings(res.data) - }).catch(err => { - console.log(err) - }) - data = new FormData() - // do something when loading add loading paremeter in jsx where the turnery operator ends. right now set to true. - setTimeout(() => { - setLoading(

.loading

) - }, 1000); - setTimeout(() => { - setLoading(

..loading

) - }, 2000); - setTimeout(() => { - setLoading(

...loading

) - }, 3000); - setTimeout(() => { - setLoading(

....loading

) - }, 4000); - - } - const handleSubmit = e => { - setToggle(!toggle) - e.preventDefault(); - console.log(input); - //handle submit not being used this is depreciated code. - //change user/1/ to be :id number handle submit currently does - // axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ - // headers:{ - // 'Content-Type':'multipart/form-data' - // } - // }) - // .then(res => { - // console.log(res); - // }).catch(err => { - // console.log(err) - // }) - - } - const flash = () => { - setTimeout(() => { - return "flash" - }, 1000); - } + return ( +
+
+ {/*

Welcome to the dashboard.

*/} - return ( -
-
- {/*

Welcome to the dashboard.

*/} - -
-
- - - {/* */} -
- {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} -

upload your letterboxd csv file here to get all past movie ratings

-
- {/*
Container for settings
*/} -
- - {ratings.length > 0 ? ratings.map((x, index) => { - if(index < 201){ - - - return ( +
+
+ -
- {/*
+ {/* */} + + {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} +

+ upload your letterboxd csv file here to get all past movie ratings +

+
+ {/*
Container for settings
*/} +
+ {ratings.length > 0 + ? ratings.map((x, index) => { + if (index < 201) { + return ( +
+ {/*
Looks Cool šŸ‘Ž Not interested šŸ‘
*/} - -
- -
-

{x.Name}

-

{x.Year}

-

Rating: {x.Rating}

-

Votes:

-

Like by fans of:

- {/*

{x.Letterboxd_URI}

*/} - {/*
+ +
+ +
+

{x.Name}

+

{x.Year}

+

Rating: {x.Rating}

+

Votes:

+

Like by fans of:

+ {/*

{x.Letterboxd_URI}

*/} + {/*
*/} -
- -
- ) - } - }) - : true} - - {toggle == true ? -
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
- -
: true} - - +
+
+ ); + } + }) + : true} + + {toggle == true ? ( +
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

+
+
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

- +
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

+
+
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

+
+
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

+
+
+
+
+
+

Movie Title

+

Year

+

Rating:

+

Votes:

+

Liked by fans of:

+
+
+ ) : ( + true + )}
- - - ) -} +
+
+ ); +}; -const mapStateToProps = ({dashboardMain}) => { - return { - userid: dashboardMain.userid - }; +const mapStateToProps = ({ dashboardMain }) => { + return { + userid: dashboardMain.userid + }; }; -export default connect(mapStateToProps)(Dashboardv1); + +export default Dashboardv1; diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index cc99887..f85a6ab 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -1,7 +1,7 @@ import React from "react"; import { render } from "@testing-library/react"; import { getAllByTestId } from "../../utils/test-utils.js"; -import puppeteer from 'puppeteer'; +import puppeteer from "puppeteer"; // component to be tested. import Dashboardv1 from "./dashboardv1.js"; @@ -12,12 +12,12 @@ it("renders dashboardv1", () => { const component = getAllByTestId(container, "dashboard-screen"); expect(component.length).toBe(1); }); -it("renders dashboardv1", () => { - const { container } = render(); +// it("renders dashboardv1", () => { +// const { container } = render(); - const component = getAllByTestId(container, "box-container"); - expect(component.length).toBe(1); -}); +// const component = getAllByTestId(container, "box-container"); +// expect(component.length).toBe(1); +// }); // it("renders dashboardv1", () => { // const { container } = render(); @@ -25,50 +25,43 @@ it("renders dashboardv1", () => { // expect(component.length).toBe(200); // }); -//------------puppeteer -test('Validating movie form button', async() => { - const browser = await puppeteer.launch({headless:false,defaultViewport: null}); - const page = await browser.newPage(); - - await page.goto('localhost:3000/') - await page.waitFor(4000); - await page.waitForSelector('.forms') - // await page.$eval('input[name=email]', el => el.value = 'puppeteertj123@gmail.com'); - // await page.waitFor(400); - // await page.$eval('input[name=username]', el => el.value = 'puppeteer3'); - // await page.waitFor(400); - // await page.$eval('input[name=password]', el => el.value = 'Groa123'); - // await page.waitFor(400); - // await page.$eval('input[name=confirmpassword]', el => el.value = 'Groa123'); - // await page.waitFor(2000) - await page.click('input[name=email]') - await page.keyboard.type('puppeteertj123@gmail.com'); - await page.waitFor(300); - await page.click('input[name=username]') - await page.keyboard.type('puppeteer10'); - await page.waitFor(300); - await page.click('input[name=password]') - await page.keyboard.type('Groa123'); - await page.waitFor(300); - await page.click('input[name=confirmpassword]') - await page.keyboard.type('Groa123'); - - const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); - expect(movieInput).toBe('form-control') - - await page.waitFor(1500); +//------------puppeteer +// test('Validating movie form button', async() => { +// const browser = await puppeteer.launch({headless:false,defaultViewport: null}); +// const page = await browser.newPage(); - // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); - // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; - - // await inputUploadHandle.uploadFile(fileToUpload); - await page.click('.LoginBtn'); +// await page.goto('localhost:3000/') +// await page.waitFor(4000); +// await page.waitForSelector('.forms') +// // await page.$eval('input[name=email]', el => el.value = 'puppeteertj123@gmail.com'); +// // await page.waitFor(400); +// // await page.$eval('input[name=username]', el => el.value = 'puppeteer3'); +// // await page.waitFor(400); +// // await page.$eval('input[name=password]', el => el.value = 'Groa123'); +// // await page.waitFor(400); +// // await page.$eval('input[name=confirmpassword]', el => el.value = 'Groa123'); +// // await page.waitFor(2000) +// await page.click('input[name=email]') +// await page.keyboard.type('puppeteertj123@gmail.com'); +// await page.waitFor(300); +// await page.click('input[name=username]') +// await page.keyboard.type('puppeteer10'); +// await page.waitFor(300); +// await page.click('input[name=password]') +// await page.keyboard.type('Groa123'); +// await page.waitFor(300); +// await page.click('input[name=confirmpassword]') +// await page.keyboard.type('Groa123'); +// const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); +// expect(movieInput).toBe('form-control') - - +// await page.waitFor(1500); +// // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); +// // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; - -},40000) +// // await inputUploadHandle.uploadFile(fileToUpload); +// await page.click('.LoginBtn'); +// },40000) diff --git a/src/index.js b/src/index.js index a0f95cc..48da9f6 100644 --- a/src/index.js +++ b/src/index.js @@ -4,25 +4,7 @@ import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; -import { Provider } from "react-redux"; -import { createStore, compose, applyMiddleware } from "redux"; -import thunk from "redux-thunk"; -import logger from "redux-logger"; -import { reducer } from "./store/reducers/index.js"; - -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; -const store = createStore( - reducer, - composeEnhancers(applyMiddleware(thunk, logger)) -); - -ReactDOM.render( - - - , - - document.getElementById("root") -); +ReactDOM.render(, document.getElementById("root")); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. From ff12b0af2f11fdab839d6bd942f96df18da9424c Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 14:12:21 -0500 Subject: [PATCH 125/822] added new backend link --- src/App.js | 1 + src/App.test.js | 2 +- src/components/auth/Register.js | 26 +++------ src/components/dashboard/dashboardv1.js | 8 +-- src/components/dashboard/dashboardv1.test.js | 59 +++++++++----------- src/components/dashboard/index.js | 2 +- src/index.js | 9 +-- src/store/actions/backendUserActions.js | 2 +- 8 files changed, 46 insertions(+), 63 deletions(-) diff --git a/src/App.js b/src/App.js index e190706..e432c95 100644 --- a/src/App.js +++ b/src/App.js @@ -27,6 +27,7 @@ function App() { {/* */} +
diff --git a/src/App.test.js b/src/App.test.js index 62c9644..c62bb8b 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -5,7 +5,7 @@ import { getAllByTestId } from "./utils/test-utils.js"; // component to be tested. import App from "./App.js"; -// creating a mock function to test if GA initialization was called. +//creating a mock function to test if GA initialization was called. import reactGAinitialization from "./config/analytics.js"; jest.mock("./config/analytics.js"); reactGAinitialization.mockImplementation(() => () => null); diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 2ef1c9f..289b9b8 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -3,7 +3,7 @@ import { connect } from "react-redux"; import "./register.scss"; import { withRouter } from "react-router-dom"; import axios from "axios"; -import Groa from "./Groa-logo-B2.png"; + import GroaWhite from "./GroaWhite.png"; import { Login } from "../../store/actions"; @@ -67,23 +67,15 @@ class Register extends React.Component { this.state.user.user_name, this.state.user.password ); - - axios - .post( - "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/register", - { - user_name: this.state.user.user_name, - password: this.state.user.password - } - ) - .then(res => { - // console.log("token: ", res.data.token); + // https://api.groa.us/ + // "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + axios.post("https://api.groa.us/api/users/register",{user_name: this.state.user.user_name, password: this.state.user.password}).then(res => { + console.log("token: ", res.data.token); - axios.post('http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users/login', - {user_name: this.state.user.user_name, password: this.state.user.password}) - .then(res2 => { + axios.post('https://api.groa.us/api/users/login', + {user_name: this.state.user.user_name, password: this.state.user.password}).then(res2 => { console.log('nested login successful', res2) const userid = res2.data.id; @@ -111,7 +103,7 @@ class Register extends React.Component { render() { const { registering } = this.props; const { user, submitted } = this.state; - const { location, history } = this.props; + // const { location, history } = this.props; return (

Login

@@ -234,7 +226,7 @@ const mapStateToProps = ({ dashboardMain }) => { error: dashboardMain.isPostingUserError }; }; -// with withRouter allowd this.props.history.push() to work. + export default withRouter( connect(mapStateToProps, { Login diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 249f3d4..76090ab 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -62,11 +62,7 @@ const Dashboardv1 = (props) => { // }) } - const flash = () => { - setTimeout(() => { - return "flash" - }, 1000); - } + return (
@@ -129,7 +125,7 @@ const Dashboardv1 = (props) => { }) : true} - {toggle == true ? + {toggle === true ?
diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index cc99887..0d280b3 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -26,43 +26,36 @@ it("renders dashboardv1", () => { // }); //------------puppeteer -test('Validating movie form button', async() => { - const browser = await puppeteer.launch({headless:false,defaultViewport: null}); - const page = await browser.newPage(); +// test('Validating movie form button', async() => { +// const browser = await puppeteer.launch({headless:false,defaultViewport: null}); +// const page = await browser.newPage(); - await page.goto('localhost:3000/') - await page.waitFor(4000); - await page.waitForSelector('.forms') - // await page.$eval('input[name=email]', el => el.value = 'puppeteertj123@gmail.com'); - // await page.waitFor(400); - // await page.$eval('input[name=username]', el => el.value = 'puppeteer3'); - // await page.waitFor(400); - // await page.$eval('input[name=password]', el => el.value = 'Groa123'); - // await page.waitFor(400); - // await page.$eval('input[name=confirmpassword]', el => el.value = 'Groa123'); - // await page.waitFor(2000) - await page.click('input[name=email]') - await page.keyboard.type('puppeteertj123@gmail.com'); - await page.waitFor(300); - await page.click('input[name=username]') - await page.keyboard.type('puppeteer10'); - await page.waitFor(300); - await page.click('input[name=password]') - await page.keyboard.type('Groa123'); - await page.waitFor(300); - await page.click('input[name=confirmpassword]') - await page.keyboard.type('Groa123'); +// await page.goto('localhost:3000/') +// await page.waitFor(4000); +// await page.waitForSelector('.forms') + +// await page.click('input[name=email]') +// await page.keyboard.type('puppeteertj123@gmail.com'); +// await page.waitFor(300); +// await page.click('input[name=username]') +// await page.keyboard.type('puppeteer10'); +// await page.waitFor(300); +// await page.click('input[name=password]') +// await page.keyboard.type('Groa123'); +// await page.waitFor(300); +// await page.click('input[name=confirmpassword]') +// await page.keyboard.type('Groa123'); - const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); - expect(movieInput).toBe('form-control') +// const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); +// expect(movieInput).toBe('form-control') - await page.waitFor(1500); +// await page.waitFor(1500); - // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); - // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; +// // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); +// // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; - // await inputUploadHandle.uploadFile(fileToUpload); - await page.click('.LoginBtn'); +// // await inputUploadHandle.uploadFile(fileToUpload); +// await page.click('.LoginBtn'); @@ -70,5 +63,5 @@ test('Validating movie form button', async() => { -},40000) +// },40000) diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 5f13330..feadd22 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,4 +1,4 @@ -import React, {useState} from 'react'; +import React from 'react'; import Dashboardv1 from './dashboardv1'; import Navigation from './navigation.js'; diff --git a/src/index.js b/src/index.js index a0f95cc..04c037b 100644 --- a/src/index.js +++ b/src/index.js @@ -4,8 +4,9 @@ import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; -import { Provider } from "react-redux"; + import { createStore, compose, applyMiddleware } from "redux"; +import { Provider } from "react-redux"; import thunk from "redux-thunk"; import logger from "redux-logger"; import { reducer } from "./store/reducers/index.js"; @@ -17,9 +18,9 @@ const store = createStore( ); ReactDOM.render( - - - , + + + , document.getElementById("root") ); diff --git a/src/store/actions/backendUserActions.js b/src/store/actions/backendUserActions.js index 3cd323e..e2b3fbb 100644 --- a/src/store/actions/backendUserActions.js +++ b/src/store/actions/backendUserActions.js @@ -1,4 +1,4 @@ -import { axiosWithAuth } from '../../utils/axiosWithAuth'; + import constants from '../constants'; export const Login = (Id) => { From 86ce88b1a955e906940e980dc884484123a8e92c Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 14:41:52 -0500 Subject: [PATCH 126/822] axiosWithAuth url change --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index f2dd2b3..647823c 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem('token') return axios.create({ - baseURL: 'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users', + baseURL: 'https://api.groa.us/api/users', headers: { 'Content-Type': 'application/json', 'Authorization': `${token}` From 3d83b4619b493fcbfaeb25504ad56c5ab1787b36 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 14:47:50 -0500 Subject: [PATCH 127/822] changed route post to /uploading --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 558c167..1060779 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -17,7 +17,7 @@ const Dashboardv1 = (props) => { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axiosWithAuth().post(`/${props.userid}/upload`, data,{ + axiosWithAuth().post(`/${props.userid}/uploading`, data,{ headers:{ 'Content-Type':'multipart/form-data' } From 1438bd24a821b199babc678d15e5320bddae0c8a Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 15:04:28 -0500 Subject: [PATCH 128/822] changed base url to updated backend --- src/components/auth/login.test.js | 7 +++++++ src/components/auth/postLogin.test.js | 24 ++++++++++++++++++++++++ src/utils/axiosWithAuth.js | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/components/auth/postLogin.test.js diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 1cbb1d3..3e17900 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -22,4 +22,11 @@ describe('Button', () => { expect(clikLogin.sum(0, 1)).toBe(1) }) +// it("renders Login Component", () => { +// const { container } = render(); + +// const component = clikLogin(container, "App-component"); +// expect(component.length).toBe(1); +// }); + \ No newline at end of file diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js new file mode 100644 index 0000000..b9ea2ab --- /dev/null +++ b/src/components/auth/postLogin.test.js @@ -0,0 +1,24 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import postLogin from './postLogin'; +import { clikPostLogin } from "../../utils/test-utils"; + + +describe('Button postlogin', () => { + it('postlogin be defined', () => { + expect(postLogin).toBeDefined(); + }); + + it('should render postlogin correctly', () => { + const tree = ( + + ); + expect(tree).toMatchSnapshot(); + }); + }); + + test('click post login', () => { + expect(clikPostLogin.sum(0, 1)).toBe(1) +}) + + diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index fea858c..67048ad 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -5,7 +5,7 @@ const axiosWithAuth = () => { //need env file for line 6? //var key = process.env.REACT_APP_KEY return axios.create({ - baseURL:'http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/', + baseURL:'https://api.groa.us/', headers: { Authorization: token } From c53f2a3c2fe209da082896a530248e003a832f47 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 15:19:39 -0500 Subject: [PATCH 129/822] tests done for auth --- src/components/auth/login.test.js | 2 +- src/components/auth/postLogin.test.js | 24 ------------------------ 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 src/components/auth/postLogin.test.js diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 3e17900..ec8a622 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -25,7 +25,7 @@ describe('Button', () => { // it("renders Login Component", () => { // const { container } = render(); -// const component = clikLogin(container, "App-component"); +// const component = clikLogin(container, "login-component"); // expect(component.length).toBe(1); // }); diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js deleted file mode 100644 index b9ea2ab..0000000 --- a/src/components/auth/postLogin.test.js +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import { render } from "@testing-library/react"; -import postLogin from './postLogin'; -import { clikPostLogin } from "../../utils/test-utils"; - - -describe('Button postlogin', () => { - it('postlogin be defined', () => { - expect(postLogin).toBeDefined(); - }); - - it('should render postlogin correctly', () => { - const tree = ( - - ); - expect(tree).toMatchSnapshot(); - }); - }); - - test('click post login', () => { - expect(clikPostLogin.sum(0, 1)).toBe(1) -}) - - From 7a41e24202a048b1bc61ce2aa5886c362310472e Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 3 Mar 2020 12:53:33 -0800 Subject: [PATCH 130/822] deleted the env --- .env | 1 + src/components/auth/Register.js | 34 +++++++++++-------------------- src/components/auth/register.scss | 17 +++++----------- 3 files changed, 18 insertions(+), 34 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..3db256a --- /dev/null +++ b/.env @@ -0,0 +1 @@ +REACT_APP_ANALYTICS_ID=UA-159070324-1 \ No newline at end of file diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1d77c49..bc49b59 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -128,14 +128,12 @@ class Register extends React.Component {
- {/*

Your movies, your way.

*/} +
- {/*
+
-
Groa Helps you pick the perfect film,
-
So you can save your popcorn for the good stuff.
-
*/} +
@@ -201,18 +199,10 @@ class Register extends React.Component {
-
Remember me
-
+
Remember me
+
- {/*

_________________________ or ________________________

*/} - - {/* - - - */} - {/*
-
*/} + upload your letterboxd csv file here to get all past movie ratings

- {/*
-
*/} -
- - {registering} -
+ + +
+ + {registering} +
diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index 6100ad8..ec3311d 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -1,6 +1,8 @@ .container{ - min-height: 100vh; - background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), + // min-height: 100vh; + width: 100%; + height: 100%; + background: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); h3{ @@ -16,16 +18,7 @@ width: 50%; padding: 1px 20px; } - .text{ - font-size:320%; - color: white; - // margin: 0 0 0 15%; - // display: flex; - // // flex-direction: column; - // // justify-content: center; - padding:15% ; - - } + .box1{ margin: -15% 2% 2% 0; From 7482f4e2ad0c43c57f7f0049aaf8ee17c7bb24b2 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Tue, 3 Mar 2020 15:57:27 -0500 Subject: [PATCH 131/822] navigation test --- src/components/dashboard/navigation.test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/components/dashboard/navigation.test.js diff --git a/src/components/dashboard/navigation.test.js b/src/components/dashboard/navigation.test.js new file mode 100644 index 0000000..d993270 --- /dev/null +++ b/src/components/dashboard/navigation.test.js @@ -0,0 +1,14 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; + + +// component to be tested. +import Navigation from "./navigation.js"; + +it("renders a navigation bar in the dashboard", () => { + const { container } = render (); + + const component = getAllByTestId(container, "navigation"); + expect(component.length).toBe(0); +}); \ No newline at end of file From d1b296720546795888f7d22d82ca27b82ede3705 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 17:05:12 -0500 Subject: [PATCH 132/822] cleaned up code --- src/components/auth/login.js | 45 +++------------- src/components/auth/login.scss | 87 ++++--------------------------- src/components/auth/login.test.js | 5 -- 3 files changed, 18 insertions(+), 119 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 9d3b3e1..b97d5ca 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -99,20 +99,12 @@ class LoginPage extends React.Component {
- {/* GroaLogo */} + GroaLogo - {/*

Your movies,
your way.

*/} - {/*
-
-
-
Groa helps you pick the perfect film.
-
So you can save your popcorn for the good stuff.
- -
-
*/} +
- -
+{/* END BOX LEFT */} +

Log in

@@ -126,10 +118,9 @@ class LoginPage extends React.Component { errorMessage='username required' /> {/* ERROR MESSAGE */} - {errors.user_name.length > 0 && {errors.user_name}} - +
Remember me
- - {/*
Forgot password?
*/}
Forgot password?
- {/*
*/} - {/* */} - {/*
*/} - - {/*

or

*/} - - - {/* Log in Google */} - {/* */} - {/* Log in Facebook */} - {/* */} - {/* Log in Reddit */} - {/* */}
-
-
- {/* END BOX RIGHT */} +
+ {/* END BOX RIGHT */}
{/* END MIDDLE */}
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index df1acff..7a56618 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -17,13 +17,12 @@ display: flex; justify-content: space-between; height: 150px; - //border: 2px solid green; .Logo{ color: white; padding: 3% 0 0 0%; height: 60%; - //border: 2px solid red; + } .Register{ @@ -34,8 +33,6 @@ } } - - .Middle{ display: flex; // border: 2px solid blue; @@ -45,63 +42,13 @@ .boxLeft{ margin-top: 3%; color: white; - // font-size: 300%; width: 70%; - // border: 2px solid blue; - + // LOGO BIG - .Logo2{ - + .Logo2{ height: 40%; - // border: 2px solid red; - - } - .Text{ - margin: 0 0 0 1px; - //margin: 0 0 0 13%; - } - - - } -// 2 GRAY BOXES - needs work, changes location per monitor size. - - .box1{ - //margin: -12% 2% 2% 0; - background:rgb(97, 97, 97); - width: 407px; - //width:536px; - height: 436px; - } - .box2{ - margin: -30% 0 0 27%; - color: black; - background: #C4C4C4; - width: 407px; - height: 284px; - - -//TEXT- Groa Helps you....So you can... - .box2b{ - - justify-content: center; - padding: 35px 15px 15px 15px; - - } - .h6text1{ - padding:0 8px 30px 8px; - font-size: 35px; - font-weight: normal; - text-align: center; - - } - - .h6text2{ - font-size: 30px; - font-weight: 640; - text-align: center; - - } - } + } + } } // BOX RIGHT SIDE OF SCREEN - Login form @@ -110,7 +57,7 @@ display: flex; justify-content: flex-end; margin-top: 3%; - // border: 2px solid red; + //////// Login Form ///////////////// .LoginForm{ @@ -118,7 +65,6 @@ flex-direction: column; width:518px; height:310px; - // height:589px; background: #FFFFFF; } @@ -133,34 +79,25 @@ //TEXT REMEMBER, FORGOT PASSWORD? .TextandCheck{ display: flex; - // justify-content: space-evenly; .TextandCheck2{ - padding-left: 145px; - + padding-left: 145px; } + .CheckBoxContainer{ padding: 20px 15px 0 60px; - padding-top: 20px; - + padding-top: 20px; } .Checkbox{ width: 20px; height: 20px; } - } -// .textOr{ -// display: flex; -// justify-content: center; -// } - - -//input fields +//input fields/////////////////////// .input1{ padding: 7px; margin: 2% 12% 2% 12%; @@ -186,7 +123,6 @@ justify-content: flex-end; // justify-content: center; } - .BtnLoginWith{ margin: 1% 12% 3% 12%; padding: 8px; @@ -195,8 +131,7 @@ justify-content: flex-end; color: white; } -.BtnLogin{ - +.BtnLogin{ margin: 4% 12% 0 0; width: 115px; height:36px; diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index ec8a622..5b6b3e2 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -22,11 +22,6 @@ describe('Button', () => { expect(clikLogin.sum(0, 1)).toBe(1) }) -// it("renders Login Component", () => { -// const { container } = render(); -// const component = clikLogin(container, "login-component"); -// expect(component.length).toBe(1); -// }); \ No newline at end of file From f4ef58902d15d097bf5da32c2a35608242ec9c71 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 18:40:35 -0500 Subject: [PATCH 133/822] fixed the endpoint at .post --- src/components/auth/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index b97d5ca..3604043 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -68,7 +68,7 @@ class LoginPage extends React.Component { //console.log(user) axiosWithAuth() - .post("/api/users/login", this.state.user) + .post("api/users/login", this.state.user) .then(res => { localStorage.setItem('token', res.data.token); From aafacd3845843f336737b354910d1361805e6488 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 3 Mar 2020 19:07:38 -0500 Subject: [PATCH 134/822] took out small logo at top --- src/components/auth/login.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 3604043..042cd13 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -5,7 +5,7 @@ import { NavLink } from "react-router-dom"; import { connect } from 'react-redux'; import {loginAction} from '../../store/actions/loginAction'; import './login.scss'; -import Groa from '../auth/Groa-logo-B2.png' +// import Groa from '../auth/Groa-logo-B2.png' import Groa2 from '../auth/Groa-logo-B2AA.png' class LoginPage extends React.Component { @@ -92,9 +92,8 @@ class LoginPage extends React.Component {
- GroaLogo -

Register

- {/*

Register

*/} + {/* GroaLogo */} +

Register

From 51cda49937464b8e7f1de2ac91bf3efde7993b7a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 00:26:07 -0600 Subject: [PATCH 135/822] initial clean up --- src/App.js | 14 ++++---------- src/components/auth/index.js | 0 src/components/layout/index.js | 0 3 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 src/components/auth/index.js delete mode 100644 src/components/layout/index.js diff --git a/src/App.js b/src/App.js index 3ec8815..de3eda9 100644 --- a/src/App.js +++ b/src/App.js @@ -3,13 +3,10 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; // local imports +import PrivateRoute from "./utils/privateRoute.js"; import Dashboard from "./components/dashboard/index.js"; -// import Login from './auth/Login'; -import Register from "./components/auth/Register"; -import LoadingScreen from "./components/layout/LoadingScreen.js"; -import { PrivateRoute } from "./utils/privateRoute.js"; import Navigation from "./components/dashboard/navigation.js"; -import WatchList from "./components/movies/WatchList.js"; +import Register from "./components/auth/Register"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -35,12 +32,9 @@ function App() {
- - - {/* */} - - {/* */} + +
diff --git a/src/components/auth/index.js b/src/components/auth/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/layout/index.js b/src/components/layout/index.js deleted file mode 100644 index e69de29..0000000 From 2f63c52990468c22ea41a1fb48f672e42a1c5ea0 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 00:26:46 -0600 Subject: [PATCH 136/822] cleaning up auth folder and created a more responsive scss file --- src/components/auth/Register.js | 279 +++++++++++------------------ src/components/auth/_Register.scss | 89 +++++++++ src/components/auth/register.scss | 226 +++++++++++------------ 3 files changed, 305 insertions(+), 289 deletions(-) create mode 100644 src/components/auth/_Register.scss diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index cf39d36..a2d62b0 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,10 +1,9 @@ import React from "react"; -import { connect } from "react-redux"; -import "./register.scss"; -import { withRouter } from "react-router-dom"; -import axios from "axios"; +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; + +// styling imports +import "./_Register.scss"; import GroaWhite from "./GroaWhite.png"; -import { Login } from "../../store/actions"; class Register extends React.Component { constructor(props) { @@ -18,21 +17,14 @@ class Register extends React.Component { confirmpassword: "" }, submitted: false, - input: { - file: "", - movies: "" - }, errorStatus: false }; this.handleChange = this.handleChange.bind(this); - // this.changeHandler = this.changeHandler.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { - console.log(event.target.value); const { name, value } = event.target; const { user } = this.state; this.setState({ @@ -43,190 +35,135 @@ class Register extends React.Component { }); } - - handleSubmit(event) { event.preventDefault(); - + let user = { + user_name: this.state.user.user_name, + password: this.state.user.password, + email: this.state.user.email + }; this.setState({ submitted: true }); - console.log( - "username, and password", - this.state.user.user_name, - this.state.user.password - ); - // const { user } = this.state; if ( this.state.user.email && this.state.user.user_name && this.state.user.password && this.state.user.confirmpassword ) { - // this.props.register(user); - console.log( - "username, and password", - this.state.user.user_name, - this.state.user.password - ); - - // https://api.groa.us/ - // "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post("https://api.groa.us/api/users/register",{user_name: this.state.user.user_name, password: this.state.user.password}).then(res => { - console.log("token: ", res.data.token); - - - axios.post('https://api.groa.us/api/users/login', - {user_name: this.state.user.user_name, password: this.state.user.password}).then(res2 => { - console.log('nested login successful', res2) - + axiosWithAuth() + .post("https://api.groa.us/api/users/register", user) + .then(() => { + user = { + user_name: this.state.user.user_name, + password: this.state.user.password + }; + axiosWithAuth() + .post("https://api.groa.us/api/users/login", user) + .then(res2 => { const userid = res2.data.id; - this.props.Login(userid); - console.log('token: ', res2.data.token); - localStorage.setItem('token', res2.data.token) - - this.props.history.push('/dashboard') - - - }) - .catch(err2 => { - console.log(err2) - // this.props.history.push('/Error') - }) + localStorage.setItem("token", res2.data.token); + this.props.history.push("/dashboard", { userid: userid }); + }) + .catch(err2 => { + console.log(err2); + }); }) .catch(err => { console.log("Registration Error", err); this.setState({ errorStatus: true }); - - // this.props.history.push('/Error') }); } } render() { - const { registering } = this.props; const { user, submitted } = this.state; - // const { location, history } = this.props; return (
-

Login

- -
-
- groa logo -
- -
-
-

Register

- -
- - {submitted && !user.email && ( -
Email is required
- )} - -
- - {submitted && !user.user_name && ( -
Username is required
- )} - -
- - - {submitted && !user.password && ( -
Password is required
- )} - -
- - {submitted && !user.confirmpassword && ( -
Confirm Password is required
- )} - -
-
- -
- -
Remember me
- -
- - -
- - {registering} - {this.state.errorStatus ? ( -

Login Error, try again

- ) : ( -

Success

- )} -
- -
-
- {/* end box right */} +
+ groa logo
- {/*ends H1*/} +
+
+

Register

+ {/* divs with changing classnames updates error handling for form */} +
+ + {submitted && !user.email && ( +
Email is required
+ )} + +
+ + {submitted && !user.user_name && ( +
Username is required
+ )} + +
+ + + {submitted && !user.password && ( +
Password is required
+ )} + +
+ + {submitted && !user.confirmpassword && ( +
Confirm Password is required
+ )} + +
+ +
+
+
+ {/* end box right */}
); } } - -const mapStateToProps = ({ dashboardMain }) => { - return { - userData: dashboardMain.userid, - isFetching: dashboardMain.isPostingUser, - error: dashboardMain.isPostingUserError - }; -}; - -export default withRouter( - connect(mapStateToProps, { - Login - })(Register) -); +export default Register; diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss new file mode 100644 index 0000000..26fea31 --- /dev/null +++ b/src/components/auth/_Register.scss @@ -0,0 +1,89 @@ +.container { + font-family: Lato; + min-height: 100vh; + color: white; + background-image: linear-gradient( + to bottom, + black 0%, + rgba(0, 0, 0, 0.9), + rgba(0, 0, 0, 0.7), + rgba(0, 0, 0, 0.85) + ); + + display: flex; + flex-direction: row; + justify-content: space-evenly; + + .boxLeft { + width: 40%; + margin: auto; + .logo { + width: 100%; + max-width: 926px; + height: auto; + } + } + + .boxRight { + display: flex; + flex-direction: column; + justify-content: center; + margin: auto; + padding: 3%; + border-radius: 4px; + background: white; + + width: 100%; + max-width: 518px; + height: auto; + + h2 { + color: black; + margin-bottom: 30px; + font-style: normal; + font-size: 20px; + } + .form { + margin: auto; + padding: 3%; + max-width: 370px; + width: 100%; + } + + .form-control { + border-radius: 4px; + border: 1px solid black; + max-width: 370px; + width: 100%; + height: 36px; + margin: 2.6% auto; + } + input::placeholder { + font-size: 16px; + } + + .BottomLogin { + display: flex; + justify-content: flex-end; + margin-top: 10px; + .LoginBtn { + max-width: 115px; + width: 100%; + height: 36px; + border-radius: 4px; + background: #21242c; + color: white; + font-size: 14px; + &:hover { + background: gray; + color: #21242c; + } + } + } + .callingError { + color: red; + display: flex; + justify-content: center; + } + } +} diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss index c420afb..457678c 100644 --- a/src/components/auth/register.scss +++ b/src/components/auth/register.scss @@ -1,130 +1,120 @@ -.container{ - margin-top: -50px; - min-height: 100vh; - background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), - rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - - h3{ - color:white; - display: flex; - justify-content: flex-end; - padding: 3px 20px 3px 20px; - } - .H1{ - display: flex; +.container { + min-height: 100vh; + background-image: linear-gradient( + to bottom, + black 0%, + rgba(0, 0, 0, 0.9), + rgba(0, 0, 0, 0.7), + rgba(0, 0, 0, 0.85) + ); - .boxLeft{ - height: 30%; - width: 50%; - padding: 1px 20px; - .logo{ - height: 600px; - margin-left:100px;; - object-fit: contain; - // border: 2px solid red; - } - } - // .text{ - // font-size:320%; - // color: white; - // margin: 0 0 0 15%; - // display: flex; - // flex-direction: column; - // justify-content: flex-start; + display: flex; - // } + .login-link { + color: white; + display: flex; + justify-content: flex-end; + padding: 3px 20px 3px 20px; + } - .box1{ - margin: -15% 2% 2% 0; - background:rgb(97, 97, 97); - width: 407px; - height: 436px; - padding: 15px; - } - } + .boxLeft { + height: 30%; + width: 50%; + padding: 1px 20px; + .logo { + height: 600px; + margin-left: 100px; + object-fit: contain; + } + } - .box2{ - margin: -30% 0 0 40%; - color: black; - background: #C4C4C4; - width: 407px; - height: 288px; - font-size: 200%; - color: black; - padding-left: 25px; - } + .box1 { + margin: -15% 2% 2% 0; + background: rgb(97, 97, 97); + width: 407px; + height: 436px; + padding: 15px; + } + .box2 { + margin: -30% 0 0 40%; + color: black; + background: #c4c4c4; + width: 407px; + height: 288px; + font-size: 200%; + color: black; + padding-left: 25px; + } - .boxRight{ - display: flex; - justify-content: flex-end; - padding: 5%; - width: 50%; - h2{ - padding: 5px 10px 5px 10px; - } - } - .form{ - display: flex; - flex-direction: column; - width: 518px; - height: 647px; - background: #FFFFFF; + .boxRight { + display: flex; + justify-content: flex-end; + padding: 5%; + width: 50%; + h2 { + padding: 5px 10px 5px 10px; + } + } + .form { + display: flex; + flex-direction: column; + width: 518px; + height: 647px; + background: #ffffff; + } - } + .form-control { + padding: 7px; + margin: 2% 12% 2% 12%; + border: 1px solid black; + border-radius: 4px; + } + .checkBox { + display: flex; - .form-control{ - padding: 7px; - margin: 2% 12% 2% 12%; - border: 1px solid black; - border-radius: 4px; - } - .checkBox{ - display: flex; + .CheckB { + padding-top: 20px; + padding-right: 5px; + padding-left: 60px; + } + h5 { + display: flex; + justify-content: left; + } + } + h4 { + display: flex; + justify-content: center; + } - .CheckB{ - padding-top: 20px; - padding-right: 5px; - padding-left: 60px; - } - h5{ - display: flex; - justify-content: left; - } - } - h4{ - display: flex; - justify-content: center; - } + .LogBtn { + margin: 2% 12% 2% 12%; + padding: 8px; + background: #7a7a7a; + border-radius: 4px; + color: white; + } - .LogBtn { - margin: 2% 12% 2% 12%; - padding: 8px; - background:#7A7A7A; - border-radius: 4px; - color: white; - } + .BottomLogin { + display: flex; + justify-content: flex-end; - .BottomLogin { - display: flex; - justify-content: flex-end; - - - margin-left: 100px; - .LoginBtn{ - margin: 4% 12% 0 0; - width: 115px; - height:36px; - background:#21242C; - color: white; - border-radius: 4px; - margin-top:100px; - } - } + margin-left: 100px; + .LoginBtn { + margin: 4% 12% 0 0; + width: 115px; + height: 36px; + background: #21242c; + color: white; + border-radius: 4px; + margin-top: 100px; + } + } - .callingError{ - color: red; - display: flex; - justify-content: center; - } -} \ No newline at end of file + .callingError { + color: red; + display: flex; + justify-content: center; + } +} From 576cd7a40a93c9db290a62f59672d0ed0f64ce0a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 00:27:21 -0600 Subject: [PATCH 137/822] cleaning up dashboard folder keeping upload in there for time being --- src/components/dashboard/dashboardv1.js | 317 +++++++++--------------- src/components/dashboard/index.js | 37 ++- src/components/dashboard/navigation.js | 179 ++++++------- 3 files changed, 211 insertions(+), 322 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 1060779..6254cc2 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,214 +1,123 @@ -import React, {useState} from 'react'; -import './dash.scss' -import { axiosWithAuth } from '../../utils/axiosWithAuth.js'; -import { connect } from 'react-redux'; +import React, { useState } from "react"; +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { useHistory } from "react-router-dom"; +// local imports +import "./dash.scss"; +import MovieCard from "../movies/MovieCard.js"; +import LoadingScreen from "../layout/LoadingScreen.js"; -const Dashboardv1 = (props) => { - const [input, setInput] = useState({file:''}) - const [ratings, setRatings] = useState({}) - const [loading, setLoading] = useState() - const [toggle, setToggle] = useState(true); +// dashboard could become a place where we store all of our other layouts. +const Dashboardv1 = () => { + let history = useHistory(); + const [input] = useState({ file: "" }); // if we're never using setInput, do we need this useState? + const [ratings, setRatings] = useState([]); // maybe this should updated to recommendations? -- are we expecting an array? + // const [toggle, setToggle] = useState(true); - console.log('user data here', props.userid) - const changeHandler = e => { - // new FormData() needs to be used for the file upload to work. - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) - //change user/1/ to be :id number - //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axiosWithAuth().post(`/${props.userid}/uploading`, data,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - setRatings(res.data) - }).catch(err => { - console.log(err) - }) - data = new FormData() - // do something when loading add loading paremeter in jsx where the turnery operator ends. right now set to true. - setTimeout(() => { - setLoading(

.loading

) - }, 1000); - setTimeout(() => { - setLoading(

..loading

) - }, 2000); - setTimeout(() => { - setLoading(

...loading

) - }, 3000); - setTimeout(() => { - setLoading(

....loading

) - }, 4000); - - } - const handleSubmit = e => { - setToggle(!toggle) - e.preventDefault(); - console.log(input); - //handle submit not being used this is depreciated code. - //change user/1/ to be :id number handle submit currently does - // axios.post('https://groa-be.herokuapp.com/api/users/1/upload', input,{ - // headers:{ - // 'Content-Type':'multipart/form-data' - // } - // }) - // .then(res => { - // console.log(res); - // }).catch(err => { - // console.log(err) - // }) - - } - + const changeHandler = e => { + // maybe document this some where??? https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData + // packages up form to make it able to send over https + // new FormData() needs to be used for the file upload to work. // why? + let data = new FormData(); - return ( -
-
- {/*

Welcome to the dashboard.

*/} - -
-
- - - {/* */} -
- {/*

upload your letterboxd csv file here to get unique movie recommendations

*/} -

upload your letterboxd csv file here to get all past movie ratings

-
- {/*
Container for settings
*/} -
- - {ratings.length > 0 ? ratings.map((x, index) => { - if(index < 201){ + // have to read more on new FormData to understand why appending "movies" works here with the input attribute + data.append("movies", e.target.files[0], e.target.files[0].name); + + // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. + axiosWithAuth() + // this is insantiated when a file is added to input + .post(`/${history.location.state.userid}/uploading`, data, { + headers: { + "Content-Type": "multipart/form-data" + } + }) + .then(res => { + console.log(res); + setRatings(res.data); + }) + .catch(err => { + console.log(err); + }); + + // clears out previous uploaded file + data = new FormData(); + }; - - return ( + // const handleSubmit = e => { + // setToggle(!toggle); + // e.preventDefault(); + // console.log(input); + // }; -
- {/*
- Looks Cool šŸ‘Ž - Not interested šŸ‘ -
*/} - -
- -
-

{x.Name}

-

{x.Year}

-

Rating: {x.Rating}

-

Votes:

-

Like by fans of:

- {/*

{x.Letterboxd_URI}

*/} - {/*
- - -
*/} -
- -
- ) - } - }) - : true} - - {toggle == true ? -
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
-
-
-
-

Movie Title

-

Year

-

Rating:

-

Votes:

-

Liked by fans of:

- -
-
- -
: true} - - -
- + switch (true) { + case !history?.location?.state?.userid: + return ; // redirect to login/register + case !ratings?.length: + return ( +
+
+
+ {/* keep create component? */} +
+ +
+

+ upload your letterboxd csv file here to get all past movie + ratings +

+
- - - ) -} + ); + default: + return ( +
+
+
+ {/* keep create component? */} +
+ +
+

+ upload your letterboxd csv file here to get all past movie + ratings +

+
-const mapStateToProps = ({dashboardMain}) => { - return { - userid: dashboardMain.userid - }; + {/* this shows the recommendations movie cards */} +
+ {/* should off set up to 200 and then retun nothing */} + {ratings.map((x, index) => + index < 201 ? ( + + ) : null + )} +
+
+
+ ); + } }; -export default connect(mapStateToProps)(Dashboardv1); + +export default Dashboardv1; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index feadd22..aa05df9 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,23 +1,22 @@ -import React from 'react'; - -import Dashboardv1 from './dashboardv1'; -import Navigation from './navigation.js'; +import React from "react"; -const Dashboard = () => { - - - return ( - -
- - - +import Dashboardv1 from "./dashboardv1"; +import Navigation from "./navigation.js"; - -
- - - ) -} +const Dashboard = () => { + return ( +
+ + +
+ ); +}; export default Dashboard; diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index ec363a7..21cd663 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -1,105 +1,86 @@ -import React, { Component } from 'react'; +import React, { Component } from "react"; import { NavLink } from "react-router-dom"; -import { faSearch,faUserCircle,faAngleDown,faBars } from '@fortawesome/free-solid-svg-icons'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { + faSearch, + faUserCircle, + faAngleDown, + faBars +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import "../dashboard/navigation.scss"; -import {faBell, faQuestionCircle} from '@fortawesome/free-regular-svg-icons'; - +import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; +import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; class Navigation extends Component { - - state = { - - search: '' - }; - - - handleChange = e =>{ - this.setState({search: e.target.value}) - } - - render() { - return( - -
-
- - -
- - -
- - - Groa - - - Dairies - - - - Trending - - - - Recommended - - - - Watchlist - - - - Explore - -
- - -
- - -
- - - - - - - - - - - - - - -
- ) - } + state = { + search: "" + }; + + handleChange = e => { + this.setState({ search: e.target.value }); + }; + + render() { + if (window.location.pathname === "/") return ; + return ( +
+
+ + +
+ +
+ + Groa + + + Dairies + + + + Trending + + + + Recommended + + + + Watchlist + + + + Explore + +
+ +
+ + +
+ + + + + + + + + + + + +
+ ); + } } -export default Navigation; \ No newline at end of file +export default Navigation; From bbabc02ffca010d9fdb97fcefa2e090abfca793c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 00:27:50 -0600 Subject: [PATCH 138/822] cleaning up utils folder --- src/utils/axiosWithAuth.js | 22 +++++++++++----------- src/utils/privateRoute.js | 26 ++++++++++++++++---------- src/utils/removeAttribute.js | 1 - 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 647823c..ce96624 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -1,13 +1,13 @@ -import axios from 'axios' +import axios from "axios"; -export const axiosWithAuth = () => { - const token = localStorage.getItem('token') +export const axiosWithAuth = () => { + const token = localStorage.getItem("token"); - return axios.create({ - baseURL: 'https://api.groa.us/api/users', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `${token}` - } - }) -} \ No newline at end of file + return axios.create({ + baseURL: "https://api.groa.us/api/users", + headers: { + "Content-Type": "application/json", + Authorization: `${token}` + } + }); +}; diff --git a/src/utils/privateRoute.js b/src/utils/privateRoute.js index 7c2bb95..19a8ae9 100644 --- a/src/utils/privateRoute.js +++ b/src/utils/privateRoute.js @@ -1,11 +1,17 @@ -import React from 'react' -import { Route, Redirect } from 'react-router-dom' +import React from "react"; +import { Route, Redirect } from "react-router-dom"; -export const PrivateRoute = ({ component: Component, ...rest }) => ( - - localStorage.getItem('token') ? - () - : - () - } /> -) \ No newline at end of file +const PrivateRoute = ({ component: Component, ...rest }) => ( + + localStorage.getItem("token") ? ( + + ) : ( + + ) + } + /> +); + +export default PrivateRoute; diff --git a/src/utils/removeAttribute.js b/src/utils/removeAttribute.js index 7967013..77cc3cb 100644 --- a/src/utils/removeAttribute.js +++ b/src/utils/removeAttribute.js @@ -6,7 +6,6 @@ * note - this function works because if an attribute is undefined it will not show up in the element. */ export function ifDev(val) { - console.log("node env", process.env.NODE_ENV); if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") return val; else return undefined; From d034829071d903a9c2f25bdeed98966e352d59f5 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 00:28:53 -0600 Subject: [PATCH 139/822] some added things for functionality and architecture, also trying to solve testing issue since the upgrade of router package --- .../layout/nav-layouts/RegisterNavLinks.js | 14 +++++++++++++ .../layout/nav-layouts/RegisterNavLinks.scss | 20 +++++++++++++++++++ .../nav-layouts/RegisterNavLinks.test.js | 13 ++++++++++++ src/components/movies/MovieCard.js | 16 +++++++++++++++ src/index.js | 20 ------------------- webpack.config.js | 9 +++++++++ 6 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 src/components/layout/nav-layouts/RegisterNavLinks.js create mode 100644 src/components/layout/nav-layouts/RegisterNavLinks.scss create mode 100644 src/components/layout/nav-layouts/RegisterNavLinks.test.js create mode 100644 src/components/movies/MovieCard.js create mode 100644 webpack.config.js diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js new file mode 100644 index 0000000..d388ca0 --- /dev/null +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -0,0 +1,14 @@ +import React from "react"; +import { ifDev } from "../../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; +import "./RegisterNavLinks.scss"; + +export default function RegisterNavLinks() { + return ( +
+ + Log in + +
+ ); +} diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.scss b/src/components/layout/nav-layouts/RegisterNavLinks.scss new file mode 100644 index 0000000..d206166 --- /dev/null +++ b/src/components/layout/nav-layouts/RegisterNavLinks.scss @@ -0,0 +1,20 @@ +.register-nav { + font-family: lato; + display: flex; + justify-content: flex-end; + background: black; + .login-link { + width: 100%; + max-width: 53px; + height: auto; + font-size: 20px; + margin: 3% 2%; + + color: white; + text-decoration: none; + &:hover { + color: aqua; + text-decoration: underline; + } + } +} diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.test.js b/src/components/layout/nav-layouts/RegisterNavLinks.test.js new file mode 100644 index 0000000..2c24dfd --- /dev/null +++ b/src/components/layout/nav-layouts/RegisterNavLinks.test.js @@ -0,0 +1,13 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../../utils/test-utils.js"; + +// component to be tested. +import RegisterNavLinks from "./RegisterNavLinks.js"; + +it("renders register-nav-component", () => { + const { container } = render(); + + const component = getAllByTestId(container, "register-nav-component"); + expect(component.length).toBe(1); +}); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js new file mode 100644 index 0000000..c553503 --- /dev/null +++ b/src/components/movies/MovieCard.js @@ -0,0 +1,16 @@ +import React from "react"; + +// more fields will be appearing according to the Figma file +export default function MovieCard({ name, year, rating }) { + return ( +
+
+
+ {/* changed to p tags because it is more accessible for screen readers */} +

{name}

+

{year}

+

Rating: {rating}

+
+
+ ); +} diff --git a/src/index.js b/src/index.js index 0dad549..48da9f6 100644 --- a/src/index.js +++ b/src/index.js @@ -4,26 +4,6 @@ import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; - -// import { createStore, compose, applyMiddleware } from "redux"; -// import { Provider } from "react-redux"; -// import thunk from "redux-thunk"; -// import logger from "redux-logger"; -// import { reducer } from "./store/reducers/index.js"; - -// const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; -// const store = createStore( -// reducer, -// composeEnhancers(applyMiddleware(thunk, logger)) -// ); - -// ReactDOM.render( -// -// -// , - -// document.getElementById("root") -// ); ReactDOM.render(, document.getElementById("root")); // If you want your app to work offline and load faster, you can change diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..d0c3452 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,9 @@ +const path = require("path"); + +module.exports = { + resolve: { + alias: { + "react-router-dom": path.resolve("./node_modules/react-router-dom") + } + } +}; From 95d996f2c51b2d552540a3ada3baf1db86f2f837 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 01:18:25 -0600 Subject: [PATCH 140/822] prettier formated all files, and changed file names to be 'react standard' --- package-lock.json | 42 +-- src/components/dashboard/Dashboard.scss | 235 +++++++++++++++++ src/components/dashboard/dash.scss | 247 ------------------ src/components/dashboard/dashboardv1.js | 6 +- src/components/dashboard/dashboardv1.test.js | 71 +---- src/components/dashboard/index.js | 2 +- src/components/dashboard/navigation.js | 8 +- src/components/dashboard/navigation.scss | 113 ++++---- src/components/dashboard/navigation.test.js | 17 +- .../layout/nav-layouts/RegisterNavLinks.js | 2 +- .../nav-layouts/RegisterNavLinks.test.js | 7 +- src/components/movies/index.js | 0 src/config/index.js | 0 src/index.css | 13 - src/logo.svg | 7 - src/serviceWorker.js | 32 +-- src/setupTests.js | 5 - src/store/actions/backendUserActions.js | 10 +- src/store/actions/dsUserActions.js | 11 +- src/store/actions/index.js | 13 +- src/store/constants.js | 10 +- src/store/reducers/dashboardMain.js | 2 +- src/store/reducers/index.js | 1 - src/utils/test-utils.js | 2 +- webpack.config.js | 9 - 25 files changed, 375 insertions(+), 490 deletions(-) create mode 100644 src/components/dashboard/Dashboard.scss delete mode 100644 src/components/dashboard/dash.scss delete mode 100644 src/components/movies/index.js delete mode 100644 src/config/index.js delete mode 100644 src/index.css delete mode 100644 src/logo.svg delete mode 100644 src/setupTests.js delete mode 100644 webpack.config.js diff --git a/package-lock.json b/package-lock.json index fcc0d2d..3d58bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1431,9 +1431,9 @@ } }, "@testing-library/dom": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.12.2.tgz", - "integrity": "sha512-KCnvHra5fV+wDxg3wJObGvZFxq7v1DJt829GNFLuRDjKxVNc/B5AdsylNF5PMHFbWMXDsHwM26d2NZcZO9KjbQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.13.0.tgz", + "integrity": "sha512-kF1mnDK3eOCtOGapkbQK0fXXL4/mFydTSbyqNTtUHEf9tO9Dt33fwZyVNqeVdGiXRP6r9Ti1Fc56cX7fGr5ZJg==", "requires": { "@babel/runtime": "^7.6.2", "@sheerun/mutationobserver-shim": "^0.3.2", @@ -2714,15 +2714,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -4303,9 +4294,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.364", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.364.tgz", - "integrity": "sha512-V6hyxQ9jzt6Jy6w8tAv4HHKhIaVS6psG/gmwtQ+2+itdkWMHJLHJ4m1sFep/fWkdKvfJcPXuywfnECRzfNa7gw==" + "version": "1.3.367", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.367.tgz", + "integrity": "sha512-GCHQreWs4zhKA48FNXCjvpV4kTnKoLu2PSAfKX394g34NPvTs2pPh1+jzWitNwhmOYI8zIqt36ulRVRZUgqlfA==" }, "elliptic": { "version": "6.5.2", @@ -5368,12 +5359,6 @@ "schema-utils": "^2.5.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "filesize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", @@ -7115,7 +7100,6 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -10777,9 +10761,9 @@ } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "prr": { "version": "1.0.1", @@ -12920,9 +12904,9 @@ } }, "terser": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", - "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.6.tgz", + "integrity": "sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -13650,7 +13634,6 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -14439,7 +14422,6 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, diff --git a/src/components/dashboard/Dashboard.scss b/src/components/dashboard/Dashboard.scss new file mode 100644 index 0000000..dabeff1 --- /dev/null +++ b/src/components/dashboard/Dashboard.scss @@ -0,0 +1,235 @@ +.bigContainer { + background-color: white; +} + +.DB-Container { + margin-bottom: 0px; + // background-color: black; + // background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); + background-color: #7a7a7a; + width: 100%; + height: 1120px; + // color: #ffffff; + color: black; + display: flex; + flex-direction: column; + justify-content: space-around; + overflow-y: hidden; + overflow: hidden scroll; + + background-size: contain; + + // overflow-x: hidden; + + .h2-p { + width: 50%; + height: 30%; + + h2 { + margin: auto; + // margin-top: -50px; + margin-top: 50px; + margin-bottom: -50px; + margin-left: 100px; + text-align: center; + height: 200px; + font-size: 4rem; + + color: white; + background-color: linear-gradient( + to bottom, + black 0%, + rgba(0, 0, 0, 0.9), + rgba(0, 0, 0, 0.7), + rgba(0, 0, 0, 0.85) + ); + // border: 2px solid white; + padding-top: 100px; + transition: 0.3s; + &:hover { + text-shadow: 0px 0px 10px white; + } + } + } + .flash { + text-shadow: 0px 0px 10px white; + } + .loading { + text-align: center; + transition: 1.3s; + text-shadow: 0px 0px 10px white; + } + .settings-container { + height: 300px; + border: 2px solid green; + } + .box-container { + height: 1000px; + width: 90%; + // border: 2px solid blue; + display: flex; + flex-direction: row; + // justify-content: space-around; + margin-left: 250px; + margin-right: 600px; + + flex-wrap: wrap; + + .box-container2 { + height: 1000px; + width: 90%; + // border: 2px solid blue; + display: flex; + flex-direction: row; + // justify-content: space-around; + margin-right: -300px; + padding-right: 0px; + margin-top: -50px; + flex-wrap: wrap; + // border: 2px solid red; + } + + .box { + margin-top: auto; + // margin-bottom: auto; + height: 380px; + width: 347px; + // border: 2px solid white; + display: flex; + border-radius: 0.1rem; + // background-color: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); + // border: 1px solid grey; + background-color: #7a7a7a; + transition: 0.4s; + // &:hover{ + // box-shadow: 0px 0px 5px grey, + // -10px -0px 20px #ffffff; + // } + .movie-poster { + width: 164px; + height: 246px; + // border: 2px solid lightGrey; + //margin: auto; + margin-left: 0px; + margin-top: 68px; + margin-bottom: 66px; + // position: absolute; + // left: 0%; + // right: 54.76%; + // top: 17.13%; + // bottom: 18.82%; + background: white; //url(Image.png), + &:hover { + box-shadow: 0px 0px 3px white; + } + } + .text-container { + width: 80px; + height: 200px; + margin: auto; + margin-left: 75px; + margin-top: 70px; + h2 { + margin-left: -50px; + font-size: 1rem; + font-family: Roboto; + width: 150px; + height: 30px; + // border: 1px solid grey; + background-color: transparent; + color: white; + text-align: left; + padding-top: 0px; + &:hover { + text-shadow: 0px 0px 2px #7a7a7a; + } + } + } + .checkboxes { + margin-left: -50px; + + width: 150px; + height: 120px; + // border: 1px solid red; + display: flex; + flex-direction: column; + justify-content: space-evenly; + } + } + } + + .form-hover { + height: 30%; + width: 30%; + margin: auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin-top: -100px; + margin-bottom: -170px; + margin-left: 200px; + + .form-directions { + width: 200px; + margin: 20px auto; + margin-top: -175px; + visibility: hidden; + text-align: center; + transition: 0.5s; + margin-right: -500px; + margin-bottom: 300px; + height: 100px; + color: black; + } + + #zip-input { + margin-left: 600px; + margin-top: 100px; + width: 400px; + height: 40px; + font-size: 1.3rem; + padding-left: 100px; + font-family: Roboto; + background-color: lightBlack; + &:hover { + box-shadow: 0px 0px 5px white; + } + } + #submit-button { + // margin:0px; + display: none; + margin-top: -200px; + // margin-bottom:600px; + margin-left: 490px; + + height: 40px; + width: 100px; + font-size: 1.2rem; + border-radius: 1.3rem; + &:hover { + box-shadow: -5px 0px 30px white; + transition: 0.2s; + } + } + &:hover { + transition: 0.5s; + .form-directions { + transition: 1.5s; + visibility: visible; + text-shadow: 0px 0px 30px white; + } + } + } + input.textboxsize { + margin-left: 20px; + transform: scale(1.5); + + &:hover { + box-shadow: 0px 0px 3px white; + } + } + + #zip-form { + margin-left: auto; + } +} diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss deleted file mode 100644 index 091baca..0000000 --- a/src/components/dashboard/dash.scss +++ /dev/null @@ -1,247 +0,0 @@ -.bigContainer{ - background-color:white; -} - - -.DB-Container{ - margin-bottom: 0px; - // background-color: black; - // background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - background-color:#7A7A7A; - width: 100%; - height: 1120px; - // color: #ffffff; - color: black; - display:flex; - flex-direction: column; - justify-content: space-around; - overflow-y: hidden; - overflow: hidden scroll; - - - background-size: contain; - - // overflow-x: hidden; - - - - .h2-p{ - width: 50%; - height: 30%; - - h2{ - margin: auto; - // margin-top: -50px; - margin-top: 50px; - margin-bottom: -50px; - margin-left: 100px; - text-align: center; - height: 200px; - font-size: 4rem; - - color: white; - background-color: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - // border: 2px solid white; - padding-top: 100px; - transition: .3s; - &:hover{ - text-shadow: 0px 0px 10px white; - - } - } - - } - .flash{ - text-shadow: 0px 0px 10px white; - } - .loading{ - text-align: center; - transition:1.3s; - text-shadow: 0px 0px 10px white; - } - .settings-container{ - height: 300px; - border: 2px solid green; - } - .box-container{ - height: 1000px; - width:90%; - // border: 2px solid blue; - display: flex; - flex-direction:row; - // justify-content: space-around; - margin-left: 250px; - margin-right: 600px; - - flex-wrap: wrap; - - .box-container2{ - height: 1000px; - width:90%; - // border: 2px solid blue; - display: flex; - flex-direction:row; - // justify-content: space-around; - margin-right: -300px; - padding-right: 0px; - margin-top: -50px; - flex-wrap: wrap; - // border: 2px solid red; - - } - - .box{ - margin-top: auto; - // margin-bottom: auto; - height: 380px; - width: 347px; - // border: 2px solid white; - display: flex; - border-radius: .1rem; - // background-color: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - // border: 1px solid grey; - background-color:#7A7A7A; - transition: .4s; - // &:hover{ - // box-shadow: 0px 0px 5px grey, - // -10px -0px 20px #ffffff; - // } - .movie-poster{ - width:164px; - height: 246px; - // border: 2px solid lightGrey; - //margin: auto; - margin-left:0px; - margin-top: 68px; - margin-bottom:66px; - // position: absolute; - // left: 0%; - // right: 54.76%; - // top: 17.13%; - // bottom: 18.82%; - background: white; //url(Image.png), - &:hover{ - box-shadow: 0px 0px 3px white; - } - } - .text-container{ - width: 80px; - height: 200px; - margin: auto; - margin-left:75px; - margin-top: 70px; - h2{ - margin-left: -50px; - font-size: 1rem; - font-family: Roboto; - width: 150px; - height: 30px; - // border: 1px solid grey; - background-color: transparent; - color: white; - text-align: left; - padding-top:0px; - &:hover{ - text-shadow: 0px 0px 2px #7A7A7A; - } - } - } - .checkboxes{ - margin-left: -50px; - - width: 150px; - height: 120px; - // border: 1px solid red; - display: flex; - flex-direction: column; - justify-content: space-evenly; - - } - } - } - - - .form-hover{ - height: 30%; - width: 30%; - margin: auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin-top: -100px; - margin-bottom: -170px; - margin-left: 200px; - - - .form-directions{ - width: 200px; - margin: 20px auto; - margin-top: -175px; - visibility: hidden; - text-align: center; - transition: .5s; - margin-right: -500px; - margin-bottom:300px; - height: 100px; - color:black; - } - - #zip-input{ - margin-left: 600px; - margin-top: 100px; - width: 400px; - height: 40px; - font-size: 1.3rem; - padding-left: 100px; - font-family: Roboto; - background-color: lightBlack; - &:hover{ - box-shadow: 0px 0px 5px white; - - } - - } - #submit-button{ - // margin:0px; - display:none; - margin-top: -200px; - // margin-bottom:600px; - margin-left: 490px; - - height: 40px; - width: 100px; - font-size: 1.2rem; - border-radius:1.3rem; - &:hover{ - box-shadow: -5px 0px 30px white; - transition: 0.2s; - } - } - &:hover{ - transition: .5s; - .form-directions{ - transition: 1.5s; - visibility:visible; - text-shadow: 0px 0px 30px white; - - - } - } - - } - input.textboxsize { - margin-left: 20px; - transform: scale(1.5); - - &:hover{ - box-shadow: 0px 0px 3px white; - } - } - - #zip-form{ - margin-left: auto; - - } - -} - diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 6254cc2..bb989da 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -54,8 +54,8 @@ const Dashboardv1 = () => { return ; // redirect to login/register case !ratings?.length: return ( -
-
+
+
{/* keep create component? */}
@@ -79,7 +79,7 @@ const Dashboardv1 = () => { ); default: return ( -
+
{/* keep create component? */} diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 702543b..25f1ca9 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -1,71 +1,20 @@ import React from "react"; import { render } from "@testing-library/react"; import { getAllByTestId } from "../../utils/test-utils.js"; -import puppeteer from "puppeteer"; +import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import Dashboardv1 from "./dashboardv1.js"; it("renders dashboardv1", () => { - const { container } = render(); - - const component = getAllByTestId(container, "dashboard-screen"); + const { container } = render( + + + + ); + + // currently have it set up so that if there is no user id it goes to loading screen. + // should change to login or a 403 or some thing else. + const component = getAllByTestId(container, "loading-screen"); expect(component.length).toBe(1); }); -// it("renders dashboardv1", () => { -// const { container } = render(); - -// const component = getAllByTestId(container, "box-container"); -// expect(component.length).toBe(1); -// }); -// it("renders dashboardv1", () => { -// const { container } = render(); - -// const component = getAllByTestId(container, "box"); -// expect(component.length).toBe(200); -// }); - -//------------puppeteer -// test('Validating movie form button', async() => { -// const browser = await puppeteer.launch({headless:false,defaultViewport: null}); -// const page = await browser.newPage(); - -// await page.goto('localhost:3000/') -// await page.waitFor(4000); -// await page.waitForSelector('.forms') - -// await page.click('input[name=email]') -// await page.keyboard.type('puppeteertj123@gmail.com'); -// await page.waitFor(300); -// await page.click('input[name=username]') -// await page.keyboard.type('puppeteer10'); -// await page.waitFor(300); -// await page.click('input[name=password]') -// await page.keyboard.type('Groa123'); -// await page.waitFor(300); -// await page.click('input[name=confirmpassword]') -// await page.keyboard.type('Groa123'); - -// const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); -// expect(movieInput).toBe('form-control') - -// await page.waitFor(1500); - -// // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); -// // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; - -// // await inputUploadHandle.uploadFile(fileToUpload); -// await page.click('.LoginBtn'); - -// const movieInput = await page.$eval('input[name=confirmpassword]', (input) => input.className); -// expect(movieInput).toBe('form-control') - -// await page.waitFor(1500); - -// // const inputUploadHandle = await page.$('.form .LogBtn input[type=file]'); -// // const fileToUpload = './Users/thomaskatalenas/Labs/Groa-fe-copy-tests/src/zipfile-testing/cooper.zip'; - - -// },40000) - - diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index aa05df9..2fa2bd3 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,7 +1,7 @@ import React from "react"; import Dashboardv1 from "./dashboardv1"; -import Navigation from "./navigation.js"; +import Navigation from "./Navigation.js"; const Dashboard = () => { return ( diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 21cd663..eb22f64 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -9,6 +9,8 @@ import { import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import "../dashboard/navigation.scss"; import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; + +import { ifDev } from "../../utils/removeAttribute.js"; import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; class Navigation extends Component { @@ -23,7 +25,7 @@ class Navigation extends Component { render() { if (window.location.pathname === "/") return ; return ( -
+
@@ -33,8 +35,8 @@ class Navigation extends Component { Groa - - Dairies + + Diary diff --git a/src/components/dashboard/navigation.scss b/src/components/dashboard/navigation.scss index 5e7036d..030dfcb 100644 --- a/src/components/dashboard/navigation.scss +++ b/src/components/dashboard/navigation.scss @@ -1,68 +1,67 @@ +.mainContainer { + background: #373737; + margin: 30px; + display: flex; + justify-content: space-evenly; + padding: 10px; -.mainContainer{ - background: #373737; - margin: 30px; + .Bars { + background: rgba(255, 255, 255, 0.24); + width: 230px; + + .bars-icon { + color: white; + padding: 10px; + font-size: 140%; + } + } + .Links { + width: 60%; display: flex; justify-content: space-evenly; padding: 10px; - - .Bars{ - background: rgba(255, 255, 255, 0.24); - width: 230px; - - .bars-icon{ - color: white; - padding: 10px; - font-size: 140%; - } - } - .Links{ - width: 60%; - display: flex; - justify-content: space-evenly; - padding: 10px; - - .Groa{ - font-size: 20px ; - font-weight: bold; - color: white; - text-decoration: none; - } + .Groa { + font-size: 20px; + font-weight: bold; + color: white; + text-decoration: none; + } - .NavLink{ - color: white; - text-decoration: none; - } + .NavLink { + color: white; + text-decoration: none; } + } - .searchContainer { - border: 1px solid black; - border-radius: 5px; - width: 250px; - padding-left: 15px; - background:white ; - padding-top: 5px; - margin-right: 30px; - - .search-icon{ - padding-left: 10px; - - } + .searchContainer { + border: 1px solid black; + border-radius: 5px; + width: 250px; + padding-left: 15px; + background: white; + padding-top: 5px; + margin-right: 30px; - .searchBox { - border: 2px solid white; - padding: 0.5rem; - text-decoration: none; - font-size: 16px; - } - } - - .bell-icon, .question-icon, .user-circle-icon, .angle-down-icon{ - color: white; - padding: 10px; - font-size: 140%; - margin-right: 10px; + .search-icon { + padding-left: 10px; } -} \ No newline at end of file + .searchBox { + border: 2px solid white; + padding: 0.5rem; + text-decoration: none; + font-size: 16px; + } + } + + .bell-icon, + .question-icon, + .user-circle-icon, + .angle-down-icon { + color: white; + padding: 10px; + font-size: 140%; + margin-right: 10px; + } +} diff --git a/src/components/dashboard/navigation.test.js b/src/components/dashboard/navigation.test.js index d993270..4fade87 100644 --- a/src/components/dashboard/navigation.test.js +++ b/src/components/dashboard/navigation.test.js @@ -1,14 +1,19 @@ import React from "react"; import { render } from "@testing-library/react"; import { getAllByTestId } from "../../utils/test-utils.js"; - +import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import Navigation from "./navigation.js"; -it("renders a navigation bar in the dashboard", () => { - const { container } = render (); +it("renders navigation component", () => { + const { container } = render( + + + + ); - const component = getAllByTestId(container, "navigation"); - expect(component.length).toBe(0); -}); \ No newline at end of file + // the uri when this component renders is "/" so it'll go to the RegisterNavLinks component + const component = getAllByTestId(container, "register-nav-component"); + expect(component.length).toBe(1); +}); diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index d388ca0..abdb401 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -5,7 +5,7 @@ import "./RegisterNavLinks.scss"; export default function RegisterNavLinks() { return ( -
+
Log in diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.test.js b/src/components/layout/nav-layouts/RegisterNavLinks.test.js index 2c24dfd..7b28d27 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.test.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.test.js @@ -1,12 +1,17 @@ import React from "react"; import { render } from "@testing-library/react"; import { getAllByTestId } from "../../../utils/test-utils.js"; +import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import RegisterNavLinks from "./RegisterNavLinks.js"; it("renders register-nav-component", () => { - const { container } = render(); + const { container } = render( + + + + ); const component = getAllByTestId(container, "register-nav-component"); expect(component.length).toBe(1); diff --git a/src/components/movies/index.js b/src/components/movies/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/config/index.js b/src/config/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -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; -} diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/serviceWorker.js b/src/serviceWorker.js index c4838eb..a0951ca 100644 --- a/src/serviceWorker.js +++ b/src/serviceWorker.js @@ -11,9 +11,9 @@ // opt-in, read https://bit.ly/CRA-PWA const isLocalhost = Boolean( - window.location.hostname === 'localhost' || + window.location.hostname === "localhost" || // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || + window.location.hostname === "[::1]" || // 127.0.0.0/8 are considered localhost for IPv4. window.location.hostname.match( /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ @@ -21,7 +21,7 @@ const isLocalhost = Boolean( ); export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); if (publicUrl.origin !== window.location.origin) { @@ -31,7 +31,7 @@ export function register(config) { return; } - window.addEventListener('load', () => { + window.addEventListener("load", () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; if (isLocalhost) { @@ -42,8 +42,8 @@ export function register(config) { // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA' + "This web app is being served cache-first by a service " + + "worker. To learn more, visit https://bit.ly/CRA-PWA" ); }); } else { @@ -64,14 +64,14 @@ function registerValidSW(swUrl, config) { return; } installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { + if (installingWorker.state === "installed") { if (navigator.serviceWorker.controller) { // At this point, the updated precached content has been fetched, // but the previous service worker will still serve the older // content until all client tabs are closed. console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + "New content is available and will be used when all " + + "tabs for this page are closed. See https://bit.ly/CRA-PWA." ); // Execute callback @@ -82,7 +82,7 @@ function registerValidSW(swUrl, config) { // At this point, everything has been precached. // It's the perfect time to display a // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); + console.log("Content is cached for offline use."); // Execute callback if (config && config.onSuccess) { @@ -94,21 +94,21 @@ function registerValidSW(swUrl, config) { }; }) .catch(error => { - console.error('Error during service worker registration:', error); + console.error("Error during service worker registration:", error); }); } function checkValidServiceWorker(swUrl, config) { // Check if the service worker can be found. If it can't reload the page. fetch(swUrl, { - headers: { 'Service-Worker': 'script' } + headers: { "Service-Worker": "script" } }) .then(response => { // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); + const contentType = response.headers.get("content-type"); if ( response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) + (contentType != null && contentType.indexOf("javascript") === -1) ) { // No service worker found. Probably a different app. Reload the page. navigator.serviceWorker.ready.then(registration => { @@ -123,13 +123,13 @@ function checkValidServiceWorker(swUrl, config) { }) .catch(() => { console.log( - 'No internet connection found. App is running in offline mode.' + "No internet connection found. App is running in offline mode." ); }); } export function unregister() { - if ('serviceWorker' in navigator) { + if ("serviceWorker" in navigator) { navigator.serviceWorker.ready .then(registration => { registration.unregister(); diff --git a/src/setupTests.js b/src/setupTests.js deleted file mode 100644 index 74b1a27..0000000 --- a/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom/extend-expect'; diff --git a/src/store/actions/backendUserActions.js b/src/store/actions/backendUserActions.js index e2b3fbb..8d67ea7 100644 --- a/src/store/actions/backendUserActions.js +++ b/src/store/actions/backendUserActions.js @@ -1,7 +1,5 @@ +import constants from "../constants"; -import constants from '../constants'; - -export const Login = (Id) => { - return {type: constants.USER_LOGIN , payload: Id} -} - +export const Login = Id => { + return { type: constants.USER_LOGIN, payload: Id }; +}; diff --git a/src/store/actions/dsUserActions.js b/src/store/actions/dsUserActions.js index efba1ba..5e45153 100644 --- a/src/store/actions/dsUserActions.js +++ b/src/store/actions/dsUserActions.js @@ -1,7 +1,6 @@ -import constants from '../constants.js' +import constants from "../constants.js"; -export const setLogin = (input) => (dispatch) => { - console.log(constants.POST_USER) - dispatch({type: constants.POST_USER }) - -} \ No newline at end of file +export const setLogin = input => dispatch => { + console.log(constants.POST_USER); + dispatch({ type: constants.POST_USER }); +}; diff --git a/src/store/actions/index.js b/src/store/actions/index.js index cf55f1f..e1e44a7 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -1,11 +1,4 @@ -import { - Login, -} from './backendUserActions.js'; +import { Login } from "./backendUserActions.js"; -import{ - setLogin, -} from './dsUserActions' -export { - Login, - setLogin -} \ No newline at end of file +import { setLogin } from "./dsUserActions"; +export { Login, setLogin }; diff --git a/src/store/constants.js b/src/store/constants.js index 2e3eb54..ee73df3 100644 --- a/src/store/constants.js +++ b/src/store/constants.js @@ -1,7 +1,7 @@ // a file to easily grab dispatch actions into reducers -export const constants = { - POST_USER: 'POST_USER', - USER_LOGIN: 'USER_LOGIN' -} +export const constants = { + POST_USER: "POST_USER", + USER_LOGIN: "USER_LOGIN" +}; -export default constants; \ No newline at end of file +export default constants; diff --git a/src/store/reducers/dashboardMain.js b/src/store/reducers/dashboardMain.js index b5d6139..813b17e 100644 --- a/src/store/reducers/dashboardMain.js +++ b/src/store/reducers/dashboardMain.js @@ -17,4 +17,4 @@ export const dashboardMain = (state = initialState, { type, payload }) => { default: return state; } -}; \ No newline at end of file +}; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 6f0bf9f..4a9e2b5 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -2,7 +2,6 @@ import { combineReducers } from "redux"; import { watchListReducer } from "./watchListReducer.js"; import { dashboardMain } from "./dashboardMain.js"; - export const reducer = combineReducers({ watchListReducer: watchListReducer, dashboardMain: dashboardMain diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index d561f41..e781d06 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -27,7 +27,7 @@ export const queryAllByTestId = queryHelpers.queryAllByAttribute.bind( export function getAllByTestId(container, id, ...rest) { const els = queryAllByTestId(container, id, ...rest); if (!els.length) { - throw queryHelpers.getElementError( + throw queryHelpers.getMultipleElementsFoundError( `Unable to find an element by: [data-test="${id}"]`, container ); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index d0c3452..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const path = require("path"); - -module.exports = { - resolve: { - alias: { - "react-router-dom": path.resolve("./node_modules/react-router-dom") - } - } -}; From 5abbdbda06201db474e9b91fbfae99beb8ec350c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 01:20:33 -0600 Subject: [PATCH 141/822] solved naming convention errors --- src/App.js | 4 ++-- src/components/dashboard/dashboardv1.js | 2 +- src/components/dashboard/index.js | 2 +- src/components/dashboard/navigation.js | 2 +- src/index.js | 1 - 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index de3eda9..42df99e 100644 --- a/src/App.js +++ b/src/App.js @@ -3,9 +3,9 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; // local imports -import PrivateRoute from "./utils/privateRoute.js"; +import PrivateRoute from "./utils/PrivateRoute.js"; import Dashboard from "./components/dashboard/index.js"; -import Navigation from "./components/dashboard/navigation.js"; +import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; // config imports diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index bb989da..318a575 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -3,7 +3,7 @@ import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { useHistory } from "react-router-dom"; // local imports -import "./dash.scss"; +import "./Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js index 2fa2bd3..c398dc4 100644 --- a/src/components/dashboard/index.js +++ b/src/components/dashboard/index.js @@ -1,6 +1,6 @@ import React from "react"; -import Dashboardv1 from "./dashboardv1"; +import Dashboardv1 from "./Dashboardv1"; import Navigation from "./Navigation.js"; const Dashboard = () => { diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index eb22f64..d15169b 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -7,7 +7,7 @@ import { faBars } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import "../dashboard/navigation.scss"; +import "../dashboard/Navigation.scss"; import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; import { ifDev } from "../../utils/removeAttribute.js"; diff --git a/src/index.js b/src/index.js index 48da9f6..c1684e8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,5 @@ import React from "react"; import ReactDOM from "react-dom"; -import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; From be21eebdc700ce7195fe670d9ba898f841ce8bb7 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 03:41:17 -0600 Subject: [PATCH 142/822] finished cleaning up dashboard for tonight --- src/components/dashboard/dashboardv1.js | 135 ++++++++++--------- src/components/dashboard/dashboardv1.test.js | 2 +- 2 files changed, 70 insertions(+), 67 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 318a575..d103f76 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,26 +1,25 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { useHistory } from "react-router-dom"; +import axios from "axios"; + // local imports -import "./Dashboard.scss"; +import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; +// temp import to verify switch statement import LoadingScreen from "../layout/LoadingScreen.js"; -// dashboard could become a place where we store all of our other layouts. const Dashboardv1 = () => { let history = useHistory(); - const [input] = useState({ file: "" }); // if we're never using setInput, do we need this useState? - const [ratings, setRatings] = useState([]); // maybe this should updated to recommendations? -- are we expecting an array? - // const [toggle, setToggle] = useState(true); + const [input] = useState({ file: "" }); + const [ratings, setRatings] = useState({}); + const [recommendations, setRecommendations] = useState([]); const changeHandler = e => { - // maybe document this some where??? https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData + // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https - // new FormData() needs to be used for the file upload to work. // why? let data = new FormData(); - - // have to read more on new FormData to understand why appending "movies" works here with the input attribute data.append("movies", e.target.files[0], e.target.files[0].name); // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. @@ -38,82 +37,86 @@ const Dashboardv1 = () => { .catch(err => { console.log(err); }); - // clears out previous uploaded file data = new FormData(); }; - // const handleSubmit = e => { - // setToggle(!toggle); - // e.preventDefault(); - // console.log(input); - // }; + useEffect(() => { + axios + .get(`https://api.groa.us/api/users/1111/recommendations`) + .then(res => setRecommendations(res.data.recommendation_json)) + .catch(err => + console.log("Something went wrong in fetching recommendations.", err) + ); + }, []); switch (true) { case !history?.location?.state?.userid: - return ; // redirect to login/register - case !ratings?.length: + return ; + case !ratings && !recommendations?.length: return (
-
-
- {/* keep create component? */} - - - -

- upload your letterboxd csv file here to get all past movie - ratings -

-
+
+ {/* will create a component in the future*/} +
+ +
+

+ upload your letterboxd csv file here to get all past movie ratings +

); default: return (
-
-
- {/* keep create component? */} -
- -
+
+
+ +
+ {Object.keys(ratings).length === 0 ? (

upload your letterboxd csv file here to get all past movie ratings

-
+ ) : ( +

+ {ratings.message} +

+ )} +
- {/* this shows the recommendations movie cards */} -
- {/* should off set up to 200 and then retun nothing */} - {ratings.map((x, index) => - index < 201 ? ( - - ) : null - )} -
+ {/* this shows the recommendations movie cards */} +

Your Recommendations

+
+ {/* should off set up to 200 and then retun nothing */} + {recommendations.map((x, index) => + index < 201 ? ( + + ) : null + )}
); diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 25f1ca9..5f0fc91 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -4,7 +4,7 @@ import { getAllByTestId } from "../../utils/test-utils.js"; import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. -import Dashboardv1 from "./dashboardv1.js"; +import Dashboardv1 from "./Dashboardv1.js"; it("renders dashboardv1", () => { const { container } = render( From 4e52373cc99540812213b17722eb79c65663d53d Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 03:41:37 -0600 Subject: [PATCH 143/822] updated styling, it should be more responsive --- src/App.js | 5 +- src/components/dashboard/_Dashboard.scss | 63 +++++++++++ src/components/dashboard/_Navigation.scss | 39 +++++++ src/components/dashboard/index.js | 22 ---- src/components/dashboard/navigation.js | 36 ++++-- src/components/movies/MovieCard.js | 9 +- src/components/movies/MovieCard.scss | 1 + src/index.js | 1 + src/indexReset.scss | 129 ++++++++++++++++++++++ 9 files changed, 265 insertions(+), 40 deletions(-) create mode 100644 src/components/dashboard/_Dashboard.scss create mode 100644 src/components/dashboard/_Navigation.scss delete mode 100644 src/components/dashboard/index.js create mode 100644 src/components/movies/MovieCard.scss create mode 100644 src/indexReset.scss diff --git a/src/App.js b/src/App.js index 42df99e..e8e6dd2 100644 --- a/src/App.js +++ b/src/App.js @@ -4,7 +4,7 @@ import { ifDev } from "./utils/removeAttribute.js"; // local imports import PrivateRoute from "./utils/PrivateRoute.js"; -import Dashboard from "./components/dashboard/index.js"; +import Dashboardv1 from "./components/dashboard/Dashboardv1.js"; import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; @@ -31,8 +31,9 @@ function App() {
+ - + diff --git a/src/components/dashboard/_Dashboard.scss b/src/components/dashboard/_Dashboard.scss new file mode 100644 index 0000000..1e9672c --- /dev/null +++ b/src/components/dashboard/_Dashboard.scss @@ -0,0 +1,63 @@ +.bigContainer { + font-family: lato; + background: whitesmoke; + display: flex; + flex-direction: column; + + .form-hover { + margin: 2% auto; + input { + font-size: 1.3rem; + } + #zip-input { + margin: 3% auto; + padding: 15%; + background: white; + border: 3px dashed grey; + border-radius: 4px; + } + .form-directions { + font-size: 1.1rem; + margin: 2% auto; + } + .upload-successful { + font-size: 1.2rem; + margin: 2% auto; + color: green; + } + } + h2 { + font-size: 24px; + text-align: center; + margin: 2% auto; + } + .box-container { + width: 80%; + margin: 3% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + .box { + width: 100%; + max-width: 347px; + height: auto; + margin: 3% auto; + display: flex; + flex-direction: row; + img { + width: 100%; + max-width: 164px; + height: auto; + max-height: 246px; + } + .text-container { + color: black; + margin-left: 5%; + p { + padding: 10% 0%; + font-size: 1.1rem; + } + } + } + } +} diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss new file mode 100644 index 0000000..07c092b --- /dev/null +++ b/src/components/dashboard/_Navigation.scss @@ -0,0 +1,39 @@ +.mainContainer { + background: grey; + display: flex; + justify-content: space-between; + padding: 1.1% 1%; + .Bars { + .bars-icon { + color: white; + font-size: 1.4rem; + } + } + .Links { + width: 60%; + display: flex; + justify-content: space-evenly; + .NavLink { + color: white; + text-decoration: none; + &:hover { + color: rebeccapurple; + text-decoration: underline; + } + } + } + + .searchContainer { + width: 11.5%; + display: flex; + justify-content: space-between; + } + + .fa-icons { + width: 14%; + display: flex; + justify-content: space-between; + font-size: 1.4rem; + color: white; + } +} diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js deleted file mode 100644 index c398dc4..0000000 --- a/src/components/dashboard/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; - -import Dashboardv1 from "./Dashboardv1"; -import Navigation from "./Navigation.js"; - -const Dashboard = () => { - return ( -
- - -
- ); -}; - -export default Dashboard; diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index d15169b..f5490bf 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -7,7 +7,7 @@ import { faBars } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import "../dashboard/Navigation.scss"; +import "../dashboard/_Navigation.scss"; import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; import { ifDev } from "../../utils/removeAttribute.js"; @@ -15,13 +15,23 @@ import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; class Navigation extends Component { state = { - search: "" + search: "", + pathname: "" }; handleChange = e => { this.setState({ search: e.target.value }); }; + componentDidMount() { + this.setState({ pathname: window.location.pathname }); + } + + componentDidUpdate(prevProps, prevState) { + if (this.state.pathname !== prevState.pathname) + this.setState({ pathname: window.location.pathname }); + } + render() { if (window.location.pathname === "/") return ; return ( @@ -32,7 +42,7 @@ class Navigation extends Component {
- + Groa @@ -57,7 +67,7 @@ class Navigation extends Component {
- +
- - +
+ + - - + + - - + + - - + + +
); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index c553503..ab07f69 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,15 +1,16 @@ import React from "react"; +import "./MovieCard.scss"; // more fields will be appearing according to the Figma file -export default function MovieCard({ name, year, rating }) { +export default function MovieCard({ name, year, rating, image }) { return (
-
+ Random Movie poster as a placeholder.
{/* changed to p tags because it is more accessible for screen readers */} -

{name}

+

{name}

{year}

-

Rating: {rating}

+

Average Rating: {rating}

); diff --git a/src/components/movies/MovieCard.scss b/src/components/movies/MovieCard.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/components/movies/MovieCard.scss @@ -0,0 +1 @@ + diff --git a/src/index.js b/src/index.js index c1684e8..2d908ec 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ import React from "react"; import ReactDOM from "react-dom"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; +import "./indexReset.scss"; ReactDOM.render(, document.getElementById("root")); diff --git a/src/indexReset.scss b/src/indexReset.scss new file mode 100644 index 0000000..45a05ec --- /dev/null +++ b/src/indexReset.scss @@ -0,0 +1,129 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} From 7656c1e4cfd39cf2fa2a69995a1d46730e305e36 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 04:16:37 -0600 Subject: [PATCH 144/822] console.log and MovieCard.scss deletion --- src/components/dashboard/dashboardv1.js | 1 - src/components/dashboard/navigation.js | 1 - src/components/movies/MovieCard.scss | 1 - 3 files changed, 3 deletions(-) delete mode 100644 src/components/movies/MovieCard.scss diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index d103f76..4b0383d 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -31,7 +31,6 @@ const Dashboardv1 = () => { } }) .then(res => { - console.log(res); setRatings(res.data); }) .catch(err => { diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index f5490bf..503020d 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -71,7 +71,6 @@ class Navigation extends Component { Date: Wed, 4 Mar 2020 08:48:46 -0500 Subject: [PATCH 145/822] added tests, upload axios call needs fix --- .../__snapshots__/dataUpload.test.js.snap | 13 ++++++++++++ src/components/auth/dataUpload.js | 20 +++--------------- src/components/auth/dataUpload.scss | 10 --------- src/components/auth/dataUpload.test.js | 21 +++++++++++++++++++ src/utils/test-utils.js | 11 +++++++++- 5 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 src/components/auth/__snapshots__/dataUpload.test.js.snap create mode 100644 src/components/auth/dataUpload.test.js diff --git a/src/components/auth/__snapshots__/dataUpload.test.js.snap b/src/components/auth/__snapshots__/dataUpload.test.js.snap new file mode 100644 index 0000000..19e6bec --- /dev/null +++ b/src/components/auth/__snapshots__/dataUpload.test.js.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Button postlogin should render postlogin correctly 1`] = ` + +`; + +exports[`dataupload should render dataupload correctly 1`] = ` + +`; diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 2ad49de..c8fcc12 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -43,7 +43,8 @@ function clikR() { let data = new FormData() data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number - //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + // NOT USING CORRECT? -> //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ + // THINK LINE 48 should be this -> //http://www.groa.us/api/users/:id/uploading axios.post('http://localhost:4000/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' @@ -60,22 +61,7 @@ function clikR() { setTimeout(() => { setLoading(

.loading

) }, 3000); - // setTimeout(() => { - // setLoading(

..loading

) - // }, 2000); - // setTimeout(() => { - // setLoading(

...loading

) - // }, 3000); - // setTimeout(() => { - // setLoading(

....loading

) - // }, 4000); - - // setTimeout(() => { - // setLoading('..loading') - // }, 4000); - // setTimeout(() => { - // setLoading('.loading') - // }, 5000); + } diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss index c327ca6..5478a75 100644 --- a/src/components/auth/dataUpload.scss +++ b/src/components/auth/dataUpload.scss @@ -5,8 +5,6 @@ .textholder1{ - - h1{ display: flex; justify-content: center; @@ -55,23 +53,16 @@ font-weight: 500; .dropbtn:hover, .dropbtn:focus { background-color: rgb(0, 153, 255); } - .dropdown { position: relative; display: inline-block; } - .dropdown-content { - display: none; position: absolute; min-width: 160px; - // background-color: #f1f1f1; - // overflow: auto; - // box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - // z-index: 1; } .dropdown-content a { @@ -95,7 +86,6 @@ font-weight: 500; ////////////////////UPLOAD DATA BOX/////////////////// .UploadContainer{ - // padding-top: 25px; display: flex; justify-content: center; .inputholder{ diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js new file mode 100644 index 0000000..096802f --- /dev/null +++ b/src/components/auth/dataUpload.test.js @@ -0,0 +1,21 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import DataUpload from './dataUpload'; +import { clikDataUpload } from "../../utils/test-utils.js"; + +describe('dataupload', () => { + it('dataupload be defined', () => { + expect(DataUpload).toBeDefined(); + }); + + it('should render dataupload correctly', () => { + const tree = ( + + ); + expect(tree).toMatchSnapshot(); + }); + }); + + test('drop dataupload file at upload spot', () => { + expect(clikDataUpload.sum(0, 1)).toBe(1) + }) \ No newline at end of file diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index d561f41..5a70f27 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,11 +43,20 @@ export function getByTestId(...args) { return null; } +const clikDataUpload = { + sum: (a, b) => { + return a + b + } +} + // re-export with overrides module.exports = { ...domTestingLib, getByTestId, getAllByTestId, queryByTestId, - queryAllByTestId + queryAllByTestId, + clikDataUpload }; + + From 429845bdc3fae0fe60f7e053f698d99286c22b7b Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 08:50:28 -0500 Subject: [PATCH 146/822] need fix upload axios.post call --- src/components/auth/dataUpload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index c8fcc12..25b3855 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -44,7 +44,7 @@ function clikR() { data.append('movies', e.target.files[0] , e.target.files[0].name) //change user/1/ to be :id number // NOT USING CORRECT? -> //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - // THINK LINE 48 should be this -> //http://www.groa.us/api/users/:id/uploading + // THINK LINE 48 should be this -> //https://api.groa.us/api/users/:id/uploading axios.post('http://localhost:4000/api/users/1/upload', data,{ headers:{ 'Content-Type':'multipart/form-data' From 55cbe476b33da67c97189086b7237d5ab21fe557 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 08:59:54 -0500 Subject: [PATCH 147/822] changed axios .post endpoint --- src/components/auth/dataUpload.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 25b3855..561b075 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -42,10 +42,8 @@ function clikR() { const handleChange = e => { let data = new FormData() data.append('movies', e.target.files[0] , e.target.files[0].name) - //change user/1/ to be :id number // NOT USING CORRECT? -> //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - // THINK LINE 48 should be this -> //https://api.groa.us/api/users/:id/uploading - axios.post('http://localhost:4000/api/users/1/upload', data,{ + axios.post('https://api.groa.us/api/users/:id/uploading', data,{ headers:{ 'Content-Type':'multipart/form-data' } From 3015ecfbb0959ba2e0b737eb6f79c776c1f224f1 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 09:15:59 -0600 Subject: [PATCH 148/822] solved errors that sleepy me didn't catch --- src/components/movies/MovieCard.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ab07f69..8451ce3 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,5 +1,4 @@ import React from "react"; -import "./MovieCard.scss"; // more fields will be appearing according to the Figma file export default function MovieCard({ name, year, rating, image }) { From c83964af7f0d8be8e80fa8c2641e3a0471a76cc9 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 09:21:35 -0600 Subject: [PATCH 149/822] privateRoute not being found --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index e8e6dd2..90ef9cf 100644 --- a/src/App.js +++ b/src/App.js @@ -3,7 +3,7 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; // local imports -import PrivateRoute from "./utils/PrivateRoute.js"; +import PrivateRoute from "./utils/privateRoute.js"; import Dashboardv1 from "./components/dashboard/Dashboardv1.js"; import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; From 2b036304746b4ecde04bb818692f5d8942db0857 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 09:28:40 -0600 Subject: [PATCH 150/822] naming convention did not work --- src/App.js | 4 ++-- src/components/dashboard/{Dashboard.scss => dash.scss} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/components/dashboard/{Dashboard.scss => dash.scss} (100%) diff --git a/src/App.js b/src/App.js index 90ef9cf..6d99f2f 100644 --- a/src/App.js +++ b/src/App.js @@ -4,8 +4,8 @@ import { ifDev } from "./utils/removeAttribute.js"; // local imports import PrivateRoute from "./utils/privateRoute.js"; -import Dashboardv1 from "./components/dashboard/Dashboardv1.js"; -import Navigation from "./components/dashboard/Navigation.js"; +import Dashboardv1 from "./components/dashboard/dashboardv1.js"; +import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; // config imports diff --git a/src/components/dashboard/Dashboard.scss b/src/components/dashboard/dash.scss similarity index 100% rename from src/components/dashboard/Dashboard.scss rename to src/components/dashboard/dash.scss From 7d1ac943ac63fea37118aa8dd8a52da664d54996 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 09:52:42 -0600 Subject: [PATCH 151/822] found nav bar dashboard --- src/components/dashboard/navigation.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 503020d..1e2032c 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -24,16 +24,19 @@ class Navigation extends Component { }; componentDidMount() { + console.log("mounted nav"); this.setState({ pathname: window.location.pathname }); } componentDidUpdate(prevProps, prevState) { + console.log("did update"); + console.log(prevState); if (this.state.pathname !== prevState.pathname) this.setState({ pathname: window.location.pathname }); } render() { - if (window.location.pathname === "/") return ; + if (this.state.pathname === "/") return ; return (
From 846991e9191af4595c2708cb6a9b2187a2c56a5f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 10:55:05 -0600 Subject: [PATCH 152/822] should have fixed navigation issue --- src/App.js | 14 +++++++++--- src/components/auth/Register.js | 7 +++++- src/components/dashboard/navigation.js | 24 ++++++--------------- src/components/dashboard/navigation.test.js | 2 +- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/App.js b/src/App.js index 6d99f2f..9e8ca64 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import React, { useState, useEffect } from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; @@ -7,6 +7,7 @@ import PrivateRoute from "./utils/privateRoute.js"; import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; +import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -25,17 +26,24 @@ const store = createStore( ); function App() { + const [token, setToken] = useState(localStorage.getItem("token")); useEffect(() => reactGAinitialization(), []); return (
- + {token === null ? : } - + ( + + )} + />
diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index a2d62b0..aa7fd13 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -61,7 +61,12 @@ class Register extends React.Component { .then(res2 => { const userid = res2.data.id; localStorage.setItem("token", res2.data.token); - this.props.history.push("/dashboard", { userid: userid }); + this.props.updateToken(localStorage.getItem("token")); + this.props.history.push( + "/dashboard", + { userid: userid }, + { pathname: "/dashboard" } + ); }) .catch(err2 => { console.log(err2); diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 1e2032c..5033948 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -11,32 +11,20 @@ import "../dashboard/_Navigation.scss"; import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; import { ifDev } from "../../utils/removeAttribute.js"; -import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; class Navigation extends Component { - state = { - search: "", - pathname: "" - }; + constructor(props) { + super(props); + this.state = { + search: "" + }; + } handleChange = e => { this.setState({ search: e.target.value }); }; - componentDidMount() { - console.log("mounted nav"); - this.setState({ pathname: window.location.pathname }); - } - - componentDidUpdate(prevProps, prevState) { - console.log("did update"); - console.log(prevState); - if (this.state.pathname !== prevState.pathname) - this.setState({ pathname: window.location.pathname }); - } - render() { - if (this.state.pathname === "/") return ; return (
diff --git a/src/components/dashboard/navigation.test.js b/src/components/dashboard/navigation.test.js index 4fade87..e8e263c 100644 --- a/src/components/dashboard/navigation.test.js +++ b/src/components/dashboard/navigation.test.js @@ -14,6 +14,6 @@ it("renders navigation component", () => { ); // the uri when this component renders is "/" so it'll go to the RegisterNavLinks component - const component = getAllByTestId(container, "register-nav-component"); + const component = getAllByTestId(container, "navigation"); expect(component.length).toBe(1); }); From 1941ce2966c94129e0569e5aafd30da52407bf51 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 11:01:25 -0600 Subject: [PATCH 153/822] made the inputs for register more dynamic --- src/components/auth/_Register.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 26fea31..3f99254 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -55,11 +55,12 @@ border: 1px solid black; max-width: 370px; width: 100%; - height: 36px; + height: auto; + padding: 2.7%; margin: 2.6% auto; } input::placeholder { - font-size: 16px; + font-size: 1.1rem; } .BottomLogin { From a173c4af0547e2bb19bdf2097a5082a9b12baf20 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 11:38:59 -0600 Subject: [PATCH 154/822] recommendations should be functional --- src/components/dashboard/dashboardv1.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 4b0383d..d114591 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -2,8 +2,6 @@ import React, { useState, useEffect } from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { useHistory } from "react-router-dom"; -import axios from "axios"; - // local imports import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; @@ -31,7 +29,7 @@ const Dashboardv1 = () => { } }) .then(res => { - setRatings(res.data); + setTimeout(() => setRatings(res.data), 200); }) .catch(err => { console.log(err); @@ -41,18 +39,23 @@ const Dashboardv1 = () => { }; useEffect(() => { - axios - .get(`https://api.groa.us/api/users/1111/recommendations`) - .then(res => setRecommendations(res.data.recommendation_json)) + if (!history?.location?.state?.userid) return () => null; + axiosWithAuth() + .get( + `https://api.groa.us/api/users/${history.location.state.userid}/recommendations` + ) + .then(res => { + setRecommendations(res.data.recommendation_json); + }) .catch(err => console.log("Something went wrong in fetching recommendations.", err) ); - }, []); + }, [ratings, history]); switch (true) { case !history?.location?.state?.userid: return ; - case !ratings && !recommendations?.length: + case !recommendations?.length: return (
From 490f42d1f427e6d95c8316948766120b54388dc3 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 11:47:27 -0600 Subject: [PATCH 155/822] tried fixing an edge case --- src/components/dashboard/dashboardv1.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index d114591..7070cc4 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -51,7 +51,6 @@ const Dashboardv1 = () => { console.log("Something went wrong in fetching recommendations.", err) ); }, [ratings, history]); - switch (true) { case !history?.location?.state?.userid: return ; From 17c05bd53686dba056acea4c2dd1555b04ab6171 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 13:21:27 -0500 Subject: [PATCH 156/822] changed api endpoint slightly --- src/components/auth/login.js | 2 +- src/utils/axiosWithAuth.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 042cd13..18f307d 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -68,7 +68,7 @@ class LoginPage extends React.Component { //console.log(user) axiosWithAuth() - .post("api/users/login", this.state.user) + .post("/login", this.state.user) .then(res => { localStorage.setItem('token', res.data.token); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 67048ad..9049f36 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -5,7 +5,7 @@ const axiosWithAuth = () => { //need env file for line 6? //var key = process.env.REACT_APP_KEY return axios.create({ - baseURL:'https://api.groa.us/', + baseURL:'https://api.groa.us/api/users', headers: { Authorization: token } From 4d7745fc6b73f2a969ff3b9bf81c745486f57921 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 12:34:39 -0600 Subject: [PATCH 157/822] ben's requested changes --- src/components/auth/_Register.scss | 2 +- src/utils/axiosWithAuth.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 3f99254..8c4fe74 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -1,6 +1,6 @@ .container { font-family: Lato; - min-height: 100vh; + min-height: 100%; color: white; background-image: linear-gradient( to bottom, diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index ce96624..a804217 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,6 @@ export const axiosWithAuth = () => { return axios.create({ baseURL: "https://api.groa.us/api/users", headers: { - "Content-Type": "application/json", Authorization: `${token}` } }); From 62d7e171631f135598475acbadb9abc799bef6f9 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 15:53:33 -0500 Subject: [PATCH 158/822] did fixes suggested --- src/App.js | 3 + src/components/auth/login.js | 251 +++++++++++++++------------------ src/components/auth/login.scss | 14 +- 3 files changed, 124 insertions(+), 144 deletions(-) diff --git a/src/App.js b/src/App.js index 9e8ca64..07dbf98 100644 --- a/src/App.js +++ b/src/App.js @@ -8,6 +8,7 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; +import Login from "./components/auth/login"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -32,9 +33,11 @@ function App() { return ( +
{token === null ? : } + { - const { name, value} = e.target; - let errors = this.state.errors; - e.preventDefault(); - this.setState({ - user: { - ...this.state.user, - [e.target.name]: e.target.value - }, - }); - switch (name) { - case 'user_name' : - errors.user_name = - value.length < 5 - ? 'must be a valid user name' - : ''; + + handleChange = e => { + const { name, value } = e.target; + let errors = this.state.errors; + e.preventDefault(); + this.setState({ + user: { + ...this.state.user, + [e.target.name]: e.target.value + } + }); + switch (name) { + case "user_name": + errors.user_name = value.length < 5 ? "must be a valid user name" : ""; break; - case 'password': - errors.password = + case "password": + errors.password = value.length < 4 - ? 'Password must be more than 4 characters long' - : ''; - break; - default: - break; - } - - this.setState({errors, [name]: value}, ()=> { - - }) + ? "Password must be more than 4 characters long" + : ""; + break; + default: + break; + } + + this.setState({ errors, [name]: value }, () => {}); }; - - - + loginUser = e => { e.preventDefault(); - - axiosWithAuth() + axiosWithAuth() .post("/login", this.state.user) .then(res => { - - localStorage.setItem('token', res.data.token); + localStorage.setItem("token", res.data.token); //redirect to Groas dashboard page - if (this.user.user_name && this.user.password) { - this.props.history.push('/'); + if (this.state.user.user_name && this.state.user.password) { + this.props.history.push("/dashboard"); } - }) .catch(err => console.log(err)); - }; - render() { - const {errors} = this.state; - return ( - -
- {/* Container - ENTIRE PAGE */} -
-
- - -

Register

-
- -
-
- - GroaLogo - + const { errors } = this.state; + return ( +
+ {/* Container - ENTIRE PAGE */} +
+
+
-{/* END BOX LEFT */} -
-
-

Log in

- -
- -{/* ERROR MESSAGE */} - {errors.user_name.length > 0 && - {errors.user_name}} - - - - {errors.password.length > 0 && - {errors.password}} - -
-
- -
-
Remember me
-
-
Forgot password?
-
-
- - - -
- - + +
+
+ GroaLogo
+ {/* END BOX LEFT */} +
+ +

Log in

+ +
+ + {/* ERROR MESSAGE */} + {errors.user_name.length > 0 && ( + {errors.user_name} + )} + + + + {errors.password.length > 0 && ( + {errors.password} + )} - +
+
+ +
+
Remember me
+
+
Forgot password?
+
+
+ +
+ +
+ +
+ {/* END BOX RIGHT */}
- {/* END BOX RIGHT */} -
{/* END MIDDLE */} +
+ {/* END CONTAINER */}
- {/* END CONTAINER */} -
- // END LOGIN PAGE - ) - }; + // END LOGIN PAGE + ); + } } const mapStateToProps = state => { - return { - userData: state.userData, - isFetching: state.isFetching, - error: state.error - }; + return { + userData: state.userData, + isFetching: state.isFetching, + error: state.error + }; }; -export default connect( - mapStateToProps, - {loginAction} -)(LoginPage); - +export default connect(mapStateToProps, { loginAction })(LoginPage); diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 7a56618..3c0a9e5 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -9,7 +9,7 @@ rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); } -.container{ +.containerLogin{ width: 100%; } @@ -18,13 +18,11 @@ justify-content: space-between; height: 150px; - .Logo{ - color: white; - padding: 3% 0 0 0%; - height: 60%; - - - } + // .Logo{ + // color: white; + // padding: 3% 0 0 0%; + // height: 60%; + // } .Register{ color: white; padding: 3% 0 0 4%; From e44840b6efc7d6b31bb7c66f10ca2935b18d820e Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:09:38 -0600 Subject: [PATCH 159/822] maybe cors issue --- src/components/auth/_Register.scss | 3 +-- src/components/dashboard/dashboardv1.js | 1 + src/utils/axiosWithAuth.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 8c4fe74..6cb5b3c 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -1,6 +1,6 @@ .container { font-family: Lato; - min-height: 100%; + min-height: 100vh; color: white; background-image: linear-gradient( to bottom, @@ -32,7 +32,6 @@ padding: 3%; border-radius: 4px; background: white; - width: 100%; max-width: 518px; height: auto; diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 7070cc4..d114591 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -51,6 +51,7 @@ const Dashboardv1 = () => { console.log("Something went wrong in fetching recommendations.", err) ); }, [ratings, history]); + switch (true) { case !history?.location?.state?.userid: return ; diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index a804217..4a6e4f8 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,6 +6,7 @@ export const axiosWithAuth = () => { return axios.create({ baseURL: "https://api.groa.us/api/users", headers: { + "Content-type": "application/json", Authorization: `${token}` } }); From 40d2cf7cb41f907a47b8e621b0aef6ef2714d42e Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:26:15 -0600 Subject: [PATCH 160/822] tjs fix on cors --- src/components/dashboard/dashboardv1.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index d114591..9e92f38 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -29,7 +29,7 @@ const Dashboardv1 = () => { } }) .then(res => { - setTimeout(() => setRatings(res.data), 200); + setTimeout(() => setRatings(res.data), 2000); }) .catch(err => { console.log(err); @@ -41,9 +41,7 @@ const Dashboardv1 = () => { useEffect(() => { if (!history?.location?.state?.userid) return () => null; axiosWithAuth() - .get( - `https://api.groa.us/api/users/${history.location.state.userid}/recommendations` - ) + .get(`${history.location.state.userid}/recommendations`) .then(res => { setRecommendations(res.data.recommendation_json); }) From fbbc3b80309c46204ab215c17c06c7380a1b18a2 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:27:05 -0600 Subject: [PATCH 161/822] typo in uri --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 9e92f38..1d30de2 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -41,7 +41,7 @@ const Dashboardv1 = () => { useEffect(() => { if (!history?.location?.state?.userid) return () => null; axiosWithAuth() - .get(`${history.location.state.userid}/recommendations`) + .get(`/${history.location.state.userid}/recommendations`) .then(res => { setRecommendations(res.data.recommendation_json); }) From c48b8e49b6390f38f43d3da6a21bd4b6cabde6e5 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 16:40:13 -0500 Subject: [PATCH 162/822] changed .push to /dashboard --- src/components/auth/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 3c833ce..5729a12 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -59,7 +59,7 @@ class LoginPage extends React.Component { localStorage.setItem("token", res.data.token); //redirect to Groas dashboard page if (this.state.user.user_name && this.state.user.password) { - this.props.history.push("/dashboard"); + this.props.history.push("/dashboard", {userid: res.data.id}); } }) .catch(err => console.log(err)); From 1dc4c171ec58f9be82d21fc51963d913681aaf07 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:40:22 -0600 Subject: [PATCH 163/822] testing cors fix with be staging branch url --- src/utils/axiosWithAuth.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 4a6e4f8..b5fa8fc 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,8 @@ export const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ - baseURL: "https://api.groa.us/api/users", + baseURL: + "http://groaberecommendations-env.eba-jm9gzcte.us-east-1.elasticbeanstalk.com/", headers: { "Content-type": "application/json", Authorization: `${token}` From 73354c11d79c051cb463857b48d11120ba9671a6 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:51:58 -0600 Subject: [PATCH 164/822] updated url to match SSL verified be url --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index b5fa8fc..952e679 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -5,7 +5,7 @@ export const axiosWithAuth = () => { return axios.create({ baseURL: - "http://groaberecommendations-env.eba-jm9gzcte.us-east-1.elasticbeanstalk.com/", + "https://groaberecommendations-env.eba-jm9gzcte.us-east-1.elasticbeanstalk.com/", headers: { "Content-type": "application/json", Authorization: `${token}` From ed0a54ce086041fe73276bd9a83d419bfa046b23 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 15:56:01 -0600 Subject: [PATCH 165/822] updated url to match SSL verified be url --- src/utils/axiosWithAuth.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 952e679..4a6e4f8 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,8 +4,7 @@ export const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ - baseURL: - "https://groaberecommendations-env.eba-jm9gzcte.us-east-1.elasticbeanstalk.com/", + baseURL: "https://api.groa.us/api/users", headers: { "Content-type": "application/json", Authorization: `${token}` From 0f60bd97f891d453720d7d1722d2163f88b89dd4 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 16:09:36 -0600 Subject: [PATCH 166/822] changed time for ratings --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 1d30de2..48e1a90 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -29,7 +29,7 @@ const Dashboardv1 = () => { } }) .then(res => { - setTimeout(() => setRatings(res.data), 2000); + setTimeout(() => setRatings(res.data), 60 * 1000); }) .catch(err => { console.log(err); From 678a0e75f7e89ef0542a5963f60500b0d291570f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 16:17:58 -0600 Subject: [PATCH 167/822] added visual cue if ratings were accepted --- src/components/dashboard/dashboardv1.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 48e1a90..84b1f01 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -69,9 +69,16 @@ const Dashboardv1 = () => { onChange={changeHandler} /> -

- upload your letterboxd csv file here to get all past movie ratings -

+ {Object.keys(ratings).length === 0 ? ( +

+ upload your letterboxd csv file here to get all past movie + ratings +

+ ) : ( +

+ {ratings.message} +

+ )}
); From 203989406220ccc3729724aef37f8bd46196630a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 16:33:48 -0600 Subject: [PATCH 168/822] trying with async await --- src/components/dashboard/dashboardv1.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 84b1f01..f6bf84c 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -14,26 +14,31 @@ const Dashboardv1 = () => { const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); - const changeHandler = e => { + const changeHandler = async e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. - axiosWithAuth() + const ratingsResponse = await axiosWithAuth() // this is insantiated when a file is added to input .post(`/${history.location.state.userid}/uploading`, data, { headers: { "Content-Type": "multipart/form-data" } - }) - .then(res => { - setTimeout(() => setRatings(res.data), 60 * 1000); - }) - .catch(err => { - console.log(err); }); + + console.log("ratingsResponse: ", ratingsResponse); + setRatings(ratingsResponse.data); + + // .then(res => { + // console.log("Ratings res: ", res); + // setTimeout(() => setRatings(res.data), 60 * 1000); + // }) + // .catch(err => { + // console.log(err); + // }); // clears out previous uploaded file data = new FormData(); }; From 4e423047d5ee46460974bf60c3f0aa758df4afd3 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 16:44:37 -0600 Subject: [PATCH 169/822] still trouble shooting cors --- src/utils/axiosWithAuth.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 4a6e4f8..a4d080b 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -7,6 +7,7 @@ export const axiosWithAuth = () => { baseURL: "https://api.groa.us/api/users", headers: { "Content-type": "application/json", + "Access-Control-Allow-Origin": "*", Authorization: `${token}` } }); From 4aaa5d75264fc3adfb932e6cf79f41cf270a16eb Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 16:50:19 -0600 Subject: [PATCH 170/822] removed allow access header --- src/utils/axiosWithAuth.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index a4d080b..4a6e4f8 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -7,7 +7,6 @@ export const axiosWithAuth = () => { baseURL: "https://api.groa.us/api/users", headers: { "Content-type": "application/json", - "Access-Control-Allow-Origin": "*", Authorization: `${token}` } }); From 2aeb11dc0f183c96260f0a79445b0cd1ce4d79e1 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 4 Mar 2020 17:51:30 -0500 Subject: [PATCH 171/822] removed commneted out code --- src/components/auth/login.scss | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index 3c0a9e5..c2cf402 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -17,12 +17,7 @@ display: flex; justify-content: space-between; height: 150px; - - // .Logo{ - // color: white; - // padding: 3% 0 0 0%; - // height: 60%; - // } + .Register{ color: white; padding: 3% 0 0 4%; @@ -33,9 +28,7 @@ .Middle{ display: flex; - // border: 2px solid blue; - - + //Text Motto - your movies your way. .boxLeft{ margin-top: 3%; From 54589b875eaec819f8449b4792e85db446c42e00 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 4 Mar 2020 17:31:15 -0600 Subject: [PATCH 172/822] went back to .then --- src/components/dashboard/dashboardv1.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index f6bf84c..cad5baf 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -21,30 +21,29 @@ const Dashboardv1 = () => { data.append("movies", e.target.files[0], e.target.files[0].name); // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. - const ratingsResponse = await axiosWithAuth() + axiosWithAuth() // this is insantiated when a file is added to input .post(`/${history.location.state.userid}/uploading`, data, { headers: { "Content-Type": "multipart/form-data" } + }) + .then(res => { + console.log("Ratings res: ", res); + // waiting to set ratings var for 10 seconds. + setTimeout(() => setRatings(res.data), 10 * 1000); + }) + .catch(err => { + console.log(err); }); - - console.log("ratingsResponse: ", ratingsResponse); - setRatings(ratingsResponse.data); - - // .then(res => { - // console.log("Ratings res: ", res); - // setTimeout(() => setRatings(res.data), 60 * 1000); - // }) - // .catch(err => { - // console.log(err); - // }); // clears out previous uploaded file data = new FormData(); }; useEffect(() => { if (!history?.location?.state?.userid) return () => null; + + // when ratings is updated this call to recommendations will be called axiosWithAuth() .get(`/${history.location.state.userid}/recommendations`) .then(res => { From d1149e8ced274a8cc342fb67cc57d89c82d8e2ae Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 10:58:49 -0600 Subject: [PATCH 173/822] took out history obj in depdend arr and console logged for debugging --- src/components/dashboard/dashboardv1.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index cad5baf..e937f0f 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -29,9 +29,9 @@ const Dashboardv1 = () => { } }) .then(res => { - console.log("Ratings res: ", res); + console.log("ratings res: ", ratings); // waiting to set ratings var for 10 seconds. - setTimeout(() => setRatings(res.data), 10 * 1000); + setTimeout(() => setRatings(res.data), 30 * 1000); }) .catch(err => { console.log(err); @@ -41,19 +41,23 @@ const Dashboardv1 = () => { }; useEffect(() => { + console.log("running useEffect!!!"); if (!history?.location?.state?.userid) return () => null; // when ratings is updated this call to recommendations will be called axiosWithAuth() .get(`/${history.location.state.userid}/recommendations`) .then(res => { + console.log("ran recommendations call."); + console.log("recommendations res: ", res); setRecommendations(res.data.recommendation_json); }) .catch(err => console.log("Something went wrong in fetching recommendations.", err) ); - }, [ratings, history]); + }, [ratings]); + console.log("ratings obj before attempting to render: ", ratings); switch (true) { case !history?.location?.state?.userid: return ; From 57a15c84261c100e3453a8d793ba51db8a85d783 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 11:03:14 -0600 Subject: [PATCH 174/822] added more console.logs for history obj --- src/components/dashboard/dashboardv1.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index e937f0f..ae30d58 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -42,6 +42,7 @@ const Dashboardv1 = () => { useEffect(() => { console.log("running useEffect!!!"); + console.log("history obj in useEffect: ", history); if (!history?.location?.state?.userid) return () => null; // when ratings is updated this call to recommendations will be called @@ -57,6 +58,7 @@ const Dashboardv1 = () => { ); }, [ratings]); + console.log("history obj before rendering: ", history); console.log("ratings obj before attempting to render: ", ratings); switch (true) { case !history?.location?.state?.userid: From 93fa23760ed7125e0206f2bcf2b23c20b55b1b9b Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 11:20:10 -0600 Subject: [PATCH 175/822] up to 45 seconds for timer --- src/components/dashboard/dashboardv1.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index ae30d58..d1cdea0 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -31,7 +31,7 @@ const Dashboardv1 = () => { .then(res => { console.log("ratings res: ", ratings); // waiting to set ratings var for 10 seconds. - setTimeout(() => setRatings(res.data), 30 * 1000); + setTimeout(() => setRatings(res.data), 45 * 1000); }) .catch(err => { console.log(err); @@ -56,7 +56,7 @@ const Dashboardv1 = () => { .catch(err => console.log("Something went wrong in fetching recommendations.", err) ); - }, [ratings]); + }, [ratings, history]); console.log("history obj before rendering: ", history); console.log("ratings obj before attempting to render: ", ratings); From 208e8aaa8082296210c21f91245b84a09041aa3b Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 5 Mar 2020 14:33:39 -0500 Subject: [PATCH 176/822] got display and hide navbar working. adjusting styling still --- src/App.js | 17 +- src/components/auth/Register.js | 163 +++++++++--------- src/components/auth/_Register.scss | 23 ++- src/components/dashboard/dashboardv1.js | 3 + .../layout/nav-layouts/RegisterNavLinks.scss | 10 +- 5 files changed, 126 insertions(+), 90 deletions(-) diff --git a/src/App.js b/src/App.js index 9e8ca64..c421e29 100644 --- a/src/App.js +++ b/src/App.js @@ -5,9 +5,11 @@ import { ifDev } from "./utils/removeAttribute.js"; // local imports import PrivateRoute from "./utils/privateRoute.js"; import Dashboardv1 from "./components/dashboard/dashboardv1.js"; -import Navigation from "./components/dashboard/navigation.js"; +//TOOK OUT Navigation in Dashboardv1 now. +// import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; -import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; +//TOOK OUT RegisterNavlinks - in Register now. +// import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -29,14 +31,21 @@ function App() { const [token, setToken] = useState(localStorage.getItem("token")); useEffect(() => reactGAinitialization(), []); + + const home = + const dash = + + return (
- {token === null ? : } + + {/* {token === null ? : } */} + {/* {token === null ? : } */} - + {/* */} -
- groa logo -
-
-
-

Register

- {/* divs with changing classnames updates error handling for form */} -
- - {submitted && !user.email && ( -
Email is required
- )} +
+
+
+ groa logo +
+
+ +

Register

+ {/* divs with changing classnames updates error handling for form */} +
+ + {submitted && !user.email && ( +
Email is required
+ )} -
- - {submitted && !user.user_name && ( -
Username is required
- )} +
+ + {submitted && !user.user_name && ( +
Username is required
+ )} -
+
- - {submitted && !user.password && ( -
Password is required
- )} + + {submitted && !user.password && ( +
Password is required
+ )} -
- - {submitted && !user.confirmpassword && ( -
Confirm Password is required
- )} +
+ + {submitted && !user.confirmpassword && ( +
Confirm Password is required
+ )} -
- -
- -
- {/* end box right */} +
+ +
+ +
+ {/* end box right */} +
+ {/* END boxHolder */}
+ //END CONTAINER ); } } diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 8c4fe74..d5ccb3c 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -1,6 +1,7 @@ .container { font-family: Lato; - min-height: 100%; + min-height: 100vh; + //min-height: 100%; color: white; background-image: linear-gradient( to bottom, @@ -10,10 +11,23 @@ rgba(0, 0, 0, 0.85) ); - display: flex; - flex-direction: row; - justify-content: space-evenly; + // display: flex; + // flex-direction: row; + // justify-content: space-evenly; + + .registerNav{ + display: flex; + justify-content: flex-end; + border: 2px solid red; + padding: 0.5% 1%; + } + + .boxHolder{ + display: flex; + } + + .boxLeft { width: 40%; margin: auto; @@ -87,4 +101,5 @@ justify-content: center; } } + } diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 7070cc4..87d2505 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -7,6 +7,8 @@ import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; // temp import to verify switch statement import LoadingScreen from "../layout/LoadingScreen.js"; +// Navbar +import Navigation from "../dashboard/navigation"; const Dashboardv1 = () => { let history = useHistory(); @@ -57,6 +59,7 @@ const Dashboardv1 = () => { case !recommendations?.length: return (
+
{/* will create a component in the future*/}
diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.scss b/src/components/layout/nav-layouts/RegisterNavLinks.scss index d206166..f37177c 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.scss +++ b/src/components/layout/nav-layouts/RegisterNavLinks.scss @@ -1,14 +1,16 @@ .register-nav { font-family: lato; - display: flex; - justify-content: flex-end; - background: black; + // display: flex; + // justify-content: flex-end; + border: 2px solid yellow; + margin: 1% 5%; + .login-link { width: 100%; max-width: 53px; height: auto; font-size: 20px; - margin: 3% 2%; + // margin: 3% 2%; color: white; text-decoration: none; From 447175ac6f2a3e3b4276eb773e2242e14069c05a Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 5 Mar 2020 15:11:41 -0500 Subject: [PATCH 177/822] styling looks good --- src/components/auth/_Register.scss | 1 - src/components/dashboard/_Navigation.scss | 32 +++++++++++++++++-- src/components/dashboard/navigation.js | 5 ++- .../layout/nav-layouts/RegisterNavLinks.scss | 7 ++-- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index d5ccb3c..7c50521 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -19,7 +19,6 @@ .registerNav{ display: flex; justify-content: flex-end; - border: 2px solid red; padding: 0.5% 1%; } diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index 07c092b..aaf49e8 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -1,18 +1,38 @@ .mainContainer { - background: grey; - display: flex; - justify-content: space-between; + background: gray; + // display: flex; + // justify-content: space-between; padding: 1.1% 1%; + .navContainer{ + display: flex; + justify-content: space-between; + + + .Bars { + padding-top: 5px; .bars-icon { color: white; font-size: 1.4rem; } } + .Links { width: 60%; display: flex; justify-content: space-evenly; + padding-top: 7px; + + .Groa-NavLink{ + color: white; + font-weight: 600; + text-decoration: none; + + &:hover { + color: rebeccapurple; + text-decoration: underline; + } + } .NavLink { color: white; text-decoration: none; @@ -29,11 +49,17 @@ justify-content: space-between; } + .searchBox{ + padding: 7px; + border-radius: 5px; + } .fa-icons { + padding-top: 5px; width: 14%; display: flex; justify-content: space-between; font-size: 1.4rem; color: white; } + } } diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 5033948..c506a8f 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -27,13 +27,14 @@ class Navigation extends Component { render() { return (
+
- + Groa @@ -82,6 +83,8 @@ class Navigation extends Component {
+
+ {/* END navContainer */}
); } diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.scss b/src/components/layout/nav-layouts/RegisterNavLinks.scss index f37177c..0e8bad3 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.scss +++ b/src/components/layout/nav-layouts/RegisterNavLinks.scss @@ -1,16 +1,13 @@ .register-nav { font-family: lato; - // display: flex; - // justify-content: flex-end; - border: 2px solid yellow; margin: 1% 5%; .login-link { width: 100%; max-width: 53px; height: auto; - font-size: 20px; - // margin: 3% 2%; + font-size: 22px; + color: white; text-decoration: none; From a2689d416a2194f6b3eac366fcb8a43926c64407 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 14:16:49 -0600 Subject: [PATCH 178/822] solved 404 for recommendations by checking the ratings object --- src/components/dashboard/dashboardv1.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index d1cdea0..5130ead 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -43,7 +43,8 @@ const Dashboardv1 = () => { useEffect(() => { console.log("running useEffect!!!"); console.log("history obj in useEffect: ", history); - if (!history?.location?.state?.userid) return () => null; + if (Object.keys(ratings).length === 0 || !history?.location?.state?.userid) + return () => null; // when ratings is updated this call to recommendations will be called axiosWithAuth() From d757176ed68d2b9928e549365af60b7b8ecec6c8 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 15:00:47 -0600 Subject: [PATCH 179/822] updated dashboard test to have a useful unit test --- package.json | 1 + src/components/dashboard/dashboardv1.js | 17 ++++------------- src/components/dashboard/dashboardv1.test.js | 16 ++++++++++------ 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 8b15d31..f1a22fe 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "dotenv": "^8.2.0", + "history": "^4.10.1", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", "puppeteer": "^2.1.1", diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 5130ead..6b5cdd6 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -5,8 +5,6 @@ import { useHistory } from "react-router-dom"; // local imports import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; -// temp import to verify switch statement -import LoadingScreen from "../layout/LoadingScreen.js"; const Dashboardv1 = () => { let history = useHistory(); @@ -19,7 +17,6 @@ const Dashboardv1 = () => { // packages up form to make it able to send over https let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); - // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. axiosWithAuth() // this is insantiated when a file is added to input @@ -29,20 +26,18 @@ const Dashboardv1 = () => { } }) .then(res => { - console.log("ratings res: ", ratings); - // waiting to set ratings var for 10 seconds. + // waiting to set ratings var for 45 seconds. setTimeout(() => setRatings(res.data), 45 * 1000); }) .catch(err => { - console.log(err); + console.log(err); // --> I think these errors we should be sending to an error page. }); // clears out previous uploaded file data = new FormData(); }; useEffect(() => { - console.log("running useEffect!!!"); - console.log("history obj in useEffect: ", history); + // only if ratings has data in it, and the necessary parts of the history object to run the recommendations call if (Object.keys(ratings).length === 0 || !history?.location?.state?.userid) return () => null; @@ -50,8 +45,6 @@ const Dashboardv1 = () => { axiosWithAuth() .get(`/${history.location.state.userid}/recommendations`) .then(res => { - console.log("ran recommendations call."); - console.log("recommendations res: ", res); setRecommendations(res.data.recommendation_json); }) .catch(err => @@ -59,11 +52,9 @@ const Dashboardv1 = () => { ); }, [ratings, history]); - console.log("history obj before rendering: ", history); - console.log("ratings obj before attempting to render: ", ratings); switch (true) { case !history?.location?.state?.userid: - return ; + return (window.location.pathname = "/"); case !recommendations?.length: return (
diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 5f0fc91..3882f7e 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -1,20 +1,24 @@ import React from "react"; import { render } from "@testing-library/react"; +import { Router } from "react-router-dom"; import { getAllByTestId } from "../../utils/test-utils.js"; -import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import Dashboardv1 from "./Dashboardv1.js"; +import { createMemoryHistory } from "history"; + +it("renders dashboardv1 if there is a history object", () => { + let history = createMemoryHistory(); + const route = "/dashboard"; + let userid = 2394572390487239458732957324985723497; + history.push(route, { userid: userid }); -it("renders dashboardv1", () => { const { container } = render( - + ); - // currently have it set up so that if there is no user id it goes to loading screen. - // should change to login or a 403 or some thing else. - const component = getAllByTestId(container, "loading-screen"); + const component = getAllByTestId(container, "dashboard-screen"); expect(component.length).toBe(1); }); From 1264dce0f82e99b3e45573e3dd85117cf2557d75 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 15:12:58 -0600 Subject: [PATCH 180/822] added another paragraph to tell users the amount of time it takes and added a useful test for dashboard --- src/components/dashboard/dashboardv1.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 6b5cdd6..5fec13e 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -27,7 +27,7 @@ const Dashboardv1 = () => { }) .then(res => { // waiting to set ratings var for 45 seconds. - setTimeout(() => setRatings(res.data), 45 * 1000); + setTimeout(() => setRatings(res.data), 60 * 1000); }) .catch(err => { console.log(err); // --> I think these errors we should be sending to an error page. @@ -73,8 +73,11 @@ const Dashboardv1 = () => { {Object.keys(ratings).length === 0 ? (

- upload your letterboxd csv file here to get all past movie - ratings + Upload your letterboxd ZIP file here to get all past movie + ratings. +
+ After you upload, it should take a full minute to give you a + success message

) : (

From b630a90154c6e022a787a0c9e16b7116044cd714 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 5 Mar 2020 15:22:26 -0600 Subject: [PATCH 181/822] self review update --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 5fec13e..90bd7c5 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -12,7 +12,7 @@ const Dashboardv1 = () => { const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); - const changeHandler = async e => { + const changeHandler = e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https let data = new FormData(); From eae054f9e9826f9981cc414a98aad85268be72d2 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 5 Mar 2020 18:41:22 -0500 Subject: [PATCH 182/822] doing tests --- package-lock.json | 69 ++++++++++++++++++++++++++++ package.json | 3 ++ src/components/auth/login.js | 5 ++- src/components/auth/login.scss | 2 +- src/components/auth/login.test.js | 74 +++++++++++++++++++++++++------ src/store/actions/loginAction.js | 2 +- src/utils/test-utils.js | 15 +------ 7 files changed, 140 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d58bf9..e395834 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5329,6 +5329,47 @@ "pend": "~1.2.0" } }, + "fetch-mock": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.1.1.tgz", + "integrity": "sha512-v216/fXpLttuXZloT22T5mkOTmvHIHSienp3bCuUIN6QrBfw0Bdke4O6GFAHxPKRmUMwCKPgHI2jVJBzVndlDw==", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" + } + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -6637,6 +6678,11 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=" + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -8329,6 +8375,16 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8900,6 +8956,11 @@ "tslib": "^1.10.0" } }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -11402,6 +11463,14 @@ "deep-diff": "^0.3.5" } }, + "redux-mock-store": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz", + "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", + "requires": { + "lodash.isplainobject": "^4.0.6" + } + }, "redux-thunk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", diff --git a/package.json b/package.json index 8b15d31..5836be2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "dotenv": "^8.2.0", + "fetch-mock": "^9.1.1", + "node-fetch": "^2.6.0", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", "puppeteer": "^2.1.1", @@ -24,6 +26,7 @@ "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", + "redux-mock-store": "^1.5.4", "redux-thunk": "^2.3.0" }, "scripts": { diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 5729a12..e2fd0b9 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -6,6 +6,7 @@ import { connect } from "react-redux"; import { loginAction } from "../../store/actions/loginAction"; import "./login.scss"; import Groa2 from "../auth/Groa-logo-B2AA.png"; +import { ifDev } from "../../utils/removeAttribute.js"; class LoginPage extends React.Component { constructor(props) { @@ -68,7 +69,7 @@ class LoginPage extends React.Component { render() { const { errors } = this.state; return ( -

+
{/* Container - ENTIRE PAGE */}
@@ -128,7 +129,7 @@ class LoginPage extends React.Component {
- +
diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss index c2cf402..355ae18 100644 --- a/src/components/auth/login.scss +++ b/src/components/auth/login.scss @@ -111,7 +111,7 @@ .BtnContainer{ display: flex; justify-content: flex-end; -// justify-content: center; + } .BtnLoginWith{ diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 5b6b3e2..67d9131 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -1,26 +1,74 @@ import React from 'react'; -import { render } from '@testing-library/react'; - +import { Provider } from "react-redux"; +import { render, fireEvent } from '@testing-library/react'; import Login from './login'; -import { clikLogin } from "../../utils/test-utils"; +import { getAllByTestId } from "../../utils/test-utils"; +import { BrowserRouter as Router } from "react-router-dom"; +import { createStore, applyMiddleware } from "redux"; +import * as actions from "../../store/actions/loginAction"; +export const FETCHING_USER_LOGIN = "FETCHING_USER_LOGIN" +import fetchMock from 'fetch-mock' +import configureMockStore from 'redux-mock-store' +import thunk from 'redux-thunk'; + +const store = createStore( + (applyMiddleware) +); + +const middlewares = [thunk] +const mockStore = configureMockStore(middlewares) + +describe('async actions', () => { + afterEach(() => { + fetchMock.restore() + }) + + +it('creates FETCHING_USER_LOGIN_SUCCESS when fetching login', () => { + fetchMock.postOnce('/login', { + body: { user_name: 'test', password:'123456' }, + headers: { 'content-type': 'application/json' } + }) + + const expectedActions = [ + { type: actions.FETCHING_USER_LOGIN , body: { user_name: 'test', password:'123456' }}, + { type: actions.FETCHING_USER_LOGIN_SUCCESS } + ] + const store = mockStore({ user: [] }) + return store.dispatch(actions.loginAction.login('test', '123456')).then(() => { + // return of async actions + expect(store.getActions()).toEqual(expectedActions) + }) +}) +}) + +describe('login', () => { + fireEvent.click(getAllByTestId ("BtnLoginTest")) + expect(component.length).toBe(1); + expect +}) describe('Button', () => { it('should be defined', () => { expect(Login).toBeDefined(); }); +}) + +it("renders login component", () => { + const { container } = render( + + + + + + ); + + const component = getAllByTestId(container, "login"); + expect(component.length).toBe(1); +}); - it('should render correctly', () => { - const tree = ( - - ); - expect(tree).toMatchSnapshot(); - }); - }); - test('adds properly', () => { - expect(clikLogin.sum(0, 1)).toBe(1) -}) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 538b196..355f171 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -16,7 +16,7 @@ function login(username, password) { .then(res => { console.log(res) dispatch({ type: FETCHING_USER_LOGIN_SUCCESS }); - //history.push('/'); + }) .catch(err => { console.log(err) diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 5d4bc20..6f592af 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,17 +43,8 @@ export function getByTestId(...args) { return null; } -const clikPostLogin = { - sum: (a, b) => { - return a + b - } -} -const clikLogin = { - sum: (a, b) => { - return a + b - } -} + // re-export with overrides module.exports = { @@ -61,9 +52,7 @@ module.exports = { getByTestId, getAllByTestId, queryByTestId, - queryAllByTestId, - clikPostLogin, - clikLogin + queryAllByTestId }; //Login button clicked From 3da8849da1cd1c8b6187ae8ff92d92558e812eab Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 5 Mar 2020 19:28:23 -0500 Subject: [PATCH 183/822] added login reducer to index reducer file, added payload to action --- src/store/actions/loginAction.js | 2 +- src/store/reducers/index.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 355f171..3b45d69 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -15,7 +15,7 @@ function login(username, password) { (username, password) .then(res => { console.log(res) - dispatch({ type: FETCHING_USER_LOGIN_SUCCESS }); + dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data }); }) .catch(err => { diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 4a9e2b5..199bbda 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,8 +1,10 @@ import { combineReducers } from "redux"; import { watchListReducer } from "./watchListReducer.js"; import { dashboardMain } from "./dashboardMain.js"; +import { loginReducer } from './loginReducer'; export const reducer = combineReducers({ watchListReducer: watchListReducer, - dashboardMain: dashboardMain + dashboardMain: dashboardMain, + loginReducer: loginReducer }); From 69004b896caace258abc5c3ccc17e29f45792a20 Mon Sep 17 00:00:00 2001 From: cmruss Date: Fri, 6 Mar 2020 04:03:48 -0500 Subject: [PATCH 184/822] cleaned testing, removed extraneous dependencies --- package-lock.json | 87 +++++++------------------------ package.json | 3 -- src/components/auth/login.test.js | 53 +++++++------------ 3 files changed, 38 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index e395834..322ede2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2714,6 +2714,15 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -5329,47 +5338,6 @@ "pend": "~1.2.0" } }, - "fetch-mock": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.1.1.tgz", - "integrity": "sha512-v216/fXpLttuXZloT22T5mkOTmvHIHSienp3bCuUIN6QrBfw0Bdke4O6GFAHxPKRmUMwCKPgHI2jVJBzVndlDw==", - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^3.0.0", - "debug": "^4.1.1", - "glob-to-regexp": "^0.4.0", - "is-subset": "^0.1.1", - "lodash.isequal": "^4.5.0", - "path-to-regexp": "^2.2.1", - "querystring": "^0.2.0", - "whatwg-url": "^6.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "path-to-regexp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", - "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" - } - } - }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -5400,6 +5368,12 @@ "schema-utils": "^2.5.0" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "filesize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", @@ -6678,11 +6652,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=" - }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -7146,6 +7115,7 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -8375,16 +8345,6 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8956,11 +8916,6 @@ "tslib": "^1.10.0" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -11463,14 +11418,6 @@ "deep-diff": "^0.3.5" } }, - "redux-mock-store": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz", - "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", - "requires": { - "lodash.isplainobject": "^4.0.6" - } - }, "redux-thunk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", @@ -13703,6 +13650,7 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -14491,6 +14439,7 @@ "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, diff --git a/package.json b/package.json index 5836be2..8b15d31 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,6 @@ "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "dotenv": "^8.2.0", - "fetch-mock": "^9.1.1", - "node-fetch": "^2.6.0", "node-sass": "^4.13.1", "popular-movie-quotes": "^1.2.4", "puppeteer": "^2.1.1", @@ -26,7 +24,6 @@ "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", - "redux-mock-store": "^1.5.4", "redux-thunk": "^2.3.0" }, "scripts": { diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 67d9131..78b39d2 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -5,50 +5,17 @@ import Login from './login'; import { getAllByTestId } from "../../utils/test-utils"; import { BrowserRouter as Router } from "react-router-dom"; import { createStore, applyMiddleware } from "redux"; -import * as actions from "../../store/actions/loginAction"; -export const FETCHING_USER_LOGIN = "FETCHING_USER_LOGIN" -import fetchMock from 'fetch-mock' -import configureMockStore from 'redux-mock-store' -import thunk from 'redux-thunk'; const store = createStore( (applyMiddleware) ); -const middlewares = [thunk] -const mockStore = configureMockStore(middlewares) - -describe('async actions', () => { - afterEach(() => { - fetchMock.restore() - }) - - -it('creates FETCHING_USER_LOGIN_SUCCESS when fetching login', () => { - fetchMock.postOnce('/login', { - body: { user_name: 'test', password:'123456' }, - headers: { 'content-type': 'application/json' } - }) - - const expectedActions = [ - { type: actions.FETCHING_USER_LOGIN , body: { user_name: 'test', password:'123456' }}, - { type: actions.FETCHING_USER_LOGIN_SUCCESS } - ] - const store = mockStore({ user: [] }) - return store.dispatch(actions.loginAction.login('test', '123456')).then(() => { - // return of async actions - expect(store.getActions()).toEqual(expectedActions) - }) -}) -}) - describe('login', () => { fireEvent.click(getAllByTestId ("BtnLoginTest")) expect(component.length).toBe(1); expect }) - describe('Button', () => { it('should be defined', () => { expect(Login).toBeDefined(); @@ -66,6 +33,26 @@ it("renders login component", () => { const component = getAllByTestId(container, "login"); expect(component.length).toBe(1); + + it("calls onLogin when button clicked", () => { + const mockSubmit = jest.fn(); + + const component = enzyme.mount( + + + + + + ); + console.log(component.html()); + + component.find("#user_name").simulate('change', { target: { value: 'test_user' } }) + component.find("#password").simulate('change', { target: { value: 'test_password' } }) + component.find("form").simulate("submit"); + + console.log("onClickMock.mock", mockSubmit.mock) + expect(mockSubmit).toBeCalled() + }); }); From fb51449d581e293c66263320bbb375a6949a6ee8 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 6 Mar 2020 10:47:08 -0500 Subject: [PATCH 185/822] deletd const i wasnt using --- src/App.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index c421e29..433c556 100644 --- a/src/App.js +++ b/src/App.js @@ -32,9 +32,7 @@ function App() { useEffect(() => reactGAinitialization(), []); - const home = - const dash = - + return ( From 2829fe89c28a8d11c17dc44d270b329ee4cd21c2 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 6 Mar 2020 11:33:33 -0500 Subject: [PATCH 186/822] added import navigation path --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 86384f8..6329c9b 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -5,7 +5,7 @@ import { useHistory } from "react-router-dom"; // local imports import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; - +import Navigation from './navigation'; const Dashboardv1 = () => { let history = useHistory(); const [input] = useState({ file: "" }); From 5bf3c0f9095938535447cbdaaef290c5f7e94448 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 6 Mar 2020 11:47:08 -0500 Subject: [PATCH 187/822] fixed _Register scss file error --- src/components/auth/_Register.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 72a77b4..1737ed8 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -1,10 +1,6 @@ .container { font-family: Lato; min-height: 100vh; -<<<<<<< HEAD - //min-height: 100%; -======= ->>>>>>> 058f81acdd0305d2f2b5926da0c56b45cf92918a color: white; background-image: linear-gradient( to bottom, From 945d0e5b514bf7096824905758e9cb3974c464f7 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 6 Mar 2020 14:58:26 -0600 Subject: [PATCH 188/822] gave login props to update token --- src/App.js | 8 ++++++-- src/components/auth/login.js | 16 ++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/App.js b/src/App.js index 07dbf98..d78c8ed 100644 --- a/src/App.js +++ b/src/App.js @@ -33,11 +33,15 @@ function App() { return ( -
{token === null ? : } - + ( + + )} + /> { localStorage.setItem("token", res.data.token); + // updates token to refresh navbar + this.props.updateToken(localStorage.getItem("token")); //redirect to Groas dashboard page if (this.state.user.user_name && this.state.user.password) { - this.props.history.push("/dashboard", {userid: res.data.id}); + this.props.history.push("/dashboard", { userid: res.data.id }); } }) .catch(err => console.log(err)); @@ -72,9 +73,7 @@ class LoginPage extends React.Component {
{/* Container - ENTIRE PAGE */}
-
- -
+
@@ -129,7 +128,12 @@ class LoginPage extends React.Component {
- +
From a38bafea64cb8695faed5b3770ab1c18d8d82270 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 6 Mar 2020 18:36:50 -0500 Subject: [PATCH 189/822] fixed navbar issue we were having --- src/App.js | 14 ++++++++------ src/components/dashboard/_Navigation.scss | 2 -- src/components/dashboard/dashboardv1.js | 7 +++---- src/components/dashboard/navigation.js | 5 +++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/App.js b/src/App.js index 9c74169..cf24e63 100644 --- a/src/App.js +++ b/src/App.js @@ -5,8 +5,8 @@ import { ifDev } from "./utils/removeAttribute.js"; // local imports import PrivateRoute from "./utils/privateRoute.js"; import Dashboardv1 from "./components/dashboard/dashboardv1.js"; -//TOOK OUT Navigation in Dashboardv1 now. -// import Navigation from "./components/dashboard/navigation.js"; + +import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; import Login from "./components/auth/login"; @@ -41,15 +41,13 @@ function App() { {/* {token === null ? : } */} - + {/* */} ( )} /> - - {/* */} )} /> - + + + + + {/* */}
diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index aaf49e8..92465a3 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -1,7 +1,5 @@ .mainContainer { background: gray; - // display: flex; - // justify-content: space-between; padding: 1.1% 1%; .navContainer{ display: flex; diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 6329c9b..67bcb22 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -5,7 +5,7 @@ import { useHistory } from "react-router-dom"; // local imports import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; -import Navigation from './navigation'; + const Dashboardv1 = () => { let history = useHistory(); const [input] = useState({ file: "" }); @@ -53,12 +53,11 @@ const Dashboardv1 = () => { }, [ratings, history]); switch (true) { - case !history?.location?.state?.userid: - return (window.location.pathname = "/"); + case !recommendations?.length: return (
- +
{/* will create a component in the future*/}
diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index c506a8f..352efe0 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -37,8 +37,9 @@ class Navigation extends Component { Groa - - Diary + + {/* Diary */} + Dashboard From 079df531ea96389e112fe0bf6e4215f1006f7e17 Mon Sep 17 00:00:00 2001 From: cmruss Date: Sun, 8 Mar 2020 16:29:50 -0400 Subject: [PATCH 190/822] cleaned up code, refactored testing --- package.json | 3 +- src/App.js | 21 +++------- src/App.test.js | 38 +++++++++++++++---- src/components/auth/Register.js | 5 ++- src/components/auth/login.js | 9 +++-- src/components/auth/login.test.js | 37 +----------------- src/components/dashboard/dashboardv1.js | 1 - .../layout/nav-layouts/RegisterNavLinks.js | 4 +- 8 files changed, 49 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index f1a22fe..caee67a 100644 --- a/package.json +++ b/package.json @@ -47,5 +47,6 @@ "last 1 firefox version", "last 1 safari version" ] - } + }, + "devDependencies": {} } diff --git a/src/App.js b/src/App.js index cf24e63..f15dd1a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; +import { BrowserRouter as Router, Route } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; // local imports @@ -8,7 +8,6 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; -import RegisterNavLinks from "./components/layout/nav-layouts/RegisterNavLinks.js"; import Login from "./components/auth/login"; // config imports @@ -31,39 +30,29 @@ function App() { const [token, setToken] = useState(localStorage.getItem("token")); useEffect(() => reactGAinitialization(), []); - - - return (
- - - {/* {token === null ? : } */} - {/* */} ( - + )} /> ( - + )} /> - - - - {/* */} +
); } -export default App; +export default App; \ No newline at end of file diff --git a/src/App.test.js b/src/App.test.js index 46e8c4a..a7bc9c8 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,24 +1,46 @@ import React from "react"; -import { render } from "@testing-library/react"; -import { getAllByTestId } from "./utils/test-utils.js"; +import '@testing-library/jest-dom/extend-expect' +import { render, fireEvent } from "@testing-library/react"; +import { getByTestId, getAllByTestId } from "./utils/test-utils.js"; + + // component to be tested. import App from "./App.js"; +import Login from "../src/components/auth/login"; //creating a mock function to test if GA initialization was called. import reactGAinitialization from "./config/analytics.js"; +import login from "../src/components/auth/login"; + jest.mock("./config/analytics.js"); reactGAinitialization.mockImplementation(() => () => null); -it("renders App component", () => { +it("calls reactGAinitialization once", () => { + render(); + expect(reactGAinitialization).toBeCalled(); +}); + +it("renders App component, register component and register navigation component", () => { const { container } = render(); - const component = getAllByTestId(container, "App-component"); + let component = getAllByTestId(container, "App-component"); expect(component.length).toBe(1); -}); -it("calls reactGAinitialization once", () => { - render(); - expect(reactGAinitialization).toBeCalled(); + component = getAllByTestId(container, "register-component"); + expect(component.length).toBe(1); + + component = getAllByTestId(container, "register-nav-component"); + expect(component.length).toBe(1); }); +it("renders link to login which onClick renders login component", () => { + const { container } = render(); + + let link = getAllByTestId(container, "login-link"); + expect(link.length).toBe(1); + fireEvent.click(getByTestId(container, "login-link")) + + let component = getAllByTestId(container, "login-component"); + expect(component.length).toBe(1); +}); \ No newline at end of file diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 9ae9ab9..84d5048 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,5 +1,6 @@ import React from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { ifDev } from "../../utils/removeAttribute.js"; // styling imports import "./_Register.scss"; @@ -84,7 +85,7 @@ class Register extends React.Component { render() { const { user, submitted } = this.state; return ( -
+
@@ -178,4 +179,4 @@ class Register extends React.Component { } } -export default Register; +export default Register; \ No newline at end of file diff --git a/src/components/auth/login.js b/src/components/auth/login.js index b1bf085..994769e 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -26,7 +26,7 @@ class LoginPage extends React.Component { handleChange = e => { const { name, value } = e.target; let errors = this.state.errors; - e.preventDefault(); + // e.preventDefault(); this.setState({ user: { ...this.state.user, @@ -70,7 +70,7 @@ class LoginPage extends React.Component { render() { const { errors } = this.state; return ( -
+
{/* Container - ENTIRE PAGE */}
@@ -94,10 +94,10 @@ class LoginPage extends React.Component { className="input1" type="text" name="user_name" + id="user_name" value={this.user_name} onChange={this.handleChange} placeholder="Username or email required" - errorMessage="username required" /> {/* ERROR MESSAGE */} {errors.user_name.length > 0 && ( @@ -108,6 +108,7 @@ class LoginPage extends React.Component { className="input1" type="password" name="password" + id="password" value={this.password} onChange={this.handleChange} placeholder="Password" @@ -156,4 +157,4 @@ const mapStateToProps = state => { }; }; -export default connect(mapStateToProps, { loginAction })(LoginPage); +export default connect(mapStateToProps, { loginAction })(LoginPage); \ No newline at end of file diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 78b39d2..860b0b0 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -10,12 +10,6 @@ const store = createStore( (applyMiddleware) ); -describe('login', () => { - fireEvent.click(getAllByTestId ("BtnLoginTest")) - expect(component.length).toBe(1); - expect -}) - describe('Button', () => { it('should be defined', () => { expect(Login).toBeDefined(); @@ -30,33 +24,6 @@ it("renders login component", () => { ); - - const component = getAllByTestId(container, "login"); + const component = getAllByTestId(container, "login-component"); expect(component.length).toBe(1); - - it("calls onLogin when button clicked", () => { - const mockSubmit = jest.fn(); - - const component = enzyme.mount( - - - - - - ); - console.log(component.html()); - - component.find("#user_name").simulate('change', { target: { value: 'test_user' } }) - component.find("#password").simulate('change', { target: { value: 'test_password' } }) - component.find("form").simulate("submit"); - - console.log("onClickMock.mock", mockSubmit.mock) - expect(mockSubmit).toBeCalled() - }); -}); - - - - - - \ No newline at end of file +}); \ No newline at end of file diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 67bcb22..c081d05 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -53,7 +53,6 @@ const Dashboardv1 = () => { }, [ratings, history]); switch (true) { - case !recommendations?.length: return (
diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index abdb401..f8a5bbe 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -6,9 +6,9 @@ import "./RegisterNavLinks.scss"; export default function RegisterNavLinks() { return (
- + Log in
); -} +} \ No newline at end of file From 671fce523cc6fafebd49baa288ba413d3d2a472f Mon Sep 17 00:00:00 2001 From: cmruss Date: Sun, 8 Mar 2020 16:32:42 -0400 Subject: [PATCH 191/822] Still needs login and privateRoute testing --- src/App.test.js | 2 -- src/components/auth/login.test.js | 14 +++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/App.test.js b/src/App.test.js index a7bc9c8..435dc6b 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -3,8 +3,6 @@ import '@testing-library/jest-dom/extend-expect' import { render, fireEvent } from "@testing-library/react"; import { getByTestId, getAllByTestId } from "./utils/test-utils.js"; - - // component to be tested. import App from "./App.js"; import Login from "../src/components/auth/login"; diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 860b0b0..ffcb193 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -10,12 +10,6 @@ const store = createStore( (applyMiddleware) ); -describe('Button', () => { - it('should be defined', () => { - expect(Login).toBeDefined(); - }); -}) - it("renders login component", () => { const { container } = render( @@ -26,4 +20,10 @@ it("renders login component", () => { ); const component = getAllByTestId(container, "login-component"); expect(component.length).toBe(1); -}); \ No newline at end of file +}); + +describe('Button', () => { + it('should be defined', () => { + expect(Login).toBeDefined(); + }); +}) \ No newline at end of file From 1f95fc1becf3428a005eb0ca5cb0c1fbada8daaa Mon Sep 17 00:00:00 2001 From: cmruss Date: Mon, 9 Mar 2020 12:36:21 -0400 Subject: [PATCH 192/822] Removed unused code --- src/components/auth/_Register.scss | 7 -- src/components/auth/login.js | 1 - src/components/auth/register.scss | 120 ----------------------------- 3 files changed, 128 deletions(-) delete mode 100644 src/components/auth/register.scss diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 1737ed8..448e6f7 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -9,12 +9,7 @@ rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.85) ); - - // display: flex; - // flex-direction: row; - // justify-content: space-evenly; - .registerNav{ display: flex; justify-content: flex-end; @@ -25,7 +20,6 @@ display: flex; } - .boxLeft { width: 40%; margin: auto; @@ -98,5 +92,4 @@ justify-content: center; } } - } diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 994769e..2eed8bd 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -26,7 +26,6 @@ class LoginPage extends React.Component { handleChange = e => { const { name, value } = e.target; let errors = this.state.errors; - // e.preventDefault(); this.setState({ user: { ...this.state.user, diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss deleted file mode 100644 index 457678c..0000000 --- a/src/components/auth/register.scss +++ /dev/null @@ -1,120 +0,0 @@ -.container { - min-height: 100vh; - background-image: linear-gradient( - to bottom, - black 0%, - rgba(0, 0, 0, 0.9), - rgba(0, 0, 0, 0.7), - rgba(0, 0, 0, 0.85) - ); - - display: flex; - - .login-link { - color: white; - display: flex; - justify-content: flex-end; - padding: 3px 20px 3px 20px; - } - - .boxLeft { - height: 30%; - width: 50%; - padding: 1px 20px; - .logo { - height: 600px; - margin-left: 100px; - object-fit: contain; - } - } - - .box1 { - margin: -15% 2% 2% 0; - background: rgb(97, 97, 97); - width: 407px; - height: 436px; - padding: 15px; - } - - .box2 { - margin: -30% 0 0 40%; - color: black; - background: #c4c4c4; - width: 407px; - height: 288px; - font-size: 200%; - color: black; - padding-left: 25px; - } - - .boxRight { - display: flex; - justify-content: flex-end; - padding: 5%; - width: 50%; - h2 { - padding: 5px 10px 5px 10px; - } - } - .form { - display: flex; - flex-direction: column; - width: 518px; - height: 647px; - background: #ffffff; - } - - .form-control { - padding: 7px; - margin: 2% 12% 2% 12%; - border: 1px solid black; - border-radius: 4px; - } - .checkBox { - display: flex; - - .CheckB { - padding-top: 20px; - padding-right: 5px; - padding-left: 60px; - } - h5 { - display: flex; - justify-content: left; - } - } - h4 { - display: flex; - justify-content: center; - } - - .LogBtn { - margin: 2% 12% 2% 12%; - padding: 8px; - background: #7a7a7a; - border-radius: 4px; - color: white; - } - - .BottomLogin { - display: flex; - justify-content: flex-end; - - margin-left: 100px; - .LoginBtn { - margin: 4% 12% 0 0; - width: 115px; - height: 36px; - background: #21242c; - color: white; - border-radius: 4px; - margin-top: 100px; - } - } - - .callingError { - color: red; - display: flex; - justify-content: center; - } -} From 78c50f80332f14d8e7b646aab33dccc0a60b07f4 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 9 Mar 2020 13:25:50 -0500 Subject: [PATCH 193/822] setup routing --- src/App.js | 82 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 18 deletions(-) diff --git a/src/App.js b/src/App.js index f15dd1a..32af21a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { BrowserRouter as Router, Route } from "react-router-dom"; +import { Route } from "react-router-dom"; import { ifDev } from "./utils/removeAttribute.js"; // local imports @@ -19,6 +19,7 @@ import { createStore, compose, applyMiddleware } from "redux"; import thunk from "redux-thunk"; import logger from "redux-logger"; import { reducer } from "./store/reducers"; +import { BrowserRouter as Router } from "react-router-dom"; const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const store = createStore( @@ -28,31 +29,76 @@ const store = createStore( function App() { const [token, setToken] = useState(localStorage.getItem("token")); - useEffect(() => reactGAinitialization(), []); + const [userid, setUserid] = useState(); + useEffect(() => reactGAinitialization(), [userid]); + console.log("userid: ", userid); return (
- ( - - )} - /> - ( - - )} - /> - - + ( + + )} + /> + ( + + )} + /> + } + /> + + + token ? ( + <> + + + + ) : ( + + ) + } + />
); } -export default App; \ No newline at end of file +export default App; From 2e8b1668c08256e58d8d0a41859fc670f04138e6 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 9 Mar 2020 13:25:58 -0500 Subject: [PATCH 194/822] passed userid --- src/components/auth/Register.js | 21 ++-- .../auth/__snapshots__/login.test.js.snap | 7 -- src/components/auth/login.js | 8 +- src/components/dashboard/dashboardv1.test.js | 2 +- src/components/dashboard/navigation.js | 99 ++++++++++--------- 5 files changed, 70 insertions(+), 67 deletions(-) delete mode 100644 src/components/auth/__snapshots__/login.test.js.snap diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 84d5048..72a8fd1 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -65,11 +65,10 @@ class Register extends React.Component { const userid = res2.data.id; localStorage.setItem("token", res2.data.token); this.props.updateToken(localStorage.getItem("token")); - this.props.history.push( - "/dashboard", - { userid: userid }, - { pathname: "/dashboard" } - ); + this.props.updateUserid(res2.data.id); + this.props.history.push(`/${res2.data.id}/recommended`, { + userid: userid + }); }) .catch(err2 => { console.log(err2); @@ -86,8 +85,10 @@ class Register extends React.Component { const { user, submitted } = this.state; return (
-
-
+
+ +
+
groa logo
@@ -171,12 +172,12 @@ class Register extends React.Component {
{/* end box right */} -
- {/* END boxHolder */} +
+ {/* END boxHolder */}
//END CONTAINER ); } } -export default Register; \ No newline at end of file +export default Register; diff --git a/src/components/auth/__snapshots__/login.test.js.snap b/src/components/auth/__snapshots__/login.test.js.snap deleted file mode 100644 index 0c9de9e..0000000 --- a/src/components/auth/__snapshots__/login.test.js.snap +++ /dev/null @@ -1,7 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Button should render correctly 1`] = ` - -`; diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 2eed8bd..4821784 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -58,9 +58,13 @@ class LoginPage extends React.Component { localStorage.setItem("token", res.data.token); // updates token to refresh navbar this.props.updateToken(localStorage.getItem("token")); + // sets up userid in app + this.props.updateUserid(res.data.id); //redirect to Groas dashboard page if (this.state.user.user_name && this.state.user.password) { - this.props.history.push("/dashboard", { userid: res.data.id }); + this.props.history.push(`/${res.data.id}/recommended`, { + userid: res.data.id + }); } }) .catch(err => console.log(err)); @@ -156,4 +160,4 @@ const mapStateToProps = state => { }; }; -export default connect(mapStateToProps, { loginAction })(LoginPage); \ No newline at end of file +export default connect(mapStateToProps, { loginAction })(LoginPage); diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 3882f7e..38d41ae 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -9,8 +9,8 @@ import { createMemoryHistory } from "history"; it("renders dashboardv1 if there is a history object", () => { let history = createMemoryHistory(); - const route = "/dashboard"; let userid = 2394572390487239458732957324985723497; + const route = `/${userid}/recommended`; history.push(route, { userid: userid }); const { container } = render( diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 352efe0..2a99274 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -27,63 +27,68 @@ class Navigation extends Component { render() { return (
-
-
- - -
+
+
+ + +
-
- - Groa - - - {/* Diary */} - Dashboard - +
+ + Groa + - - Trending - + + Trending + - - Recommended - + + Recommended + - - Watchlist - + + Watchlist + - - Explore - -
+ + Explore + +
-
- - -
+
+ + +
-
- - +
+ + - - + + - - + + - - -
+ + +
{/* END navContainer */}
From 06f2b8aab2f211ae8bc4a5d84128b7e2df9a6f8e Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 9 Mar 2020 13:53:09 -0500 Subject: [PATCH 195/822] solved some testing issues, everyone should look at dashboardv1.test.js --- src/App.js | 6 +++--- src/App.test.js | 33 ++++++++++++++++++++------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/App.js b/src/App.js index 32af21a..d62c66b 100644 --- a/src/App.js +++ b/src/App.js @@ -32,7 +32,6 @@ function App() { const [userid, setUserid] = useState(); useEffect(() => reactGAinitialization(), [userid]); - console.log("userid: ", userid); return ( @@ -60,7 +59,8 @@ function App() { /> )} /> - ) : ( - () => null); @@ -20,12 +21,18 @@ it("calls reactGAinitialization once", () => { }); it("renders App component, register component and register navigation component", () => { - const { container } = render(); - - let component = getAllByTestId(container, "App-component"); - expect(component.length).toBe(1); - - component = getAllByTestId(container, "register-component"); + let history = createMemoryHistory(); + history.push("/register"); + const { container } = render( + + + + ); + + // let component = getAllByTestId(container, "App-component"); + // expect(component.length).toBe(1); + + let component = getAllByTestId(container, "register-component"); expect(component.length).toBe(1); component = getAllByTestId(container, "register-nav-component"); @@ -35,10 +42,10 @@ it("renders App component, register component and register navigation component" it("renders link to login which onClick renders login component", () => { const { container } = render(); - let link = getAllByTestId(container, "login-link"); + let link = getAllByTestId(container, "BtnLoginTest"); expect(link.length).toBe(1); - fireEvent.click(getByTestId(container, "login-link")) + fireEvent.click(getByTestId(container, "BtnLoginTest")); let component = getAllByTestId(container, "login-component"); - expect(component.length).toBe(1); -}); \ No newline at end of file + expect(component.length).toBe(1); +}); From 22a42c3f2d7ecca77c1e73b1329c55d0ffc9060c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 9 Mar 2020 15:13:18 -0500 Subject: [PATCH 196/822] changed home route to register fixed unit testing --- package-lock.json | 31 +++++++++++++++++++-------- package.json | 2 ++ src/App.js | 3 ++- src/App.test.js | 41 ++++++++++++++++++++++++++---------- src/components/auth/login.js | 2 ++ 5 files changed, 58 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 322ede2..6405f89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1914,9 +1914,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" } } }, @@ -7019,9 +7019,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "jsdom": { "version": "14.1.0", @@ -8345,6 +8345,11 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -11418,6 +11423,14 @@ "deep-diff": "^0.3.5" } }, + "redux-mock-store": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz", + "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", + "requires": { + "lodash.isplainobject": "^4.0.6" + } + }, "redux-thunk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", @@ -14222,9 +14235,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "cacache": { "version": "12.0.3", diff --git a/package.json b/package.json index caee67a..7f629c2 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", + "acorn": "^7.1.1", "axios": "^0.19.2", "dotenv": "^8.2.0", "history": "^4.10.1", @@ -25,6 +26,7 @@ "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", + "redux-mock-store": "^1.5.4", "redux-thunk": "^2.3.0" }, "scripts": { diff --git a/src/App.js b/src/App.js index d62c66b..583878e 100644 --- a/src/App.js +++ b/src/App.js @@ -86,7 +86,8 @@ function App() { ) : ( - () => null); @@ -20,7 +26,7 @@ it("calls reactGAinitialization once", () => { expect(reactGAinitialization).toBeCalled(); }); -it("renders App component, register component and register navigation component", () => { +it("renders register component and register navigation component when the route is directed to '/register'", () => { let history = createMemoryHistory(); history.push("/register"); const { container } = render( @@ -29,9 +35,6 @@ it("renders App component, register component and register navigation component" ); - // let component = getAllByTestId(container, "App-component"); - // expect(component.length).toBe(1); - let component = getAllByTestId(container, "register-component"); expect(component.length).toBe(1); @@ -39,13 +42,29 @@ it("renders App component, register component and register navigation component" expect(component.length).toBe(1); }); -it("renders link to login which onClick renders login component", () => { - const { container } = render(); +describe("login component", () => { + let store; + beforeEach(() => { + store = mockStore({ + myState: "sample test" + }); + }); + it("renders Login component when the application route is directed to '/login'", () => { + let history = createMemoryHistory(); + history.push("/login"); + const { container } = render( + + + + + + ); - let link = getAllByTestId(container, "BtnLoginTest"); - expect(link.length).toBe(1); - fireEvent.click(getByTestId(container, "BtnLoginTest")); + let link = getAllByTestId(container, "BtnLoginTest"); + expect(link.length).toBe(1); + fireEvent.click(getByTestId(container, "BtnLoginTest")); - let component = getAllByTestId(container, "login-component"); - expect(component.length).toBe(1); + let component = getAllByTestId(container, "login-component"); + expect(component.length).toBe(1); + }); }); diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 4821784..30b184a 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -1,5 +1,6 @@ import React from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth"; +import { Link } from "react-router-dom"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions/loginAction"; @@ -132,6 +133,7 @@ class LoginPage extends React.Component {
+ Already have an account? + + {/* {this.state.errors != null ?( +
try again
+ ):(
succes
)} */} +
From 77f6fe5d6c6e5d255a7099d14a7cf7b32728cab0 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 09:08:10 -0400 Subject: [PATCH 200/822] figured it out, login error validation working --- src/components/auth/Register.js | 4 +-- src/components/auth/login.js | 47 ++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 84d5048..9045677 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -108,9 +108,9 @@ class Register extends React.Component { onChange={this.handleChange} placeholder="Email" /> - {submitted && !user.email && ( + {/* {submitted && !user.email && (
Email is required
- )} + )} */}
{ e.preventDefault(); + this.setState({ submitted: true }); if (this.state.user.user_name && this.state.user.password) { axiosWithAuth() .post("/login", this.state.user) @@ -70,20 +71,21 @@ class LoginPage extends React.Component { .catch(err => console.log(err,'errr')); }else{ console.log('need user name') - const { name, value } = e.target; - let errors = this.state.errors; - switch (name) { + + // const { name, value } = e.target; + // let errors = this.state.errors; + // switch (name) { - case "user_name": - errors.user_name = value.length < 6 ? "User name must be 6 or more characters long" : ""; - break; - case "password": - errors.password = value.length < 6 ? "Password must be 6 or more characters long" : ""; - break; - default: - break; - } - this.setState({ errors, [name]: value }, () => {}); + // case "user_name": + // errors.user_name = value.length < 6 ? "User name must be 6 or more characters long" : ""; + // break; + // case "password": + // errors.password = value.length < 6 ? "Password must be 6 or more characters long" : ""; + // break; + // default: + // break; + // } + // this.setState({ errors, [name]: value }, () => {}); } @@ -91,7 +93,7 @@ class LoginPage extends React.Component { }; render() { - const { errors} = this.state; + const { errors,submitted} = this.state; return (
{/* Container - ENTIRE PAGE */} @@ -105,7 +107,8 @@ class LoginPage extends React.Component { {/* END BOX LEFT */}
- + +

Log in

- {/* ERROR MESSAGE */} - + {/* ERROR MESSAGES */} + {/* Submit Error */} + {submitted && !errors.user_name && ( +
Email is required
+ )} + {/* Length of username */} {errors.user_name && ( {errors.user_name} )} @@ -131,7 +138,11 @@ class LoginPage extends React.Component { onChange={this.handleChange} placeholder="Password" /> - + {/* Submit Error */} + {submitted && !errors.user_name && ( +
Password is required
+ )} + {/* Length of password */} {errors.password && ( {errors.password} )} From 6bed99ff3152ba7f71ce4f39558869084003ff94 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 09:09:43 -0400 Subject: [PATCH 201/822] added comments --- src/components/auth/login.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index da24eec..7849bc0 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -138,6 +138,7 @@ class LoginPage extends React.Component { onChange={this.handleChange} placeholder="Password" /> + {/* ERROR MESSAGES */} {/* Submit Error */} {submitted && !errors.user_name && (
Password is required
From cf02ba0f65fd486425aae73ec9e711c31cec87de Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 12:09:24 -0400 Subject: [PATCH 202/822] error validation fixed --- src/components/auth/Register.js | 4 ++-- src/components/auth/login.js | 35 ++++++------------------------- src/components/auth/login.test.js | 13 +++++++++++- 3 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 9045677..84d5048 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -108,9 +108,9 @@ class Register extends React.Component { onChange={this.handleChange} placeholder="Email" /> - {/* {submitted && !user.email && ( + {submitted && !user.email && (
Email is required
- )} */} + )}
console.log(err,'errr')); - }else{ - console.log('need user name') - - // const { name, value } = e.target; - // let errors = this.state.errors; - // switch (name) { - - // case "user_name": - // errors.user_name = value.length < 6 ? "User name must be 6 or more characters long" : ""; - // break; - // case "password": - // errors.password = value.length < 6 ? "Password must be 6 or more characters long" : ""; - // break; - // default: - // break; - // } - // this.setState({ errors, [name]: value }, () => {}); - - - } - + } }; render() { - const { errors,submitted} = this.state; + const { errors,submitted,user} = this.state; return (
{/* Container - ENTIRE PAGE */} @@ -121,7 +101,8 @@ class LoginPage extends React.Component { /> {/* ERROR MESSAGES */} {/* Submit Error */} - {submitted && !errors.user_name && ( + + {submitted && !user.user_name && (
Email is required
)} {/* Length of username */} @@ -140,12 +121,12 @@ class LoginPage extends React.Component { /> {/* ERROR MESSAGES */} {/* Submit Error */} - {submitted && !errors.user_name && ( + {submitted && !user.user_name && (
Password is required
)} {/* Length of password */} {errors.password && ( - {errors.password} + {errors.password} )}
@@ -166,10 +147,6 @@ class LoginPage extends React.Component { Log in - {/* {this.state.errors != null ?( -
try again
- ):(
succes
)} */} -
diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index ffcb193..1f9f81d 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -26,4 +26,15 @@ describe('Button', () => { it('should be defined', () => { expect(Login).toBeDefined(); }); -}) \ No newline at end of file +}) + +it("renders errors to login on Click if info not filled out", () => { + const { container } = render(); + + let link = getAllByTestId(container, "BtnLoginTest"); + expect(link.length).toBe(1); + fireEvent.click(getByTestId(container, "BtnLoginTest")) + + let component = getAllByTestId(container, "login-component"); + expect(component.length).toBe(1); +}); \ No newline at end of file From cd1b38f087aeb8240035eb6daba72d13ba32f317 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 11:19:53 -0500 Subject: [PATCH 203/822] changed / path to only go to register for now --- src/App.js | 68 +++++++++---------------- src/App.test.js | 4 +- src/components/dashboard/dashboardv1.js | 16 +++--- 3 files changed, 34 insertions(+), 54 deletions(-) diff --git a/src/App.js b/src/App.js index 583878e..5f702c5 100644 --- a/src/App.js +++ b/src/App.js @@ -1,15 +1,14 @@ import React, { useState, useEffect } from "react"; import { Route } from "react-router-dom"; -import { ifDev } from "./utils/removeAttribute.js"; // local imports import PrivateRoute from "./utils/privateRoute.js"; import Dashboardv1 from "./components/dashboard/dashboardv1.js"; - import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; - +// for testing +import { ifDev } from "./utils/removeAttribute.js"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -28,37 +27,15 @@ const store = createStore( ); function App() { - const [token, setToken] = useState(localStorage.getItem("token")); + const [hasToken, setHasToken] = useState(localStorage.getItem("token")); const [userid, setUserid] = useState(); useEffect(() => reactGAinitialization(), [userid]); + console.log(userid); return (
- ( - - )} - /> - ( - - )} - /> {/* this is fine as a route because all of the routes that will have display their component will only be avalible on a private route */} + ( + + )} + /> - token ? ( - <> - - - - ) : ( - // Register for presentation - - ) - } + path={["/", "/register"]} + render={props => ( + + )} />
diff --git a/src/App.test.js b/src/App.test.js index df3b7e9..aaa5882 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -69,11 +69,12 @@ describe("login component", () => { }); }); +// test became obsolte when I changed the Groa link to go to /:userid/recommended it("renders navigation and recommendation components when pathname is '/:userid/recommended and a token is in localStorage", () => { let history = createMemoryHistory(); let userid = 6485746; history.push(`/${userid}/recommended`); - localStorage.setItem("token", "buttons"); + localStorage.setItem("token", "randomtestword"); const { container } = render( @@ -81,6 +82,7 @@ it("renders navigation and recommendation components when pathname is '/:userid/ ); + console.log(window.location.pathname); let component = getAllByTestId(container, "navigation"); expect(component.length).toBe(1); diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index c081d05..e7c08f8 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -1,17 +1,17 @@ import React, { useState, useEffect } from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; -import { useHistory } from "react-router-dom"; // local imports import "./_Dashboard.scss"; import MovieCard from "../movies/MovieCard.js"; -const Dashboardv1 = () => { - let history = useHistory(); +const Dashboardv1 = props => { const [input] = useState({ file: "" }); const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); + let userid = props.match.params.id; + const changeHandler = e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https @@ -20,7 +20,7 @@ const Dashboardv1 = () => { // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. axiosWithAuth() // this is insantiated when a file is added to input - .post(`/${history.location.state.userid}/uploading`, data, { + .post(`/${userid}/uploading`, data, { headers: { "Content-Type": "multipart/form-data" } @@ -38,25 +38,23 @@ const Dashboardv1 = () => { useEffect(() => { // only if ratings has data in it, and the necessary parts of the history object to run the recommendations call - if (Object.keys(ratings).length === 0 || !history?.location?.state?.userid) - return () => null; + if (Object.keys(ratings).length === 0 || !userid) return () => null; // when ratings is updated this call to recommendations will be called axiosWithAuth() - .get(`/${history.location.state.userid}/recommendations`) + .get(`/${userid}/recommendations`) .then(res => { setRecommendations(res.data.recommendation_json); }) .catch(err => console.log("Something went wrong in fetching recommendations.", err) ); - }, [ratings, history]); + }, [ratings, userid]); switch (true) { case !recommendations?.length: return (
-
{/* will create a component in the future*/}
From 3be3ea031dca6680708df0f3dbca062e62c765ce Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 11:35:47 -0500 Subject: [PATCH 204/822] all test are functional --- src/App.js | 1 - src/App.test.js | 34 ++++++++------------ src/components/dashboard/dashboardv1.test.js | 7 ++-- src/utils/test-utils.js | 4 --- 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/App.js b/src/App.js index 5f702c5..55cb8e1 100644 --- a/src/App.js +++ b/src/App.js @@ -31,7 +31,6 @@ function App() { const [userid, setUserid] = useState(); useEffect(() => reactGAinitialization(), [userid]); - console.log(userid); return ( diff --git a/src/App.test.js b/src/App.test.js index aaa5882..057b815 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -42,6 +42,19 @@ it("renders register component and register navigation component when the route expect(component.length).toBe(1); }); +// test became obsolte when I changed the Groa link to go to /:userid/recommended +it("renders navigation and recommendation components when pathname is '/:userid/recommended and a token is in localStorage", () => { + let history = createMemoryHistory(); + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "register-nav-component"); + expect(component.length).toBe(1); +}); + describe("login component", () => { let store; beforeEach(() => { @@ -68,24 +81,3 @@ describe("login component", () => { expect(component.length).toBe(1); }); }); - -// test became obsolte when I changed the Groa link to go to /:userid/recommended -it("renders navigation and recommendation components when pathname is '/:userid/recommended and a token is in localStorage", () => { - let history = createMemoryHistory(); - let userid = 6485746; - history.push(`/${userid}/recommended`); - localStorage.setItem("token", "randomtestword"); - - const { container } = render( - - - - ); - - console.log(window.location.pathname); - let component = getAllByTestId(container, "navigation"); - expect(component.length).toBe(1); - - component = getAllByTestId(container, "dashboard-screen"); - expect(component.length).toBe(1); -}); diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 38d41ae..48ae14e 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -1,6 +1,6 @@ import React from "react"; import { render } from "@testing-library/react"; -import { Router } from "react-router-dom"; +import { Router, Route } from "react-router-dom"; import { getAllByTestId } from "../../utils/test-utils.js"; // component to be tested. @@ -8,14 +8,13 @@ import Dashboardv1 from "./Dashboardv1.js"; import { createMemoryHistory } from "history"; it("renders dashboardv1 if there is a history object", () => { - let history = createMemoryHistory(); let userid = 2394572390487239458732957324985723497; const route = `/${userid}/recommended`; - history.push(route, { userid: userid }); + let history = createMemoryHistory({ initialEntries: [route] }); const { container } = render( - + ); diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 6f592af..76f629d 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,9 +43,6 @@ export function getByTestId(...args) { return null; } - - - // re-export with overrides module.exports = { ...domTestingLib, @@ -56,4 +53,3 @@ module.exports = { }; //Login button clicked - From 5df0921cb7f3400010e26a300a768df0c642b865 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 12:38:52 -0400 Subject: [PATCH 205/822] created tests for error messages --- src/components/auth/login.js | 4 ++-- src/components/auth/login.test.js | 26 +++++++++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index ace0516..6d1a215 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -86,7 +86,7 @@ class LoginPage extends React.Component {
{/* END BOX LEFT */}
- +

Log in

@@ -107,7 +107,7 @@ class LoginPage extends React.Component { )} {/* Length of username */} {errors.user_name && ( - {errors.user_name} + {errors.user_name} )} { }) it("renders errors to login on Click if info not filled out", () => { - const { container } = render(); + const { container } = render( + + + + + + ); + + + + let form = getAllByTestId(container, "loginForm"); + expect(form.length).toBe(1); + fireEvent.submit(getByTestId(container, "loginForm")) - let link = getAllByTestId(container, "BtnLoginTest"); - expect(link.length).toBe(1); - fireEvent.click(getByTestId(container, "BtnLoginTest")) + let component = getAllByText(container, "Email is required"); + expect(component.length).toBe(1); - let component = getAllByTestId(container, "login-component"); + component = getAllByText(container, "Password is required"); expect(component.length).toBe(1); -}); \ No newline at end of file +}); + From be38aa9267e65ef2cd51cf07435efa5bdad98195 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 11:39:46 -0500 Subject: [PATCH 206/822] missed updating the test description --- src/components/dashboard/dashboardv1.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js index 48ae14e..3583c17 100644 --- a/src/components/dashboard/dashboardv1.test.js +++ b/src/components/dashboard/dashboardv1.test.js @@ -7,7 +7,7 @@ import { getAllByTestId } from "../../utils/test-utils.js"; import Dashboardv1 from "./Dashboardv1.js"; import { createMemoryHistory } from "history"; -it("renders dashboardv1 if there is a history object", () => { +it("renders dashboardv1 component on the path '/:userid/recommendations", () => { let userid = 2394572390487239458732957324985723497; const route = `/${userid}/recommended`; let history = createMemoryHistory({ initialEntries: [route] }); From 41259eb9eeaf51d66fe884fc2ccf3c346107fddf Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 11:48:32 -0500 Subject: [PATCH 207/822] removed miragejs as we're not using it --- package-lock.json | 195 ---------------------------------------------- package.json | 1 - 2 files changed, 196 deletions(-) diff --git a/package-lock.json b/package-lock.json index 441794f..657f4d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1295,12 +1295,6 @@ "@types/yargs": "^13.0.0" } }, - "@miragejs/pretender-node-polyfill": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz", - "integrity": "sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==", - "dev": true - }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -5271,12 +5265,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "fake-xml-http-request": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz", - "integrity": "sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -6291,12 +6279,6 @@ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, - "inflected": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.0.4.tgz", - "integrity": "sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8363,131 +8345,17 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.compact": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.compact/-/lodash.compact-3.0.1.tgz", - "integrity": "sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU=", - "dev": true - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.forin": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-4.4.0.tgz", - "integrity": "sha1-XT8grlZAEfvog4H32YlJyclRlzE=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", - "dev": true - }, - "lodash.invokemap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", - "integrity": "sha1-F0jNpdiw74NpxOs+xUwh/rofLWI=", - "dev": true - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, - "lodash.lowerfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz", - "integrity": "sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0=", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -8515,18 +8383,6 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "lodash.values": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", - "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=", - "dev": true - }, "loglevel": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", @@ -8898,40 +8754,6 @@ "minipass": "^3.0.0" } }, - "miragejs": { - "version": "0.1.35", - "resolved": "https://registry.npmjs.org/miragejs/-/miragejs-0.1.35.tgz", - "integrity": "sha512-JxkOxkWcDkzUiHDKWT+7aVJX0rqJqyIHTB+SSWtwr3k6EY86ETKH1aIe7kpNL3WfM+fCQbV24bcJ1Ei5a8dldQ==", - "dev": true, - "requires": { - "@miragejs/pretender-node-polyfill": "^0.1.0", - "inflected": "^2.0.4", - "lodash.assign": "^4.2.0", - "lodash.camelcase": "^4.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.compact": "^3.0.1", - "lodash.find": "^4.6.0", - "lodash.flatten": "^4.4.0", - "lodash.forin": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.has": "^4.5.2", - "lodash.invokemap": "^4.6.0", - "lodash.isempty": "^4.4.0", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isinteger": "^4.0.4", - "lodash.isplainobject": "^4.0.6", - "lodash.lowerfirst": "^4.3.1", - "lodash.map": "^4.6.0", - "lodash.mapvalues": "^4.6.0", - "lodash.pick": "^4.4.0", - "lodash.snakecase": "^4.1.1", - "lodash.uniq": "^4.5.0", - "lodash.uniqby": "^4.7.0", - "lodash.values": "^4.3.0", - "pretender": "3.3.1" - } - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -10874,17 +10696,6 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, - "pretender": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/pretender/-/pretender-3.3.1.tgz", - "integrity": "sha512-fFtl0bfW1ay6zMGqok2Lkhpz8yjm8Pdk+fsQAX+Aeqw0LKZNaDs2VQt8qEKTNWvs5UKVUwNfcuHjVmuG7rZKhQ==", - "dev": true, - "requires": { - "fake-xml-http-request": "^2.1.1", - "route-recognizer": "^0.3.3", - "whatwg-fetch": "^3.0.0" - } - }, "pretty-bytes": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", @@ -12004,12 +11815,6 @@ "inherits": "^2.0.1" } }, - "route-recognizer": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz", - "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==", - "dev": true - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", diff --git a/package.json b/package.json index 91e6863..295f5b8 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ }, "devDependencies": { "history": "^4.10.1", - "miragejs": "^0.1.35", "redux-mock-store": "^1.5.4" } } From 02ffb4d2cf8bc6775baf3afa1007cdba0441e4b2 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 12:52:38 -0400 Subject: [PATCH 208/822] fixed error validation on password --- src/components/auth/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 6d1a215..eac418d 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -121,7 +121,7 @@ class LoginPage extends React.Component { /> {/* ERROR MESSAGES */} {/* Submit Error */} - {submitted && !user.user_name && ( + {submitted && !user.password && (
Password is required
)} {/* Length of password */} From 1a33067f4ec85da38f0066c43a5d7778a615b23c Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 11:58:05 -0500 Subject: [PATCH 209/822] commented changes --- src/components/auth/Register.js | 5 +---- src/components/auth/login.js | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 72a8fd1..7bbe37b 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -62,13 +62,10 @@ class Register extends React.Component { axiosWithAuth() .post("https://api.groa.us/api/users/login", user) .then(res2 => { - const userid = res2.data.id; localStorage.setItem("token", res2.data.token); this.props.updateToken(localStorage.getItem("token")); this.props.updateUserid(res2.data.id); - this.props.history.push(`/${res2.data.id}/recommended`, { - userid: userid - }); + this.props.history.push(`/${res2.data.id}/recommended`); }) .catch(err2 => { console.log(err2); diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 30b184a..4fc065a 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -63,9 +63,7 @@ class LoginPage extends React.Component { this.props.updateUserid(res.data.id); //redirect to Groas dashboard page if (this.state.user.user_name && this.state.user.password) { - this.props.history.push(`/${res.data.id}/recommended`, { - userid: res.data.id - }); + this.props.history.push(`/${res.data.id}/recommended`); } }) .catch(err => console.log(err)); From b19949e769e924bc46d79a1e3af9b8a8fe9858f1 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 12:03:02 -0500 Subject: [PATCH 210/822] missed testing comment --- src/App.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/App.test.js b/src/App.test.js index 057b815..d7d2a50 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -42,7 +42,6 @@ it("renders register component and register navigation component when the route expect(component.length).toBe(1); }); -// test became obsolte when I changed the Groa link to go to /:userid/recommended it("renders navigation and recommendation components when pathname is '/:userid/recommended and a token is in localStorage", () => { let history = createMemoryHistory(); const { container } = render( From b66dcef2bdccd383e84698bcf3cfd247432d51f8 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 13:07:12 -0400 Subject: [PATCH 211/822] tests and error validation done --- src/components/auth/login.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index eac418d..1cbbe49 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -9,7 +9,6 @@ import { ifDev } from "../../utils/removeAttribute.js"; - class LoginPage extends React.Component { constructor(props) { super(props); @@ -88,7 +87,6 @@ class LoginPage extends React.Component {
-

Log in

Date: Tue, 10 Mar 2020 12:23:54 -0500 Subject: [PATCH 212/822] found an error for userid --- src/components/dashboard/dashboardv1.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index e7c08f8..c3aba14 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -10,8 +10,7 @@ const Dashboardv1 = props => { const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); - let userid = props.match.params.id; - + let { userid } = props.match.params; const changeHandler = e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https From ac0e25f167bf3ae64693f0762e5b99bb5a1c50ac Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 12:25:33 -0500 Subject: [PATCH 213/822] updated link to register from login component --- src/components/auth/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 4fc065a..8ddc181 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -131,7 +131,7 @@ class LoginPage extends React.Component {
- Already have an account? + Don't have an account?
)} - +
Username is required
)} + {submitted && user.user_name.length < 6 && ( +
Username is required to be 6 characters or more
+ )} + + {errorStatus && user.user_name && ( +
Username is already in use
+ )} +
Password is required
)} + {submitted && user.password.length < 6 && ( +
Password is required to be 6 characters or more
+ )}
- {submitted && !user.confirmpassword && ( -
Confirm Password is required
+ {submitted && user.confirmpassword !== user.password && ( +
Passwords do not match
)}
From 96a3b45ddd473d4718bc5fac9b5fb6b3113ca682 Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 10 Mar 2020 13:37:13 -0700 Subject: [PATCH 217/822] added testing to the register form validation --- src/components/auth/Register.js | 3 ++- src/components/auth/register.test.js | 38 ++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index bcb0941..43bedae 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -8,6 +8,7 @@ import GroaWhite from "./GroaWhite.png"; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; + class Register extends React.Component { constructor(props) { super(props); @@ -93,7 +94,7 @@ class Register extends React.Component { groa logo
- +

Register

{/* divs with changing classnames updates error handling for form */}
{ - const { container } = render(); - const component = getAllByTestId(container, "Register-component"); + const { container } = render( + + + + ); + const component = getAllByTestId(container, "register-component"); + expect(component.length).toBe(1); +}); + + + +it("renders errors to register on Click if info not filled out", () => { + const { container } = render( + + + + ); + + let form = getAllByTestId(container, "registerForm"); + expect(form.length).toBe(1); + + fireEvent.submit(getByTestId(container, "registerForm")) + let component = getAllByText(container, "Email is required"); + expect(component.length).toBe(1); + + component = getAllByText(container, "Password is required"); expect(component.length).toBe(1); + + component = getAllByText(container, "Username is required"); + expect(component.length).toBe(1); }); \ No newline at end of file From 1b710f6f0aa1f56d6ee865731ce3c35930df4039 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Tue, 10 Mar 2020 16:50:34 -0400 Subject: [PATCH 218/822] add invalid credential error to username --- src/components/auth/login.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 5414306..0468b89 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -23,6 +23,7 @@ class LoginPage extends React.Component { password: "" }, submitted: false, + errorStatus: false, }; } @@ -67,12 +68,14 @@ class LoginPage extends React.Component { //redirect to Groas dashboard page this.props.history.push("/dashboard", { userid: res.data.id }); }) - .catch(err => console.log(err,'errr')); + .catch(err => {console.log(err.response.data.errorMessage,'errr') + this.setState({errorStatus : true}) + }); } }; render() { - const { errors,submitted,user} = this.state; + const { errors,submitted,user,errorStatus} = this.state; return (
{/* Container - ENTIRE PAGE */} @@ -100,6 +103,10 @@ class LoginPage extends React.Component { {/* ERROR MESSAGES */} {/* Submit Error */} + {errorStatus && user.user_name && ( +
Invalid Credentials
+ )} + {submitted && !user.user_name && (
Username is required
)} From 61959cffbe90f27c61b5c1d6600134f929d81543 Mon Sep 17 00:00:00 2001 From: marielapg Date: Tue, 10 Mar 2020 14:04:36 -0700 Subject: [PATCH 219/822] creating confirmation to the inputs before posting --- src/components/auth/Register.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 43bedae..61fb4f0 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -49,9 +49,9 @@ class Register extends React.Component { this.setState({ submitted: true }); if ( this.state.user.email && - this.state.user.user_name && - this.state.user.password && - this.state.user.confirmpassword + this.state.user.user_name.length >= 6 && + this.state.user.password.length >= 6 && + this.state.user.confirmpassword === this.state.user.password ) { axiosWithAuth() .post("https://api.groa.us/api/users/register", user) From 8b8ae2948c79048e450ee608688042ece0f1c223 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Tue, 10 Mar 2020 18:32:56 -0500 Subject: [PATCH 220/822] hidden unused tabs --- src/components/dashboard/_Navigation.scss | 98 ++++++++++----------- src/components/dashboard/navigation.js | 100 ++++++++++++---------- 2 files changed, 103 insertions(+), 95 deletions(-) diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index 92465a3..138701a 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -1,63 +1,65 @@ .mainContainer { background: gray; padding: 1.1% 1%; - .navContainer{ + .navContainer { display: flex; justify-content: space-between; - - - - .Bars { - padding-top: 5px; - .bars-icon { - color: white; - font-size: 1.4rem; - } - } - - .Links { - width: 60%; - display: flex; - justify-content: space-evenly; - padding-top: 7px; - .Groa-NavLink{ - color: white; - font-weight: 600; - text-decoration: none; - - &:hover { - color: rebeccapurple; - text-decoration: underline; + .Bars { + padding-top: 5px; + .bars-icon { + color: white; + font-size: 1.4rem; } } - .NavLink { - color: white; - text-decoration: none; - &:hover { - color: rebeccapurple; - text-decoration: underline; + + .Links { + width: 60%; + display: flex; + justify-content: space-evenly; + padding-top: 7px; + + .Groa-NavLink { + color: white; + font-weight: 600; + text-decoration: none; + + &:hover { + color: rebeccapurple; + text-decoration: underline; + } + } + .NavLink { + color: white; + text-decoration: none; + &:hover { + color: rebeccapurple; + text-decoration: underline; + } } } - } - .searchContainer { - width: 11.5%; - display: flex; - justify-content: space-between; - } + .searchContainer { + width: 11.5%; + display: flex; + justify-content: space-between; + } - .searchBox{ - padding: 7px; - border-radius: 5px; + .searchBox { + padding: 7px; + border-radius: 5px; + } + .fa-icons { + padding-top: 5px; + width: 14%; + display: flex; + justify-content: space-between; + font-size: 1.4rem; + color: white; + } } - .fa-icons { - padding-top: 5px; - width: 14%; - display: flex; - justify-content: space-between; - font-size: 1.4rem; - color: white; + .hidden, + .searchContainer.hidden { + display: none; } - } } diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 352efe0..c8b0117 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -27,63 +27,69 @@ class Navigation extends Component { render() { return (
-
-
- - -
+
+
+ + +
-
- - Groa - - - {/* Diary */} - Dashboard - +
+ + Groa + + + {/* Diary */} + Dashboard + - - Trending - + + Trending + - - Recommended - + + Recommended + - - Watchlist - + + Watchlist + - - Explore - -
+ + Explore + +
-
- - -
+
+ + +
-
- - +
+ + - - + + - - + + - - -
+ + +
{/* END navContainer */}
From 89bc857507cc9de89330dae77a9db52329f6f717 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 10:42:14 -0500 Subject: [PATCH 221/822] updated login test to match previous changes --- src/components/auth/login.js | 85 +++++++++++++++---------------- src/components/auth/login.test.js | 45 ++++++++-------- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/src/components/auth/login.js b/src/components/auth/login.js index b764031..5cb18ec 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -8,8 +8,6 @@ import "./login.scss"; import Groa2 from "../auth/Groa-logo-B2AA.png"; import { ifDev } from "../../utils/removeAttribute.js"; - - class LoginPage extends React.Component { constructor(props) { super(props); @@ -24,28 +22,28 @@ class LoginPage extends React.Component { password: "" }, submitted: false, - errorStatus: false, + errorStatus: false }; } handleChange = e => { const { name, value } = e.target; let errors = this.state.errors; - + this.setState({ user: { ...this.state.user, [e.target.name]: e.target.value - }, - + } }); switch (name) { - case "user_name": - errors.user_name = value.length < 6 ? "User name must be 6 or more characters long" : ""; + errors.user_name = + value.length < 6 ? "User name must be 6 or more characters long" : ""; break; case "password": - errors.password = value.length < 6 ? "Password must be 6 or more characters long" : ""; + errors.password = + value.length < 6 ? "Password must be 6 or more characters long" : ""; break; default: break; @@ -54,37 +52,30 @@ class LoginPage extends React.Component { this.setState({ errors, [name]: value }, () => {}); }; - - loginUser = e => { e.preventDefault(); this.setState({ submitted: true }); if (this.state.user.user_name && this.state.user.password) { axiosWithAuth() - .post("/login", this.state.user) - .then(res => { - localStorage.setItem("token", res.data.token); - // updates token to refresh navbar - this.props.updateToken(localStorage.getItem("token")); - // sets up userid in app - this.props.updateUserid(res.data.id); - //redirect to Groas dashboard page -<<<<<<< HEAD - if (this.state.user.user_name && this.state.user.password) { + .post("/login", this.state.user) + .then(res => { + localStorage.setItem("token", res.data.token); + // updates token to refresh navbar + this.props.updateToken(localStorage.getItem("token")); + // sets up userid in app + this.props.updateUserid(res.data.id); + //redirect to Groas dashboard page this.props.history.push(`/${res.data.id}/recommended`); - } -======= - this.props.history.push("/dashboard", { userid: res.data.id }); ->>>>>>> d2ef72b5a2665e03e9672658ade3eebccd055de6 - }) - .catch(err => {console.log(err.response.data.errorMessage,'errr') - this.setState({errorStatus : true}) - }); - } + }) + .catch(err => { + console.log(err.response.data.errorMessage, "errr"); + this.setState({ errorStatus: true }); + }); + } }; render() { - const { errors,submitted,user,errorStatus} = this.state; + const { errors, submitted, user, errorStatus } = this.state; return (
{/* Container - ENTIRE PAGE */} @@ -97,8 +88,11 @@ class LoginPage extends React.Component {
{/* END BOX LEFT */}
- - +

Log in

{/* ERROR MESSAGES */} - {/* Submit Error */} - + {/* Submit Error */} + {errorStatus && user.user_name && ( -
Invalid Credentials
+
Invalid Credentials
)} {submitted && !user.user_name && ( -
Username is required
+
Username is required
)} - {/* Length of username */} + {/* Length of username */} {errors.user_name && ( - {errors.user_name} + + {errors.user_name} + )} {/* ERROR MESSAGES */} - {/* Submit Error */} + {/* Submit Error */} {submitted && !user.password && ( -
Password is required
+
Password is required
)} - {/* Length of password */} + {/* Length of password */} {errors.password && ( - {errors.password} + + {errors.password} + )}
@@ -161,7 +159,6 @@ class LoginPage extends React.Component { > Log in -
diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index de5b79a..46eb1fb 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -1,52 +1,51 @@ -import React from 'react'; +import React from "react"; import { Provider } from "react-redux"; -import { render, fireEvent } from '@testing-library/react'; -import Login from './login'; -import { getAllByTestId, getByTestId, getAllByText } from "../../utils/test-utils"; +import { render, fireEvent } from "@testing-library/react"; +import Login from "./login"; +import { + getAllByTestId, + getByTestId, + getAllByText +} from "../../utils/test-utils"; import { BrowserRouter as Router } from "react-router-dom"; import { createStore, applyMiddleware } from "redux"; -const store = createStore( - (applyMiddleware) -); +const store = createStore(applyMiddleware); it("renders login component", () => { const { container } = render( - - - + + + ); const component = getAllByTestId(container, "login-component"); expect(component.length).toBe(1); }); -describe('Button', () => { - it('should be defined', () => { +describe("Button", () => { + it("should be defined", () => { expect(Login).toBeDefined(); }); -}) +}); it("renders errors to login on Click if info not filled out", () => { const { container } = render( - - - + + + ); - - let form = getAllByTestId(container, "loginForm"); expect(form.length).toBe(1); - fireEvent.submit(getByTestId(container, "loginForm")) + fireEvent.submit(getByTestId(container, "loginForm")); - let component = getAllByText(container, "Email is required"); - expect(component.length).toBe(1); + let component = getAllByText(container, "Username is required"); + expect(component.length).toBe(1); component = getAllByText(container, "Password is required"); - expect(component.length).toBe(1); + expect(component.length).toBe(1); }); - From 2feefe76752921fca84e2ed1fd5d86494229e5da Mon Sep 17 00:00:00 2001 From: marielapg Date: Wed, 11 Mar 2020 08:56:06 -0700 Subject: [PATCH 222/822] updated the changes from github --- .env | 1 - src/components/auth/Register.js | 1 - src/components/auth/register.scss | 112 ----------------------- src/components/dashboard/index.js | 22 ----- src/components/dashboard/navigation.scss | 67 -------------- 5 files changed, 203 deletions(-) delete mode 100644 .env delete mode 100644 src/components/auth/register.scss delete mode 100644 src/components/dashboard/index.js delete mode 100644 src/components/dashboard/navigation.scss diff --git a/.env b/.env deleted file mode 100644 index 3db256a..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_ANALYTICS_ID=UA-159070324-1 \ No newline at end of file diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 61fb4f0..0ce1e08 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -8,7 +8,6 @@ import GroaWhite from "./GroaWhite.png"; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; - class Register extends React.Component { constructor(props) { super(props); diff --git a/src/components/auth/register.scss b/src/components/auth/register.scss deleted file mode 100644 index ec3311d..0000000 --- a/src/components/auth/register.scss +++ /dev/null @@ -1,112 +0,0 @@ -.container{ - // min-height: 100vh; - width: 100%; - height: 100%; - background: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), - rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - - h3{ - color:white; - display: flex; - justify-content: flex-end; - padding: 3px 20px 3px 20px; - } - .H1{ - display: flex; - - .boxLeft{ - width: 50%; - padding: 1px 20px; - } - - - .box1{ - margin: -15% 2% 2% 0; - background:rgb(97, 97, 97); - width: 407px; - height: 436px; - padding: 15px; - } - } - - .box2{ - margin: -30% 0 0 40%; - color: black; - background: #C4C4C4; - width: 407px; - height: 288px; - font-size: 200%; - color: black; - padding-left: 25px; - } - - - .boxRight{ - display: flex; - justify-content: flex-end; - padding: 5%; - width: 50%; - h2{ - padding: 5px 10px 5px 10px; - } - } - .form{ - display: flex; - flex-direction: column; - width: 518px; - height: 647px; - background: #FFFFFF; - - } - - .form-control{ - padding: 7px; - margin: 2% 12% 2% 12%; - border: 1px solid black; - border-radius: 4px; - } - .checkBox{ - display: flex; - - .CheckB{ - padding-top: 20px; - padding-right: 5px; - padding-left: 60px; - } - h5{ - display: flex; - justify-content: left; - } - } - h4{ - display: flex; - justify-content: center; - } - - .LogBtn { - margin: 2% 12% 2% 12%; - padding: 8px; - background:#7A7A7A; - border-radius: 4px; - color: white; - } - - .BottomLogin { - display: flex; - justify-content: flex-end; - .LoginBtn{ - margin: 4% 12% 0 0; - width: 115px; - height:36px; - background:#21242C; - color: white; - border-radius: 4px; - } - } - - .callingError{ - color: red; - display: flex; - justify-content: center; - } -} \ No newline at end of file diff --git a/src/components/dashboard/index.js b/src/components/dashboard/index.js deleted file mode 100644 index 1f6d02e..0000000 --- a/src/components/dashboard/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -import Dashboardv1 from './dashboardv1'; -import Navigation from './navigation.js'; - -const Dashboard = () => { - - - return ( - -
- - - - -
- - - ) -} - -export default Dashboard; diff --git a/src/components/dashboard/navigation.scss b/src/components/dashboard/navigation.scss deleted file mode 100644 index 030dfcb..0000000 --- a/src/components/dashboard/navigation.scss +++ /dev/null @@ -1,67 +0,0 @@ -.mainContainer { - background: #373737; - margin: 30px; - display: flex; - justify-content: space-evenly; - padding: 10px; - - .Bars { - background: rgba(255, 255, 255, 0.24); - width: 230px; - - .bars-icon { - color: white; - padding: 10px; - font-size: 140%; - } - } - .Links { - width: 60%; - display: flex; - justify-content: space-evenly; - padding: 10px; - - .Groa { - font-size: 20px; - font-weight: bold; - color: white; - text-decoration: none; - } - - .NavLink { - color: white; - text-decoration: none; - } - } - - .searchContainer { - border: 1px solid black; - border-radius: 5px; - width: 250px; - padding-left: 15px; - background: white; - padding-top: 5px; - margin-right: 30px; - - .search-icon { - padding-left: 10px; - } - - .searchBox { - border: 2px solid white; - padding: 0.5rem; - text-decoration: none; - font-size: 16px; - } - } - - .bell-icon, - .question-icon, - .user-circle-icon, - .angle-down-icon { - color: white; - padding: 10px; - font-size: 140%; - margin-right: 10px; - } -} From 6eb12c4cbb0175a624a2fe7433d010a133126aab Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 12:31:11 -0400 Subject: [PATCH 223/822] added myself, bensolt to readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8822c87..cfa76d6 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ You can find the deployed project at [https://www.groa.us/](https://www.groa.us/ 🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed -| [Brianna Keune](https://github.com/briannakeune) | [Student 2](https://github.com/) | [Student 3](https://github.com/) | [Student 4](https://github.com/) | [Student 5](https://github.com/) | +| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Student 3](https://github.com/) | [Student 4](https://github.com/) | [Student 5](https://github.com/) | | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/) | [](https://github.com/) | [](https://github.com/) | [](https://github.com/) | -| [ ](https://github.com/briannakeune) | [ ](https://github.com/honda0306) | [ ](https://github.com/Mister-Corn) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | -| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | +| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/) | [](https://github.com/) | [](https://github.com/) | +| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/Mister-Corn) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | +| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) |

From 1827ff5604b147554d16a5e4c04817c03a7385f9 Mon Sep 17 00:00:00 2001 From: marielapg Date: Wed, 11 Mar 2020 09:36:32 -0700 Subject: [PATCH 224/822] added to student 3 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8822c87..8275e14 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ You can find the deployed project at [https://www.groa.us/](https://www.groa.us/ 🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed -| [Brianna Keune](https://github.com/briannakeune) | [Student 2](https://github.com/) | [Student 3](https://github.com/) | [Student 4](https://github.com/) | [Student 5](https://github.com/) | +| [Brianna Keune](https://github.com/briannakeune) | [Student 2](https://github.com/) | [Mariela Gonzales](https://github.com/marielapg) | [Student 4](https://github.com/) | [Student 5](https://github.com/) | | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/) | [](https://github.com/) | [](https://github.com/) | [](https://github.com/) | -| [ ](https://github.com/briannakeune) | [ ](https://github.com/honda0306) | [ ](https://github.com/Mister-Corn) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | -| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | +| [](https://github.com/briannakeune) | [](https://github.com/) | [](https://github.com/marielapg) | [](https://github.com/) | [](https://github.com/) | +| [ ](https://github.com/briannakeune) | [ ](https://github.com/honda0306) | [ ](https://github.com/marielapg) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | +| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/marielapg/) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) |

From 0e4cb5a0b89a23d6cc73e9a8db9163f6584bf9af Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 11 Mar 2020 13:00:23 -0400 Subject: [PATCH 225/822] package json --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index 75094ea..ac24d0c 100644 --- a/package.json +++ b/package.json @@ -46,13 +46,8 @@ "last 1 safari version" ] }, -<<<<<<< HEAD "devDependencies": { "history": "^4.10.1", "redux-mock-store": "^1.5.4" } } -======= - "devDependencies": {} -} ->>>>>>> ab234ad3cf5584ecc24de394e1c16d94cd5218b2 From 474f9e59e9cf5c5015df9fd7d19f63a999595590 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 11 Mar 2020 13:04:21 -0400 Subject: [PATCH 226/822] added profile to readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bff6df1..7c89ce8 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ You can find the deployed project at [https://www.groa.us/](https://www.groa.us/ 🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed -| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | [Student 4](https://github.com/) | [Student 5](https://github.com/) | +| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | [TJ Katalenas](https://github.com/robomantis19) | [Student 5](https://github.com/) | | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | [](https://github.com/) | [](https://github.com/) | +| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | [](https://github.com/robomantis19) | [](https://github.com/robomantis19) | | [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/Mister-Corn) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | | [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | From c8f8c7e23563cdd66ea41886a90334764e77e1a8 Mon Sep 17 00:00:00 2001 From: cmruss Date: Wed, 11 Mar 2020 13:13:37 -0400 Subject: [PATCH 227/822] added info to readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7c89ce8..a6ddd30 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ You can find the deployed project at [https://www.groa.us/](https://www.groa.us/ 🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed -| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | [TJ Katalenas](https://github.com/robomantis19) | [Student 5](https://github.com/) | +| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | [TJ Katalenas](https://github.com/robomantis19) | [Cody M Russell](https://github.com/cmruss) | | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | [](https://github.com/robomantis19) | [](https://github.com/robomantis19) | -| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/Mister-Corn) | [ ](https://github.com/NandoTheessen) | [ ](https://github.com/wvandolah) | -| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/) | +| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | [](https://github.com/robomantis19) | [](https://github.com/cmruss) | +| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/marielapg) | [ ](https://github.com/robomantis19) | [ ](https://github.com/cmruss) | +| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/cm-russell) |

From 84df05161cb4147fe3714ce741dda78053edd8be Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 13:55:09 -0400 Subject: [PATCH 228/822] uploading data, need keep data, redirect to loading screen --- src/App.js | 29 ++++----------- src/components/auth/dataUpload.js | 51 +++++++++++++------------- src/components/auth/dataUpload.scss | 1 + src/components/auth/dataUpload.test.js | 16 +++++++- src/utils/test-utils.js | 3 -- 5 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/App.js b/src/App.js index d3bdfdb..ddfb95b 100644 --- a/src/App.js +++ b/src/App.js @@ -1,12 +1,3 @@ -<<<<<<< HEAD -import React from "react"; -import { Route, Switch } from "react-router-dom"; -// import Dashboard from "./components/dashboard/index.js"; -// import Login from './auth/Login'; -// import Register from './auth/Register'; -// import LoadingScreen from "./components/layout/LoadingScreen.js"; -import DataUpload from './components/auth/dataUpload'; -======= import React, { useState, useEffect } from "react"; import { Route } from "react-router-dom"; @@ -16,6 +7,7 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; +import DataUpload from "./components/auth/dataUpload"; // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -34,7 +26,6 @@ const store = createStore( reducer, composeEnhancers(applyMiddleware(thunk, logger)) ); ->>>>>>> 058f81acdd0305d2f2b5926da0c56b45cf92918a function App() { const [hasToken, setHasToken] = useState(localStorage.getItem("token")); @@ -42,17 +33,6 @@ function App() { useEffect(() => reactGAinitialization(), [userid]); return ( -<<<<<<< HEAD -
- - {/* */} - {/* - */} - {/* */} - - -
-=======
@@ -96,10 +76,15 @@ function App() { /> )} /> + {/* ADDED for dataUpload */} +
->>>>>>> 058f81acdd0305d2f2b5926da0c56b45cf92918a ); } diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 549b555..6ee6ee6 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,8 +1,8 @@ import React, {useState} from 'react'; -import axios from 'axios'; +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import './dataUpload.scss' -export default function DataUpload() { +const DataUpload = props => { const [input, setInput] = useState({file:''}) @@ -32,31 +32,33 @@ function clikR() { } } } - + let { userid } = props.match.params; const handleChange = e => { - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) - // NOT USING CORRECT? -> //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('https://api.groa.us/api/users/:id/uploading', data,{ - headers:{ - 'Content-Type':'multipart/form-data' + let data = new FormData(); + data.append("movies", e.target.files[0], e.target.files[0].name); + // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. + axiosWithAuth() + // this is insantiated when a file is added to input + .post(`/${userid}/uploading`, data, { + headers: { + "Content-Type": "multipart/form-data" } - }) - .then(res => { - console.log(res); - setRatings(res.data) - // this.props.history.push('/dashboard'); - }).catch(err => { - console.log(err) - }) - data = new FormData() - setTimeout(() => { - setLoading(

.loading

) - }, 3000); - - + }) + .then(res => { + // waiting to set ratings var for 45 seconds. + setTimeout(() => setRatings(res.data), 60 * 1000); + //DIRECT TO UPLOADING SCREEN + //props.history.push(`/${res.data.id}/upload`); + }) + .catch(err => { + console.log(err); + }); + // clears out previous uploaded file + data = new FormData(); } +// DO we need the Use Effect from dashboardv1 - in (dataUpload?) + return (
@@ -131,6 +133,5 @@ return (
// END DataUploadPage ) - - } +export default DataUpload; \ No newline at end of file diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss index 5478a75..b5cb9e1 100644 --- a/src/components/auth/dataUpload.scss +++ b/src/components/auth/dataUpload.scss @@ -9,6 +9,7 @@ display: flex; justify-content: center; font-size: 350%; + margin-top: 4%; } h2, h3{ diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index 096802f..47d6f8a 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -18,4 +18,18 @@ describe('dataupload', () => { test('drop dataupload file at upload spot', () => { expect(clikDataUpload.sum(0, 1)).toBe(1) - }) \ No newline at end of file + }) + + it("renders errors to register on Click if info not filled out", () => { + const { container } = render( + + + + ); + + let form = getAllByTestId(container, "registerForm"); + expect(form.length).toBe(1); + + fireEvent.submit(getByTestId(container, "registerForm")) + let component = getAllByText(container, "Email is required"); + expect(component.length).toBe(1); \ No newline at end of file diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 767281e..3b46abb 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -57,6 +57,3 @@ module.exports = { clikDataUpload }; - -//Login button clicked - From 2dfe1ed8e997ceb5c5e91552c60004c597ddbf9f Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 15:23:53 -0400 Subject: [PATCH 229/822] adding tests --- src/components/auth/dataUpload.js | 8 ++++---- src/components/auth/dataUpload.test.js | 21 +++++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 6ee6ee6..d73ce4c 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -47,8 +47,8 @@ function clikR() { .then(res => { // waiting to set ratings var for 45 seconds. setTimeout(() => setRatings(res.data), 60 * 1000); - //DIRECT TO UPLOADING SCREEN - //props.history.push(`/${res.data.id}/upload`); + //NEED to direct to uploading screen while retrieving file. + props.history.push(`/${res.data.id}/upload`); }) .catch(err => { console.log(err); @@ -73,7 +73,7 @@ return (
- +
@@ -92,7 +92,7 @@ return (
- +

1.Log in to IMDb

diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index 47d6f8a..033cf0a 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -1,7 +1,8 @@ import React from "react"; -import { render } from "@testing-library/react"; +import { render,fireEvent, } from "@testing-library/react"; +import { getAllByTestId, getAllByText, getByTestId } from "../../utils/test-utils.js"; import DataUpload from './dataUpload'; -import { clikDataUpload } from "../../utils/test-utils.js"; + describe('dataupload', () => { it('dataupload be defined', () => { @@ -16,20 +17,20 @@ describe('dataupload', () => { }); }); - test('drop dataupload file at upload spot', () => { - expect(clikDataUpload.sum(0, 1)).toBe(1) - }) - it("renders errors to register on Click if info not filled out", () => { + it("renders errors to DataUpload on click", () => { const { container } = render( - + ); + let form = getAllByTestId(container, "registerForm"); expect(form.length).toBe(1); - fireEvent.submit(getByTestId(container, "registerForm")) - let component = getAllByText(container, "Email is required"); - expect(component.length).toBe(1); \ No newline at end of file + fireEvent.submit(getByTestId(container, "clickLetterBoxd")) + let component = getAllByText(container, "Log in to Letterboxd"); + expect(component.length).toBe(1); + + }) \ No newline at end of file From 6850c1cffddb350c7d6f5a4e3be050bef677f5e9 Mon Sep 17 00:00:00 2001 From: cmruss Date: Wed, 11 Mar 2020 15:29:58 -0400 Subject: [PATCH 230/822] removed timeout added upload progress config to axios post --- src/components/dashboard/dashboardv1.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index c3aba14..2f4325c 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -10,6 +10,20 @@ const Dashboardv1 = props => { const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); + const config = { + headers: { + "Content-Type": "multipart/form-data" + }, + onUploadProgress: (progressEvent) => { + let progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total) + console.log("Progress", progress) + }, + onDownloadProgress: (progressEvent) => { + let progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total) + console.log("Progress", progress) + } + } + let { userid } = props.match.params; const changeHandler = e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData @@ -19,14 +33,9 @@ const Dashboardv1 = props => { // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. axiosWithAuth() // this is insantiated when a file is added to input - .post(`/${userid}/uploading`, data, { - headers: { - "Content-Type": "multipart/form-data" - } - }) + .post(`/${userid}/uploading`, data, config) .then(res => { - // waiting to set ratings var for 45 seconds. - setTimeout(() => setRatings(res.data), 60 * 1000); + setRatings(res.data) }) .catch(err => { console.log(err); // --> I think these errors we should be sending to an error page. From e920cbe735a4362eebb27772d4545402300ec2a1 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 15:44:45 -0400 Subject: [PATCH 231/822] added tests --- src/App.js | 4 ++-- src/components/auth/dataUpload.js | 2 ++ src/components/auth/dataUpload.test.js | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index ddfb95b..806afe9 100644 --- a/src/App.js +++ b/src/App.js @@ -76,10 +76,10 @@ function App() { /> )} /> - {/* ADDED for dataUpload */} + {/* Data upload Route*/}
diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index d73ce4c..e76bb7f 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,5 +1,7 @@ import React, {useState} from 'react'; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { ifDev } from "../../utils/removeAttribute.js"; + import './dataUpload.scss' const DataUpload = props => { diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index 033cf0a..9d74e7c 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -1,6 +1,7 @@ import React from "react"; import { render,fireEvent, } from "@testing-library/react"; import { getAllByTestId, getAllByText, getByTestId } from "../../utils/test-utils.js"; + import DataUpload from './dataUpload'; @@ -18,7 +19,7 @@ describe('dataupload', () => { }); - it("renders errors to DataUpload on click", () => { + it("renders to DataUpload", () => { const { container } = render( @@ -26,11 +27,19 @@ describe('dataupload', () => { ); - let form = getAllByTestId(container, "registerForm"); - expect(form.length).toBe(1); + let button = getAllByTestId(container, "clickLetterBoxd"); + expect(button.length).toBe(1); fireEvent.submit(getByTestId(container, "clickLetterBoxd")) let component = getAllByText(container, "Log in to Letterboxd"); expect(component.length).toBe(1); + + button = getAllByTestId(container, "clickIMDb"); + expect(button.length).toBe(1); + + fireEvent.submit(getByTestId(container, "clickIMDb")) + component = getAllByText(container, "Log in to IMDb"); + expect(component.length).toBe(1); + }) \ No newline at end of file From 1a49c46aff2b6e7e706e64160cbb4fb6d866382e Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 11 Mar 2020 16:06:45 -0400 Subject: [PATCH 232/822] menu made --- src/components/dashboard/_Navigation.scss | 111 ++++++++++++++++++++++ src/components/dashboard/navigation.js | 42 ++++++-- 2 files changed, 145 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index 138701a..c132847 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -13,6 +13,117 @@ } } + // menu changes start + .sr-only{ + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; + } + + .menu-toggle{ + color: #333; + margin-right: 1rem; + } + + .title{ + display: flex; + justify-content: space-between; + margin-left: 25px; + font-size: 1.6rem; + background-color: #1a1a1a; + color: white; + text-align: center; + padding-top: 15px; + border-bottom: 1px solid #383838; + h2{ + height: 55px; + } + } + .menu-toggle:hover, + .menu-toggle:focus{ + color : black; + } + + + .main-menu{ + position: fixed; + display: none; + left: -300px; + top: 0; + height: 100%; + overflow-x: visible; + overflow-y: hidden; + transition: left 0.3s ease; + z-index: 999; + } + + .main-menu ul{ + list-style: none; + margin: 0; + padding-top: 2.5em; + min-height: 100%; + width: 300px; + background-color: #1a1a1a; + } + .main-menu a{ + display: block; + padding: 1.75em; + color: #fff; + text-decoration: none; + border-bottom: 1px solid #383838; + } + + + .main-menu li:first-child a{ + border-top: 1px solid #383838; + } + + .main-menu a:hover, + .main-menu a:focus { + background: #333; + text-decoration: underline; + } + + .main-menu .menu-close { + position: absolute; + right: 0; + top: -30px; + border: none; + } + + .main-menu:target { + display: block; + left: 0; + outline: none; + } + + .main-menu:target .menu-close{ + z-index: 1001; + } + + .main-menu:target ul{ + position: relative; + z-index: 1000; + } + + .main-menu:target + .backdrop { + position: fixed; + display: block; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: 998; + background-color: rgba(0,0,0,0.85); + cursor: default; + } + + //menuchanges end .Links { width: 60%; display: flex; diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index a124e29..3b98d89 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -28,12 +28,35 @@ class Navigation extends Component { return (
-
- - +
Dlk5u_Ku97GvYgT%+$F*dTC2*^6Wxzxh2l6GX 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 LTaBTj{{Kw?JlHWf literal 0 HcmV?d00001 diff --git a/src/components/auth/Letterboxd_logo_(2018) 3.png b/src/components/auth/Letterboxd_logo_(2018) 3.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f1386a4903039a0ae797a691d4c3b339ea07d7 GIT binary patch literal 5367 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 { @@ -79,6 +81,7 @@ return (
+

1.Log in to Letterboxd

2.Click on your username and select SETTINGS from the dropdown menu.

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere @@ -97,6 +100,7 @@ return (

+

1.Log in to IMDb

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

diff --git a/src/components/auth/images 2.png b/src/components/auth/images 2.png new file mode 100644 index 0000000000000000000000000000000000000000..656301c968ef4aaab70efd2956019ea399866085 GIT binary patch literal 12439 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 literal 0 HcmV?d00001 From 3c8ea441b7267e80dda2ad26714203ce4a5c403a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:23:27 -0500 Subject: [PATCH 235/822] added logo images --- public/img/imdb-logo.svg | 9 +++ public/img/letterboxd-logo.svg | 9 +++ public/index.html | 1 + public/reset.css | 129 +++++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 public/img/imdb-logo.svg create mode 100644 public/img/letterboxd-logo.svg create mode 100644 public/reset.css diff --git a/public/img/imdb-logo.svg b/public/img/imdb-logo.svg new file mode 100644 index 0000000..9e97cf2 --- /dev/null +++ b/public/img/imdb-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/letterboxd-logo.svg b/public/img/letterboxd-logo.svg new file mode 100644 index 0000000..b694160 --- /dev/null +++ b/public/img/letterboxd-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/index.html b/public/index.html index d9973c9..d9d817b 100644 --- a/public/index.html +++ b/public/index.html @@ -14,6 +14,7 @@ Gróa + diff --git a/public/reset.css b/public/reset.css new file mode 100644 index 0000000..45a05ec --- /dev/null +++ b/public/reset.css @@ -0,0 +1,129 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} From dd784d4ec09c80c835756754bb68c45a92e5e18a Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:23:57 -0500 Subject: [PATCH 236/822] moved reset css --- src/index.js | 1 - src/indexReset.scss | 129 -------------------------------------------- 2 files changed, 130 deletions(-) delete mode 100644 src/indexReset.scss diff --git a/src/index.js b/src/index.js index 2d908ec..c1684e8 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,6 @@ import React from "react"; import ReactDOM from "react-dom"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; -import "./indexReset.scss"; ReactDOM.render(, document.getElementById("root")); diff --git a/src/indexReset.scss b/src/indexReset.scss deleted file mode 100644 index 45a05ec..0000000 --- a/src/indexReset.scss +++ /dev/null @@ -1,129 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, -body, -div, -span, -applet, -object, -iframe, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -big, -cite, -code, -del, -dfn, -em, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -b, -u, -i, -center, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { - display: block; -} -body { - line-height: 1; -} -ol, -ul { - list-style: none; -} -blockquote, -q { - quotes: none; -} -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} From 2b7412d5865b0423c82c52b23c007bebb0a9b9b6 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:25:00 -0500 Subject: [PATCH 237/822] updated postLogin component, styles, and test --- .../auth/__snapshots__/postLogin.test.js.snap | 7 - src/components/auth/postLogin.js | 169 +++++++----------- src/components/auth/postLogin.scss | 168 +++++++---------- src/components/auth/postLogin.test.js | 53 ++++-- 4 files changed, 168 insertions(+), 229 deletions(-) delete mode 100644 src/components/auth/__snapshots__/postLogin.test.js.snap diff --git a/src/components/auth/__snapshots__/postLogin.test.js.snap b/src/components/auth/__snapshots__/postLogin.test.js.snap deleted file mode 100644 index 4d275b2..0000000 --- a/src/components/auth/__snapshots__/postLogin.test.js.snap +++ /dev/null @@ -1,7 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Button postlogin should render postlogin correctly 1`] = ` - -`; diff --git a/src/components/auth/postLogin.js b/src/components/auth/postLogin.js index 0a6f6f0..862d0dd 100644 --- a/src/components/auth/postLogin.js +++ b/src/components/auth/postLogin.js @@ -1,107 +1,72 @@ -import React, {useState} from 'react'; -import axios from 'axios'; -import './postLogin.scss' -export default function PostLogin() { - - - -const [input, setInput] = useState({file:''}) - const [ratings, setRatings] = useState({}) - const [loading, setLoading] = useState() +import React from "react"; +import "./postLogin.scss"; +import { ifDev } from "../../utils/removeAttribute"; - const handleChange = e => { - let data = new FormData() - data.append('movies', e.target.files[0] , e.target.files[0].name) - //change user/1/ to be :id number - //Groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/ - axios.post('http://localhost:4000/api/users/1/upload', data,{ - headers:{ - 'Content-Type':'multipart/form-data' - } - }) - .then(res => { - console.log(res); - setRatings(res.data) - }).catch(err => { - console.log(err) - }) - data = new FormData() - setTimeout(() => { - setLoading(

.loading

) - }, 1000); - setTimeout(() => { - setLoading(

..loading

) - }, 2000); - setTimeout(() => { - setLoading(

...loading

) - }, 3000); - setTimeout(() => { - setLoading(

....loading

) - }, 4000); - // setTimeout(() => { - // setLoading('..loading') - // }, 4000); - // setTimeout(() => { - // setLoading('.loading') - // }, 5000); - -} - -return ( -
-
-
-

Groa grows with you.

-

The more movies your rate, -
- the better your recommenations.

- -

Select how you'd like to join:

+export default function PostLogin() { + return ( +
+
+

Groa grows with you.

+

+ The more movies you rate. +
+ The better your recommendations. +

+
+
+

Select how you would like to join:

+
+
+

+ Upload ratings from +

+
+ Letterboxd's logo. +

or

+ IMDb's logo.
-
-
-
-
-
-

Upload ratings from Letterboxd or IMDb

-

For users who already have accounts on these popular film rating sites.

- -
- -
- - {/* UPLOAD FILE */} - {/* */} - - - {/* END FORM */} -
- {/* END BOX LEFT */} -
-
-
-

Recommendation
setup wizard

-

For users who want to use Groa without uploading data.

- -
- -
- +

+ For users who already have an account on this popular film rating + site. +

+ +
+
+

Recommendation setup wizard

+
+ Placeholder from placeholder.com +
+

For users who want to use Groa without uploading data.

+ +
+
-{/* END BOX RIGHT */} -
-{/* END BOX CONTAINER */} -
-{/* END CONTAINER */} -
- ) - - + ); } diff --git a/src/components/auth/postLogin.scss b/src/components/auth/postLogin.scss index 1b7ea03..ea821e2 100644 --- a/src/components/auth/postLogin.scss +++ b/src/components/auth/postLogin.scss @@ -1,109 +1,69 @@ -.PostLoginPage{ - display: flex; - justify-content: center; - border: 2px solid blue; -} - -.textholder1{ - - justify-content: center; - border: 2px solid green; - - h1{ - display: flex; - justify-content: center; - font-size: 350%; +.container.post-login { + background: white; + color: black; + header { + margin: 0% auto; + text-align: center; + h1 { + font-size: 4rem; + margin-top: 2.75%; + } + p { + font-size: 1.75rem; + margin: 2.24% auto; + line-height: 2.15rem; + width: 100%; + max-width: 425px; + height: 68; + text-align: center; + } + } + .choice-selection-container { + text-align: center; + h2 { + font-size: 2.5rem; + margin: 2% 0% 4.25% 0%; + } + .choice-selection { + margin: auto; + width: 71%; + display: flex; + justify-content: space-around; + .choice-box { + width: 35%; + max-width: 287px; + height: 550px; + display: flex; + flex-direction: column; + justify-content: space-between; + h4 { + font-size: 1.75rem; + font-weight: bold; + margin-bottom: 27px; } - - h2{ - display: flex; - justify-content: center; - }z - - h3{ - display: flex; - justify-content: center; + .img-box { + width: 100%; + max-width: 285; + height: auto; } -} - -.image1{ - display: flex; - justify-content: center; - height: 100px; - width: 200px; - background: gray; - margin-bottom: 8%; -} - -.image2{ - height: 100px; - width: 200px; - background: gray; -} - - -.container{ - display: flex; - flex-direction: column; - width: 90%; - border: 2px solid red; -} - -.boxContainer{ - display: flex; - justify-content: center; - margin-top: 5%; - border: 2px solid blue; - - .boxLeft{ - width: 285px; - height: 500px; - margin-right: 20%; - border: 2px solid black; - - .boxInside{ - display: flex; - justify-content: center; - flex-direction: column; - padding: 25px; + .select-btn { + width: 100%; + max-width: 287px; + height: 51px; + margin-top: 32px; + justify-content: flex-end; + font-size: rem; + border: none; + font-size: 1.75rem; + color: white; + background: #21242c; + &:hover { + color: #21242c; + background: white; + border: 1px solid grey; + } } - - .holder{ - display: flex; - justify-content: center; - } + } } - - .boxRight{ - width: 285px; - height: 400px; - // margin-left: 40%; - border: 2px solid black; - - .boxInside{ - display: flex; - flex-direction: column; - padding: 25px; - - .holder{ - display: flex; - justify-content: center; - } - } - } - -} - -.movie-input{ - padding: 10px; - background: gray; - width: 300px; + } } - -.btn{ - color: white; - font-size: 25px; - background: black; - height: 51px; - width: 255px; -} \ No newline at end of file diff --git a/src/components/auth/postLogin.test.js b/src/components/auth/postLogin.test.js index 270c53c..c3f6389 100644 --- a/src/components/auth/postLogin.test.js +++ b/src/components/auth/postLogin.test.js @@ -1,23 +1,44 @@ import React from "react"; import { render } from "@testing-library/react"; -import postLogin from './postLogin'; -import { clikPostLogin } from "../../utils/test-utils"; +import { Router, Route } from "react-router-dom"; +import { getAllByTestId } from "../../utils/test-utils.js"; +import { createMemoryHistory } from "history"; +// component to be tested. +import PostLogin from "./postLogin"; -describe('Button postlogin', () => { - it('postlogin be defined', () => { - expect(postLogin).toBeDefined(); - }); +it("renders PostLogin component on the path '/setup-wizard'", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); - it('should render postlogin correctly', () => { - const tree = ( - - ); - expect(tree).toMatchSnapshot(); - }); - }); + let component = getAllByTestId(container, "post-login-component"); + expect(component.length).toBe(1); +}); - test('click post login', () => { - expect(clikPostLogin.sum(0, 1)).toBe(1) -}) +it("renders Upload from ratings header", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); + let component = getAllByTestId(container, "upload-ratings-header"); + expect(component.length).toBe(1); +}); + +it("renders button to upload ratings", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "upload-ratings-button"); + expect(component.length).toBe(1); +}); From 22dc6ae1c965a2ba3382ce8fe366b427e2118470 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:25:14 -0500 Subject: [PATCH 238/822] updated route --- src/App.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.js b/src/App.js index 55cb8e1..2cc2a6a 100644 --- a/src/App.js +++ b/src/App.js @@ -7,6 +7,7 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; +import PostLogin from "./components/auth/postLogin.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -75,6 +76,7 @@ function App() { /> )} /> +
From bd7eacb703dcd62ea26dfe7efb3ab79393ddd44d Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:25:26 -0500 Subject: [PATCH 239/822] cleaned up test-utils --- src/utils/test-utils.js | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 1cbbae0..e781d06 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -43,31 +43,11 @@ export function getByTestId(...args) { return null; } -const clikPostLogin = { - sum: (a, b) => { - return a + b - } -} - -const clikLogin = { - sum: (a, b) => { - return a + b - } -} - // re-export with overrides module.exports = { ...domTestingLib, getByTestId, getAllByTestId, queryByTestId, - queryAllByTestId, - clikPostLogin, - clikLogin + queryAllByTestId }; - -<<<<<<< HEAD - -======= -//Login button clicked ->>>>>>> 727f596f78414976dd49276478950c7b59479662 From cd33e54b8ef45a1f42c2585c37a55dc700e24df4 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 16:25:48 -0400 Subject: [PATCH 240/822] added fabicon, tests, and axios upload file --- public/index.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/index.html b/public/index.html index d9973c9..65d09b4 100644 --- a/public/index.html +++ b/public/index.html @@ -2,14 +2,16 @@ - + + - + + From 38407dfe4ae1bc09b652f8681a151ede31b1c1b6 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Wed, 11 Mar 2020 16:36:43 -0400 Subject: [PATCH 241/822] no changes --- src/components/dashboard/_Navigation.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index c132847..989a99f 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -58,7 +58,7 @@ height: 100%; overflow-x: visible; overflow-y: hidden; - transition: left 0.3s ease; + transition: left 3.0s ease; z-index: 999; } @@ -76,6 +76,7 @@ color: #fff; text-decoration: none; border-bottom: 1px solid #383838; + } @@ -121,6 +122,7 @@ z-index: 998; background-color: rgba(0,0,0,0.85); cursor: default; + } //menuchanges end From eb3b7dcdd95107ee7413de489a936926370a4c8b Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Wed, 11 Mar 2020 15:50:07 -0500 Subject: [PATCH 242/822] hidden styles --- src/components/auth/postLogin.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/auth/postLogin.scss b/src/components/auth/postLogin.scss index ea821e2..ac2710d 100644 --- a/src/components/auth/postLogin.scss +++ b/src/components/auth/postLogin.scss @@ -66,4 +66,8 @@ } } } + .hidden, + .setup-wizard.choice-box.hidden { + display: none; + } } From 3b4752494b100b12f677e43284052c6a3ac7c175 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Wed, 11 Mar 2020 20:36:52 -0400 Subject: [PATCH 243/822] 1 test failing still --- src/components/auth/dataUpload.js | 2 +- src/components/auth/dataUpload.test.js | 37 +++++++++++--------------- src/utils/test-utils.js | 2 +- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index d368915..a865799 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -64,7 +64,7 @@ function clikR() { // DO we need the Use Effect from dashboardv1 - in (dataUpload?) return ( -
+

Already rated movies elsewhere?

diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index 9d74e7c..6b9685d 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -1,44 +1,37 @@ import React from "react"; -import { render,fireEvent, } from "@testing-library/react"; +import { render, fireEvent } from "@testing-library/react"; import { getAllByTestId, getAllByText, getByTestId } from "../../utils/test-utils.js"; +import { Router, Route } from "react-router-dom"; +import { createMemoryHistory } from "history"; -import DataUpload from './dataUpload'; +import DataUpload from './dataUpload.js'; -describe('dataupload', () => { - it('dataupload be defined', () => { - expect(DataUpload).toBeDefined(); - }); - - it('should render dataupload correctly', () => { - const tree = ( - - ); - expect(tree).toMatchSnapshot(); - }); - }); - - it("renders to DataUpload", () => { + it("renders DataUpload component", () => { + let history = createMemoryHistory(); const { container } = render( - - + + ); - + console.log(window.location.pathname) + let component = getAllByTestId(container, "DataUploadPage-test"); + expect(component.length).toBe(1); + let button = getAllByTestId(container, "clickLetterBoxd"); expect(button.length).toBe(1); - fireEvent.submit(getByTestId(container, "clickLetterBoxd")) - let component = getAllByText(container, "Log in to Letterboxd"); + fireEvent.click(getByTestId(container, "clickLetterBoxd")) + component = getAllByText(container, "Log in to Letterboxd"); expect(component.length).toBe(1); button = getAllByTestId(container, "clickIMDb"); expect(button.length).toBe(1); - fireEvent.submit(getByTestId(container, "clickIMDb")) + fireEvent.click(getByTestId(container, "clickIMDb")) component = getAllByText(container, "Log in to IMDb"); expect(component.length).toBe(1); diff --git a/src/utils/test-utils.js b/src/utils/test-utils.js index 3b46abb..18e9563 100644 --- a/src/utils/test-utils.js +++ b/src/utils/test-utils.js @@ -54,6 +54,6 @@ module.exports = { getAllByTestId, queryByTestId, queryAllByTestId, - clikDataUpload + }; From a6c825e58aab797e67b85f74c64717abe6d8ba6b Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 00:11:13 -0400 Subject: [PATCH 244/822] ready to recieve movie posters --- src/components/dashboard/dashboardv1.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 69c32a6..8f68ef6 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -51,7 +51,8 @@ const Dashboardv1 = props => { axiosWithAuth() .get(`/${userid}/recommendations`) .then(res => { - setRecommendations(res.data.recommendation_json); + console.log(res.data) + setRecommendations(res.data); }) .catch(err => console.log("Something went wrong in fetching recommendations.", err) @@ -129,7 +130,7 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image="https://source.unsplash.com/collection/2047031/500x500" + image={`https://image.tmdb.org/t/p/w500/${x.Poster}?api_key=18814be112b8b0167bc919c307bd596e
`} /> ) : null )} From bf732924867d65e159d7aca61a03af9cd8f73b66 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 12 Mar 2020 09:13:18 -0400 Subject: [PATCH 245/822] all tests pass, yes! --- src/components/auth/dataUpload.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index 6b9685d..c9a25d9 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -24,7 +24,7 @@ import DataUpload from './dataUpload.js'; expect(button.length).toBe(1); fireEvent.click(getByTestId(container, "clickLetterBoxd")) - component = getAllByText(container, "Log in to Letterboxd"); + component = getAllByText(container, "1.Log in to Letterboxd"); expect(component.length).toBe(1); @@ -32,7 +32,7 @@ import DataUpload from './dataUpload.js'; expect(button.length).toBe(1); fireEvent.click(getByTestId(container, "clickIMDb")) - component = getAllByText(container, "Log in to IMDb"); + component = getAllByText(container, "1.Log in to IMDb"); expect(component.length).toBe(1); }) \ No newline at end of file From 5cad349af9018f737579bd8a022159df65ccde44 Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 12:45:35 -0400 Subject: [PATCH 246/822] changed format for movie posters --- src/components/dashboard/dashboardv1.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 8f68ef6..36187fb 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -34,6 +34,7 @@ const Dashboardv1 = props => { // this is insantiated when a file is added to input .post(`/${userid}/uploading`, data, config) .then(res => { + console.log(res) setRatings(res.data) }) .catch(err => { @@ -130,7 +131,7 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image={`https://image.tmdb.org/t/p/w500/${x.Poster}?api_key=18814be112b8b0167bc919c307bd596e
`} + image={`https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
`} /> ) : null )} From ca88e26970040e4154aa1be2f9c975a4293ef1c9 Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 12:54:21 -0400 Subject: [PATCH 247/822] added recommendation_json to res.data --- src/components/dashboard/dashboardv1.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 36187fb..e3be424 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -52,8 +52,7 @@ const Dashboardv1 = props => { axiosWithAuth() .get(`/${userid}/recommendations`) .then(res => { - console.log(res.data) - setRecommendations(res.data); + setRecommendations(res.data.recommendation_json); }) .catch(err => console.log("Something went wrong in fetching recommendations.", err) From 0a8be3270e5e2d87357328f8ce6b92d7029da846 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 12:07:31 -0500 Subject: [PATCH 248/822] removed pop movie quotes call --- package-lock.json | 5 ----- package.json | 1 - 2 files changed, 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 657f4d2..3da25d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9731,11 +9731,6 @@ "ts-pnp": "^1.1.2" } }, - "popular-movie-quotes": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/popular-movie-quotes/-/popular-movie-quotes-1.2.4.tgz", - "integrity": "sha512-YOwjB6cKq+RIwbrlPONH0jP14XoBfSHtBGWxm+ZQGGvHLKYBhdoaPZcTBZgC+HV7xY4W4GTQO2Wj7Go5hP1n/w==" - }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", diff --git a/package.json b/package.json index 295f5b8..123fbeb 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "acorn": "^7.1.1", "axios": "^0.19.2", "node-sass": "^4.13.1", - "popular-movie-quotes": "^1.2.4", "puppeteer": "^2.1.1", "react": "^16.12.0", "react-dom": "^16.12.0", From 4898a8001a0d8b52dda81bb26aacbfef4d96eb00 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 12:08:17 -0500 Subject: [PATCH 249/822] updated dashboard --- src/components/dashboard/dashboardv1.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 69c32a6..d626781 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -13,15 +13,8 @@ const Dashboardv1 = props => { const config = { headers: { "Content-Type": "multipart/form-data" - }, - onUploadProgress: (progressEvent) => { - let progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total) - console.log(`Upload progress: ${progress}%`); - }, - onDownloadProgress: (progressEvent) => { - let progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total) } - } + }; let { userid } = props.match.params; const changeHandler = e => { @@ -29,12 +22,11 @@ const Dashboardv1 = props => { // packages up form to make it able to send over https let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); - // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. axiosWithAuth() - // this is insantiated when a file is added to input + // this is insantiated when a file is added to input --> we should think about adding a submit button .post(`/${userid}/uploading`, data, config) .then(res => { - setRatings(res.data) + setRatings(res.data); }) .catch(err => { console.log(err); // --> I think these errors we should be sending to an error page. From e1164d9c0a08ff82f1fdef0f6ac6a0b76a1e5c51 Mon Sep 17 00:00:00 2001 From: Billy Gingrich Date: Thu, 12 Mar 2020 13:15:00 -0400 Subject: [PATCH 250/822] readme bio updated --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a6ddd30..6e5bb4e 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,19 @@ You can find the deployed project at [https://www.groa.us/](https://www.groa.us/ 🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed -| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | [TJ Katalenas](https://github.com/robomantis19) | [Cody M Russell](https://github.com/cmruss) | -| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | [](https://github.com/robomantis19) | [](https://github.com/cmruss) | -| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/marielapg) | [ ](https://github.com/robomantis19) | [ ](https://github.com/cmruss) | -| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/cm-russell) | +| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) +| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | +| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | +| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/marielapg) | +| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | + + + +|[Billy Gingrich](https://github.com/bgingrich) | [TJ Katalenas](https://github.com/robomantis19) | [Cody M Russell](https://github.com/cmruss) | +| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | +|[](https://github.com/bgingrich) | [](https://github.com/robomantis19) | [](https://github.com/cmruss) | +| [ ](https://github.com/bgingrich) | [ ](https://github.com/robomantis19) | [ ](https://github.com/cmruss) | +| [ ](https://www.linkedin.com/in/whgingrich) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/cm-russell) |

From 4484f26daa9d55001a27c5a5625d260df65a1964 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 12 Mar 2020 13:16:24 -0400 Subject: [PATCH 251/822] adding styling --- src/App.js | 5 +++++ src/components/auth/Congratulations.js | 23 +++++++++++++++++++ src/components/auth/Congratulations.scss | 28 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/components/auth/Congratulations.js create mode 100644 src/components/auth/Congratulations.scss diff --git a/src/App.js b/src/App.js index 55cb8e1..eedc52a 100644 --- a/src/App.js +++ b/src/App.js @@ -7,6 +7,7 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; +import Congrats from './components/auth/Congratulations'; // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -75,6 +76,10 @@ function App() { /> )} /> +
diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js new file mode 100644 index 0000000..adc8769 --- /dev/null +++ b/src/components/auth/Congratulations.js @@ -0,0 +1,23 @@ +import React from "react"; +import "../auth/Congratulations.scss"; + +const Congrats = props => { + + return ( +
+
+
+
+

Congratulations!

+

Your ratings have been successfully uploaded.

+

Checkbox

+ +
+ +
+
+ +
+ ) +} +export default Congrats \ No newline at end of file diff --git a/src/components/auth/Congratulations.scss b/src/components/auth/Congratulations.scss new file mode 100644 index 0000000..526b5e1 --- /dev/null +++ b/src/components/auth/Congratulations.scss @@ -0,0 +1,28 @@ +.CongratsPage{ + border: 2px solid red; + background: #505050; + height: 100vh; + .CenterBox{ + display:flex; + margin-top: 15%; + justify-content: center; + + .congratsForm{ + display: flex; + justify-content: center; + background: white; + width: 600px; + height: 400px; + + .textHolder{ + margin-top: 10%; + padding: 25px; + width: 300px; + height: 200px; + border: 2px solid green; + } + } + } + + +} \ No newline at end of file From 6b4125e413970e6844655b5a7cd46edc91d89833 Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 13:23:54 -0400 Subject: [PATCH 252/822] temporary placeholder if no Poster URL --- src/components/dashboard/dashboardv1.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index e3be424..ff4da98 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -130,7 +130,8 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image={`https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
`} + image={ !x["Poster URL"] || x["Poster URL"] === "No poster" || x["Poster URL"] === "Not in table" ? "https://source.unsplash.com/collection/2047031/500x500" + :`https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
`} /> ) : null )} From 0120efffd9e7353dc432a8568dde021cf8badf5a Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 13:35:05 -0400 Subject: [PATCH 253/822] added movie related unsplash link for not found posters --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index ff4da98..15951c3 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -130,7 +130,7 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image={ !x["Poster URL"] || x["Poster URL"] === "No poster" || x["Poster URL"] === "Not in table" ? "https://source.unsplash.com/collection/2047031/500x500" + image={ !x["Poster URL"] || x["Poster URL"] === "No poster" || x["Poster URL"] === "Not in table" ? "https://source.unsplash.com/collection/8744383/500x500" :`https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
`} /> ) : null From 690f131b43fd475ff9c98acdcca7a9315172a141 Mon Sep 17 00:00:00 2001 From: cmruss Date: Thu, 12 Mar 2020 13:38:21 -0400 Subject: [PATCH 254/822] added movie related unsplash link for not found posters --- src/components/dashboard/dashboardv1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index 15951c3..666872b 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -130,7 +130,7 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image={ !x["Poster URL"] || x["Poster URL"] === "No poster" || x["Poster URL"] === "Not in table" ? "https://source.unsplash.com/collection/8744383/500x500" + image={ !x["Poster URL"] || x["Poster URL"] === "No poster" || x["Poster URL"] === "Not in table" ? "https://source.unsplash.com/collection/1736993/500x500" :`https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
`} /> ) : null From af0da585e6622873059568350872d8af92290042 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 12 Mar 2020 13:44:51 -0400 Subject: [PATCH 255/822] adding more styling --- public/success.png | Bin 0 -> 1849 bytes src/components/auth/Congratulations.js | 2 +- src/components/auth/Congratulations.scss | 34 +++++++++++++++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 public/success.png diff --git a/public/success.png b/public/success.png new file mode 100644 index 0000000000000000000000000000000000000000..af80c7ac87844d9b48165a3febf5e21a076f2fd5 GIT binary patch literal 1849 zcmV-92gdk`P)l$f; zU9pZIq-s(iBf>1covtto_D3y9KPClABuwSFP;@NkF!e5@PtEq6og^`cLrj)_%5S@t zb2EXW5EX~pHw$m`+Yl4&7DFRV`wRB~o9zZ<0Q`UlclY+*)mEdS`95`I*Wu17{#k+y zL9xg3+mvu^(l$sLv>p|-`)>9#u~PR@)SJ9E<8~fR`y?goBQX_pWA-~?+-x6 z6-?feR>LC&t8T&A5$DkGT&SQ`v8nK`24=`}LGi{8IvPdU&zdM_Yt8wtEx)`tF6`x^ zzubaj*@yT%-@juZ#!!WfC#yh4z!+F}gtOJZ{c^og$EPcW6O_NkBDjC^VDLrT0J25( zGNEB*Ti!q*?h!_|mTZke)$=fmK`^D#g@*8NPVzmqUvG=aP-~$sbhg^u8@8WDRh=&x zJ?Lup>qlWS)mqT|buoJ#wwp#(VEhNrfLe{TWFL4GMp)Uf5hR`njVrF@#JbZ*O!? zLs;S!WB`gQVO?nPWGZ=W$C=D&{1{V)$tN_f$bbt5Mpe;qCt2lPzT^mY1Cz{P%0Iy3 zyQv%hLnXy?#2ohkp2Gw)EamS;PV@5Gbs@}GcEXOKOcnE*O)!0JCQ8(mCQq1%l>hNC&SEEWQE(Q& z8P>3^m#~myj%Uv>hObQ#k@6Epa+V>W?O9}a0Rfr}OUvht_RRfz*gg^mzx5r60gjN%QC+BGy_yfW{qW90Ks`Qw zv}eNhV^=u9p1MqH=0Kh5#Y*_%!&GvX0I220TOVUZ|8r-ncQp&dypr&g@`t!_K91#V zkH$=64bGX+Um}Xm`qIhNe$-(#Yyqxkg^Ht+@)NSP2+(rn;=%-=A0wa+F~Fg0TV=%( zO=CoeqvZ0_96F2${A{<}_1Fi93A5O)T+|!^iIe-xnxo~XJ^z40%1`JT+ewj&9Fy7( zx(jls3sP&7DgSC~ChGWcOczVrf#QJX=+OhY>kreMO1xif(okMiN%;v`B#w5vxIs(v z<)}n`3X-50jD2VXQi&_0%2|34o$k&%4iJTsfbnM8G%C{Ld#nA#Hy8F4zI5L)v}zNt;O>_SEmf*rN)Z7orV*mvqLVE%!VQo9p- z`wk_jn5UerwO+@2djcr#*xaFvcCv2cLBokA@siw?l1Lbzm*}A|v zySv05wh>``#w8F50#Uc)>U!7!-^<3llsgIl(^ zcqK@rq=8xnRGb6jqSkEX-st|2h2Et`h@1`vcrH9vqIGUH$yncycZp7}L@O~o nT6DnJZH{>#YAd7r@vi>?IV73zQEW~_00000NkvXXu0mjfxiDyq literal 0 HcmV?d00001 diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index adc8769..beabcc8 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -10,7 +10,7 @@ const Congrats = props => {

Congratulations!

Your ratings have been successfully uploaded.

-

Checkbox

+
diff --git a/src/components/auth/Congratulations.scss b/src/components/auth/Congratulations.scss index 526b5e1..819f455 100644 --- a/src/components/auth/Congratulations.scss +++ b/src/components/auth/Congratulations.scss @@ -16,11 +16,39 @@ .textHolder{ margin-top: 10%; - padding: 25px; - width: 300px; - height: 200px; + + width: 400px; + height: 250px; border: 2px solid green; + h1{ + font-size: 35px; + padding-left: 80px; + } + h2{ + font-size: 20px; + padding-left: 10px; + padding-top: 15px; + } + img{ + padding-top: 15px; + } + + button{ + // display: flex; + margin-left: 50px; + // margin-bottom: + } + .Btn{ + + width: 138px; + height: 39px; + border: none; + background: #525252; + color: white; + border-radius: 5px; + } } + } } From e1c81009193bba8c8cb2768d466f65e299214942 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 12:59:37 -0500 Subject: [PATCH 256/822] added react-loading lib --- package-lock.json | 5 +++++ package.json | 1 + src/components/layout/LoadingScreen.js | 21 +++------------------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3da25d3..1bde2b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11213,6 +11213,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==" }, + "react-loading": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-loading/-/react-loading-2.0.3.tgz", + "integrity": "sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A==" + }, "react-redux": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", diff --git a/package.json b/package.json index 123fbeb..5f7c639 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "react-dom": "^16.12.0", "react-ga": "^2.7.0", "react-hook-form": "^4.9.6", + "react-loading": "^2.0.3", "react-redux": "^7.2.0", "react-router-dom": "^5.1.2", "react-scripts": "3.4.0", diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index ab68aa0..97e80e8 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,25 +1,10 @@ -import React, { useState, useEffect } from "react"; +import React from "react"; import { ifDev } from "../../utils/removeAttribute.js"; -import popMovieQuote from "popular-movie-quotes"; // src: https://www.npmjs.com/package/popular-movie-quotes - -export default function LoadingScreen({ history }) { - const [movieQuote, setMovieQuote] = useState("Loading..."); - - const pushTo = () => { - history.push("/watch-list"); - }; - - useEffect(() => { - setMovieQuote(popMovieQuote.getSomeRandom(1)[0]); - }, []); +export default function LoadingScreen() { return (
-

"{movieQuote.quote}"

-

-{movieQuote.movie}

-

Year: {movieQuote.year}

- - +

Hello

); } From 045d1d7cd6d8b77b775f8cbbdf0ab8151daf3281 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 13:00:11 -0500 Subject: [PATCH 257/822] loading screen --- src/components/layout/LoadingScreen.js | 17 +++++++++++++++-- src/components/layout/LoadingScreen.test.js | 5 ++++- src/components/layout/_LoadingScreen.scss | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/components/layout/_LoadingScreen.scss diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 97e80e8..ff27591 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -1,10 +1,23 @@ import React from "react"; +import ReactLoading from "react-loading"; import { ifDev } from "../../utils/removeAttribute.js"; +import "./_LoadingScreen.scss"; export default function LoadingScreen() { return ( -
-

Hello

+
+

Loading Recommendations

+
); } diff --git a/src/components/layout/LoadingScreen.test.js b/src/components/layout/LoadingScreen.test.js index 6d013ba..5e27c8f 100644 --- a/src/components/layout/LoadingScreen.test.js +++ b/src/components/layout/LoadingScreen.test.js @@ -8,6 +8,9 @@ import LoadingScreen from "./LoadingScreen.js"; it("renders loading screen and displays a movie quote in a paragraph", () => { const { container } = render(); - const component = getAllByTestId(container, "loading-screen"); + let component = getAllByTestId(container, "loading-screen-component"); + expect(component.length).toBe(1); + + component = getAllByTestId(container, "loading-object"); expect(component.length).toBe(1); }); diff --git a/src/components/layout/_LoadingScreen.scss b/src/components/layout/_LoadingScreen.scss new file mode 100644 index 0000000..546d930 --- /dev/null +++ b/src/components/layout/_LoadingScreen.scss @@ -0,0 +1,14 @@ +.container.loading-screen { + background: #2e2e2e; + display: flex; + flex-direction: column; + justify-content: center; + h4, + .loading-component { + margin: 4.2% auto; + } + h4 { + font-size: 2.5rem; + color: #00ff19; + } +} From 62d03168220681292236989b46105ca43f63b822 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 13:01:21 -0500 Subject: [PATCH 258/822] route just for testing purposes, will only load in components --- src/App.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.js b/src/App.js index 2cc2a6a..f395d0f 100644 --- a/src/App.js +++ b/src/App.js @@ -8,6 +8,7 @@ import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; import PostLogin from "./components/auth/postLogin.js"; +import LoadingScreen from "./components/layout/LoadingScreen.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -77,6 +78,7 @@ function App() { )} /> +
From 3e1b07221e4e0bf02e21f9f1b9300f9b52f61041 Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Thu, 12 Mar 2020 14:05:42 -0400 Subject: [PATCH 259/822] added changes requested --- public/index.html | 3 --- src/components/auth/Register.js | 2 +- .../auth/__snapshots__/dataUpload.test.js.snap | 13 ------------- src/components/auth/dataUpload.js | 4 ++-- 4 files changed, 3 insertions(+), 19 deletions(-) delete mode 100644 src/components/auth/__snapshots__/dataUpload.test.js.snap diff --git a/public/index.html b/public/index.html index 65d09b4..4f674e1 100644 --- a/public/index.html +++ b/public/index.html @@ -3,7 +3,6 @@ - - - Gróa diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index bb1ffdd..1d8f771 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -65,7 +65,7 @@ class Register extends React.Component { localStorage.setItem("token", res2.data.token); this.props.updateToken(localStorage.getItem("token")); this.props.updateUserid(res2.data.id); - this.props.history.push(`/${res2.data.id}/recommended`); + this.props.history.push(`/setup-wizard/dataupload`); }) .catch(err2 => { console.log(err2, "Username already used"); diff --git a/src/components/auth/__snapshots__/dataUpload.test.js.snap b/src/components/auth/__snapshots__/dataUpload.test.js.snap deleted file mode 100644 index 19e6bec..0000000 --- a/src/components/auth/__snapshots__/dataUpload.test.js.snap +++ /dev/null @@ -1,13 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Button postlogin should render postlogin correctly 1`] = ` - -`; - -exports[`dataupload should render dataupload correctly 1`] = ` - -`; diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index a865799..c94de62 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -40,7 +40,7 @@ function clikR() { const handleChange = e => { let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); - // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. + axiosWithAuth() // this is insantiated when a file is added to input .post(`/${userid}/uploading`, data, { @@ -50,7 +50,7 @@ function clikR() { }) .then(res => { // waiting to set ratings var for 45 seconds. - setTimeout(() => setRatings(res.data), 60 * 1000); + setRatings(res.data) //NEED to direct to uploading screen while retrieving file. props.history.push(`/${res.data.id}/upload`); }) From 3f3acb6f910c86e02c47a497028e517ccf7727c0 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 13:19:50 -0500 Subject: [PATCH 260/822] Martin's requested changes --- src/components/layout/LoadingScreen.js | 4 ++-- src/components/layout/_LoadingScreen.scss | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index ff27591..8329deb 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -9,12 +9,12 @@ export default function LoadingScreen() { className="container loading-screen" data-test={ifDev("loading-screen-component")} > -

Loading Recommendations

+

Loading recommendations

diff --git a/src/components/layout/_LoadingScreen.scss b/src/components/layout/_LoadingScreen.scss index 546d930..445c633 100644 --- a/src/components/layout/_LoadingScreen.scss +++ b/src/components/layout/_LoadingScreen.scss @@ -9,6 +9,6 @@ } h4 { font-size: 2.5rem; - color: #00ff19; + color: #ffffff; } } From 821514e7d163c397429aeeb8f1d254244725db83 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 13:41:33 -0500 Subject: [PATCH 261/822] final update from Martin for draft --- src/components/layout/LoadingScreen.js | 9 ++++++++- src/components/layout/_LoadingScreen.scss | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 8329deb..b5dd665 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -9,7 +9,9 @@ export default function LoadingScreen() { className="container loading-screen" data-test={ifDev("loading-screen-component")} > -

Loading recommendations

+
+

Loading recommendations

+
+

+ Based on the connection to our server, +
+ this process could take up to a minute. +

); } diff --git a/src/components/layout/_LoadingScreen.scss b/src/components/layout/_LoadingScreen.scss index 445c633..1f8d9a4 100644 --- a/src/components/layout/_LoadingScreen.scss +++ b/src/components/layout/_LoadingScreen.scss @@ -4,11 +4,18 @@ flex-direction: column; justify-content: center; h4, + p, .loading-component { - margin: 4.2% auto; + margin: 4.5% auto; } h4 { font-size: 2.5rem; color: #ffffff; + text-align: center; + } + p { + font-size: 1.4rem; + text-align: center; + line-height: 2rem; } } From d2e6fa8f7eb55c195ee9393b0765901928c34b95 Mon Sep 17 00:00:00 2001 From: marielapg Date: Thu, 12 Mar 2020 12:50:10 -0700 Subject: [PATCH 262/822] styling is complete --- public/success.png | Bin 1849 -> 1819 bytes src/components/auth/Congratulations.js | 10 +++--- src/components/auth/Congratulations.scss | 42 +++++++++++------------ 3 files changed, 27 insertions(+), 25 deletions(-) mode change 100644 => 100755 public/success.png diff --git a/public/success.png b/public/success.png old mode 100644 new mode 100755 index af80c7ac87844d9b48165a3febf5e21a076f2fd5..f01d13f14b619ff8e17634059b62da8d9484a705 GIT binary patch delta 1753 zcmV;~1}6Er4x0{;R)4TbL_t(|0o|NiR@+7x$G;iLX20scARoc#gRYs4)?YFqCgAY57fPZVw#f<}SasF%X3NnI0 ziqsG1=dE)81qfEh|5U{*o`*Ov=-_*_QMgvgu`gO1|J_1Lq$149@mvi!?Bc^3qzj4E z{IJ$Lf`my_m}kf3O#=lHz$%a-45uDWwMLQxB_hl(C*RjiaQ3qnWRfHWiX}|__;JPJ z<{_j%WmIXIj(_zsjt%0V$;!L(wq=-?kUvp~y2Z@P<+tS>&_sE}kf-UF`}<6=O(*~Y z;GlPB?zOi%9hKK92{V{Fr}(f61%hmk;n+(mQ%hPH62<1mr&$|VT~x)95~k>)3{ep$ zQkaJ#$`Dy`LcJ0h+J__xLDxcdvWC|dc3h}1_IK9qLw^!wglZW*YuEvS!cd%ou1-4+ z$U78ngvB|&HpX?!6uiaFhO-2-ZbyhC&UptMrw*LGka$hU6xO1jy)pfcx4F4rG*Qmh zyGtWmT2GH3H_WIHm%%(n$duA7P41eSN|Yhv6ski(prV!~tgXrIA88bzU=nXpqa=88 z5N1047B9kM-VG(0&^E_uAMA@+ux+Wt}v+Zb0`30SHh;y%I|Zrb34X7Ej$~;a#^<>2VHZRD6YYE#yyJ` z!mCcQI<`$M!7d@sOo#katenizH6&7Ub(mP>eJ9_eB`D+{g$ynvScf*Szs@Hc>N%tl zHGhSY4oq!Ybb$6{0dk5X;7wFlkz$sl15=D)DpYpJWqE<7(D`~Vv`{vPR1*(OITH&U zPauE7M1=hJhjF1D$VH)TV{o{&$a6IlS@P?v?>C5Pt(rWI}$zO%hW^OPEKt9oQfzafA>rK?A{H zHEIe`%!1QD^-2I4-&;_`0<#jf|HFFk04K$&yJk)n9BEOD57UTQ{Ge{7-uf7clRI1c zr{#cHk`kUm{*Y?i5bR!TXHiUZfOW_#=`0bgEuYNoM;$~XfZT4FI5HtWL8B$B27e&K zeiO$t`wSYOd)|>*u|zf_LL8|oKlRWdBOHKhj@>)$Ma4MUcHKqI5zvK~9+ejHVSDTZ zBtm{dwXhu*vN5sC4yp@sR^HAX;ET3t1feKTqK=D;dfUGf=ADI!9;WT_+A(^h;5y`DF7v7JWA4qZCUWzZ$@LPv431iBs6LW z9b=qTk{H0)wT}sNzR_zYIBJxQaT^-9US4 zhP@bTC_B~{i%veVxWet(2-sw)+}JF84&vtS-%{v|h&;WgZfs$EDnRpJ3K9kLp`W9& zd#TUup@<_Z3L!n9i!P3eD1>zTM53sjXD(GlA(Z+`_eE{t-=fVS0)Jg{vwLSMi9%@m z21*baXS=z*eFuX#ic`FXN*-w vkHc;5GBO->S2#~TV}Jb`47kej%e(#uX5LoK9OC_&00000NkvXXu0mjf_Xsxz delta 1783 zcmVVH*#*!@I zzq?<*_wSY&jF6W<=1ahN$>L&G02BqV5^ZN7irvTI_BuW`7=MEX6L8Czs5@=AzWBa% z3nPL-ic}5@1ux&;@PJkDLM0)f00|(W@ElhhM2&myb#48>I;2D@!Ym$7mBE5t{OZe) zCJaRq;^^1a)*CR4QDK&jr#FGauITF;X@gy{jvu6IQXnJ3EWVwtFbnoaEl58m1xh4L z<+xCEEax!wE`Os>&Gwv~Br%9XOqPDiZ@ZRrGl8NI6^Gk53vct=5EJbdLnBT53-W$K6PZ*;m#@kS%M5fvB&bmvu^(l$sLv>p|-`)>9 z#u~PR@)SJ9E<8~fR`y?goBQX_pWA-~?+-x66-?feR>LC&t8T&A5$DkGT&SQ`v8nK` z24=`}LGi{8IvPdU&zdM_Yt8wtEx)`tF6`x^zubaj*@yT%-@juZ#!!WfC#yh4z!+F} zgtOJZ{eN=3QOBn%g%gy&#v-_X^I-5r+W@jf^)jJhWn11rAnp-Hww7#-Le=vyi$O4@ z(uIcbZ%*<(wO?Itun{Dl2#qVQ<;JsDtxr8h=6^8{cEVqf0R)=g=WDI4Vf$sv=i(4z z(!967B=1JH7#G|!WB`gQu5kB44@wv(r#^3QbWTH9;uT~7iYsAVXz^q!d2Pp;%xU}> zQ-;YWG_J^i3kF72(QzkP;vj^u9vx>2EmJl$9DU$6lk@f<0Aht z_RRfz*gg^mzx5r60gjN%QC+BGy_yfW{qW90Ks`Qwv}eNhV^=u9p1MqH=0Kh5#Y*_% z!&GvX0I220TOVUZ|8r-ncQp&dypr&g@`t!_K91#VkH$=64bGX+Um}Xm`qIhNet*wFuC1<>JBwpdTZk4l%%?Y+Gf;5=~=7h@<54(;PaC2>fif-1XQ8 zhzYaUu3Xd{0g03Q%$lR+r#=6GLds9*8rw;ciyV{M4!R3+s0&hSlPUjdYbNUWaZDFW z+kxVM=IGG_x$6(poJzc3ZPHL)RewqO30WkLcDlGhOY`NZM12a9pcssOXarJ;E2GL; zdJvuN&N~kxah;8RgpM^YWIsCVJ_D1j*PV$&=1CG7~3lJ zw-#ccx<-dQmX|UF>+`|P=7V-dBRvACMXz_0R7uL3$4c#a6@JzLT|EIIGH{&eZv-2 ziJTs zfbnM8~LjB6YMhhMO5FfG_S!hsR-jkF^Gd(wzzmDNTj5JS_V{{1LLCB zY~|kQ{*Z; { +const Congrats = () => { return (
-

Congratulations!

+

Congratulations!

Your ratings have been successfully uploaded.

- - +
+ +
+
diff --git a/src/components/auth/Congratulations.scss b/src/components/auth/Congratulations.scss index 819f455..c49e277 100644 --- a/src/components/auth/Congratulations.scss +++ b/src/components/auth/Congratulations.scss @@ -1,56 +1,56 @@ .CongratsPage{ - border: 2px solid red; + border: 2px solid #505050; background: #505050; height: 100vh; + .CenterBox{ display:flex; margin-top: 15%; justify-content: center; - + .congratsForm{ display: flex; justify-content: center; background: white; width: 600px; height: 400px; - + .textHolder{ margin-top: 10%; - width: 400px; height: 250px; - border: 2px solid green; + h1{ font-size: 35px; - padding-left: 80px; + padding-left: 80px; + margin-top: 10px; } + h2{ font-size: 20px; padding-left: 10px; - padding-top: 15px; + padding-top: 17px; + padding: 14px; } - img{ - padding-top: 15px; + + .image{ + display: flex; + justify-content: center; + margin: 16px; } button{ - // display: flex; - margin-left: 50px; - // margin-bottom: - } - .Btn{ - + font-size: 14px; width: 138px; height: 39px; - border: none; + margin-left: 140px; + margin-top: 23px; background: #525252; color: white; border-radius: 5px; - } + border:none; + } } - - } + } } - - } \ No newline at end of file From f9cef503ea4c921a5784b773aed70b916f95d1a2 Mon Sep 17 00:00:00 2001 From: marielapg Date: Thu, 12 Mar 2020 14:50:32 -0700 Subject: [PATCH 263/822] congratulations testing --- src/components/auth/Congratulations.test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/components/auth/Congratulations.test.js diff --git a/src/components/auth/Congratulations.test.js b/src/components/auth/Congratulations.test.js new file mode 100644 index 0000000..d339edc --- /dev/null +++ b/src/components/auth/Congratulations.test.js @@ -0,0 +1,17 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; +import {BrowserRouter as Router } from "react-router-dom"; + +// component to be tested +import Congratulations from "./Congratulations.js"; + +it("renders Congratulations component", () =>{ + const { container } = render( + + + + ); + const component = getAllByTestId(container, "congrats-screen"); + expect(component.length).toBe(1); +}); \ No newline at end of file From 74dffbc38ab9a02bb8451153ce2863019b58262d Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 16:55:54 -0500 Subject: [PATCH 264/822] updated login btn to signup added register --- src/components/auth/Register.js | 32 ++++++++++++------ src/components/auth/_Register.scss | 45 ++++++++++++++++---------- src/components/layout/LoadingScreen.js | 4 +-- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index bb1ffdd..3fa8302 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -91,7 +91,11 @@ class Register extends React.Component { groa logo
-
+

Register

{/* divs with changing classnames updates error handling for form */}
Email is required
)} - +
Username is required
)} - {submitted && user.user_name.length < 6 && ( -
Username is required to be 6 characters or more
+ {submitted && user.user_name.length < 6 && ( +
+ Username is required to be 6 characters or more{" "} +
)} - + {errorStatus && user.user_name && (
Username is already in use
)} @@ -154,7 +160,9 @@ class Register extends React.Component {
Password is required
)} {submitted && user.password.length < 6 && ( -
Password is required to be 6 characters or more
+
+ Password is required to be 6 characters or more{" "} +
)}
Passwords do not match
)} - -
- +
+ {/* todo: add Remember functionality */} +
+ +
Remember me
+
+
+ +
diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index 448e6f7..f1d6ea0 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -9,14 +9,14 @@ rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.85) ); - - .registerNav{ + + .registerNav { display: flex; justify-content: flex-end; padding: 0.5% 1%; } - .boxHolder{ + .boxHolder { display: flex; } @@ -68,21 +68,32 @@ font-size: 1.1rem; } - .BottomLogin { + .bottom-form { display: flex; - justify-content: flex-end; - margin-top: 10px; - .LoginBtn { - max-width: 115px; - width: 100%; - height: 36px; - border-radius: 4px; - background: #21242c; - color: white; - font-size: 14px; - &:hover { - background: gray; - color: #21242c; + justify-content: space-between; + margin: 3% auto; + .check-box-container { + display: flex; + h5 { + color: black; + } + } + + .signup-btn-container { + display: flex; + justify-content: flex-end; + .signup-btn { + max-width: 215px; + width: 100%; + height: 36px; + border-radius: 4px; + background: #21242c; + color: white; + font-size: 14px; + &:hover { + background: gray; + color: #21242c; + } } } } diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index b5dd665..8472c22 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -9,9 +9,7 @@ export default function LoadingScreen() { className="container loading-screen" data-test={ifDev("loading-screen-component")} > -
-

Loading recommendations

-
+

Loading recommendations

Date: Thu, 12 Mar 2020 18:19:47 -0400 Subject: [PATCH 265/822] pulled from master --- src/App.js | 14 +++++++------ src/components/auth/dataUpload.js | 9 ++++---- src/components/dashboard/dashboardv1.js | 28 +++++++++++++++---------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/App.js b/src/App.js index 806afe9..fe93a45 100644 --- a/src/App.js +++ b/src/App.js @@ -7,7 +7,9 @@ import Dashboardv1 from "./components/dashboard/dashboardv1.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; -import DataUpload from "./components/auth/dataUpload"; +import PostLogin from "./components/auth/postLogin.js"; +import LoadingScreen from "./components/layout/LoadingScreen.js"; +import Congrats from "./components/auth/Congratulations.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -76,16 +78,16 @@ function App() { /> )} /> - {/* Data upload Route*/} + +
); } -export default App; +export default App; \ No newline at end of file diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index c94de62..4cf0bdb 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -9,9 +9,8 @@ import './dataUpload.scss' const DataUpload = props => { -const [input, setInput] = useState({file:''}) - const [ratings, setRatings] = useState({}) - const [loading, setLoading] = useState() +const [input, setInput] = useState({file:''}) +const [loading, setLoading] = useState() @@ -50,9 +49,9 @@ function clikR() { }) .then(res => { // waiting to set ratings var for 45 seconds. - setRatings(res.data) + props.setRatings(res.data) //NEED to direct to uploading screen while retrieving file. - props.history.push(`/${res.data.id}/upload`); + // props.history.push(`/${props.userid}/recommended`); }) .catch(err => { console.log(err); diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js index c3aba14..ebb63ed 100644 --- a/src/components/dashboard/dashboardv1.js +++ b/src/components/dashboard/dashboardv1.js @@ -10,23 +10,23 @@ const Dashboardv1 = props => { const [ratings, setRatings] = useState({}); const [recommendations, setRecommendations] = useState([]); + const config = { + headers: { + "Content-Type": "multipart/form-data" + } + }; + let { userid } = props.match.params; const changeHandler = e => { // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData // packages up form to make it able to send over https let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); - // history.location.state.userid is just where I am holding userid for now from the Register page so I do not need to implment redux. axiosWithAuth() - // this is insantiated when a file is added to input - .post(`/${userid}/uploading`, data, { - headers: { - "Content-Type": "multipart/form-data" - } - }) + // this is insantiated when a file is added to input --> we should think about adding a submit button + .post(`/${userid}/uploading`, data, config) .then(res => { - // waiting to set ratings var for 45 seconds. - setTimeout(() => setRatings(res.data), 60 * 1000); + setRatings(res.data); }) .catch(err => { console.log(err); // --> I think these errors we should be sending to an error page. @@ -121,7 +121,13 @@ const Dashboardv1 = props => { name={x.Title} year={x.Year} rating={x["Average Rating"]} - image="https://source.unsplash.com/collection/2047031/500x500" + image={ + !x["Poster URL"] || + x["Poster URL"] === "No poster" || + x["Poster URL"] === "Not in table" + ? "https://source.unsplash.com/collection/1736993/500x500" + : `https://image.tmdb.org/t/p/w500/${x["Poster URL"]}?api_key=18814be112b8b0167bc919c307bd596e
` + } /> ) : null )} @@ -131,4 +137,4 @@ const Dashboardv1 = props => { } }; -export default Dashboardv1; +export default Dashboardv1; \ No newline at end of file From 0fd7479acc756ef4b60fb3951a47a1147c318942 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:18:58 -0500 Subject: [PATCH 266/822] deleted dashboard files threw ts errors --- src/components/dashboard/dash.scss | 235 ------------------- src/components/dashboard/dashboardv1.js | 140 ----------- src/components/dashboard/dashboardv1.test.js | 23 -- 3 files changed, 398 deletions(-) delete mode 100644 src/components/dashboard/dash.scss delete mode 100644 src/components/dashboard/dashboardv1.js delete mode 100644 src/components/dashboard/dashboardv1.test.js diff --git a/src/components/dashboard/dash.scss b/src/components/dashboard/dash.scss deleted file mode 100644 index dabeff1..0000000 --- a/src/components/dashboard/dash.scss +++ /dev/null @@ -1,235 +0,0 @@ -.bigContainer { - background-color: white; -} - -.DB-Container { - margin-bottom: 0px; - // background-color: black; - // background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - background-color: #7a7a7a; - width: 100%; - height: 1120px; - // color: #ffffff; - color: black; - display: flex; - flex-direction: column; - justify-content: space-around; - overflow-y: hidden; - overflow: hidden scroll; - - background-size: contain; - - // overflow-x: hidden; - - .h2-p { - width: 50%; - height: 30%; - - h2 { - margin: auto; - // margin-top: -50px; - margin-top: 50px; - margin-bottom: -50px; - margin-left: 100px; - text-align: center; - height: 200px; - font-size: 4rem; - - color: white; - background-color: linear-gradient( - to bottom, - black 0%, - rgba(0, 0, 0, 0.9), - rgba(0, 0, 0, 0.7), - rgba(0, 0, 0, 0.85) - ); - // border: 2px solid white; - padding-top: 100px; - transition: 0.3s; - &:hover { - text-shadow: 0px 0px 10px white; - } - } - } - .flash { - text-shadow: 0px 0px 10px white; - } - .loading { - text-align: center; - transition: 1.3s; - text-shadow: 0px 0px 10px white; - } - .settings-container { - height: 300px; - border: 2px solid green; - } - .box-container { - height: 1000px; - width: 90%; - // border: 2px solid blue; - display: flex; - flex-direction: row; - // justify-content: space-around; - margin-left: 250px; - margin-right: 600px; - - flex-wrap: wrap; - - .box-container2 { - height: 1000px; - width: 90%; - // border: 2px solid blue; - display: flex; - flex-direction: row; - // justify-content: space-around; - margin-right: -300px; - padding-right: 0px; - margin-top: -50px; - flex-wrap: wrap; - // border: 2px solid red; - } - - .box { - margin-top: auto; - // margin-bottom: auto; - height: 380px; - width: 347px; - // border: 2px solid white; - display: flex; - border-radius: 0.1rem; - // background-color: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); - // border: 1px solid grey; - background-color: #7a7a7a; - transition: 0.4s; - // &:hover{ - // box-shadow: 0px 0px 5px grey, - // -10px -0px 20px #ffffff; - // } - .movie-poster { - width: 164px; - height: 246px; - // border: 2px solid lightGrey; - //margin: auto; - margin-left: 0px; - margin-top: 68px; - margin-bottom: 66px; - // position: absolute; - // left: 0%; - // right: 54.76%; - // top: 17.13%; - // bottom: 18.82%; - background: white; //url(Image.png), - &:hover { - box-shadow: 0px 0px 3px white; - } - } - .text-container { - width: 80px; - height: 200px; - margin: auto; - margin-left: 75px; - margin-top: 70px; - h2 { - margin-left: -50px; - font-size: 1rem; - font-family: Roboto; - width: 150px; - height: 30px; - // border: 1px solid grey; - background-color: transparent; - color: white; - text-align: left; - padding-top: 0px; - &:hover { - text-shadow: 0px 0px 2px #7a7a7a; - } - } - } - .checkboxes { - margin-left: -50px; - - width: 150px; - height: 120px; - // border: 1px solid red; - display: flex; - flex-direction: column; - justify-content: space-evenly; - } - } - } - - .form-hover { - height: 30%; - width: 30%; - margin: auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin-top: -100px; - margin-bottom: -170px; - margin-left: 200px; - - .form-directions { - width: 200px; - margin: 20px auto; - margin-top: -175px; - visibility: hidden; - text-align: center; - transition: 0.5s; - margin-right: -500px; - margin-bottom: 300px; - height: 100px; - color: black; - } - - #zip-input { - margin-left: 600px; - margin-top: 100px; - width: 400px; - height: 40px; - font-size: 1.3rem; - padding-left: 100px; - font-family: Roboto; - background-color: lightBlack; - &:hover { - box-shadow: 0px 0px 5px white; - } - } - #submit-button { - // margin:0px; - display: none; - margin-top: -200px; - // margin-bottom:600px; - margin-left: 490px; - - height: 40px; - width: 100px; - font-size: 1.2rem; - border-radius: 1.3rem; - &:hover { - box-shadow: -5px 0px 30px white; - transition: 0.2s; - } - } - &:hover { - transition: 0.5s; - .form-directions { - transition: 1.5s; - visibility: visible; - text-shadow: 0px 0px 30px white; - } - } - } - input.textboxsize { - margin-left: 20px; - transform: scale(1.5); - - &:hover { - box-shadow: 0px 0px 3px white; - } - } - - #zip-form { - margin-left: auto; - } -} diff --git a/src/components/dashboard/dashboardv1.js b/src/components/dashboard/dashboardv1.js deleted file mode 100644 index efda872..0000000 --- a/src/components/dashboard/dashboardv1.js +++ /dev/null @@ -1,140 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; - -// local imports -import "./_Dashboard.scss"; -import MovieCard from "../movies/MovieCard.js"; - -const Dashboardv1 = props => { - const [input] = useState({ file: "" }); - const [ratings, setRatings] = useState({}); - const [recommendations, setRecommendations] = useState([]); - - const config = { - headers: { - "Content-Type": "multipart/form-data" - } - }; - - let { userid } = props.match.params; - const changeHandler = e => { - // https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData - // packages up form to make it able to send over https - let data = new FormData(); - data.append("movies", e.target.files[0], e.target.files[0].name); - axiosWithAuth() - // this is insantiated when a file is added to input --> we should think about adding a submit button - .post(`/${userid}/uploading`, data, config) - .then(res => { - setRatings(res.data); - }) - .catch(err => { - console.log(err); // --> I think these errors we should be sending to an error page. - }); - // clears out previous uploaded file - data = new FormData(); - }; - - useEffect(() => { - // only if ratings has data in it, and the necessary parts of the history object to run the recommendations call - if (Object.keys(ratings).length === 0 || !userid) return () => null; - - // when ratings is updated this call to recommendations will be called - axiosWithAuth() - .get(`/${userid}/recommendations`) - .then(res => { - setRecommendations(res.data.recommendation_json); - }) - .catch(err => - console.log("Something went wrong in fetching recommendations.", err) - ); - }, [ratings, userid]); - - switch (true) { - case !recommendations?.length: - return ( -
-
- {/* will create a component in the future*/} -
- -
- {Object.keys(ratings).length === 0 ? ( -

- Upload your letterboxd ZIP file here to get all past movie - ratings. -
- After you upload, it should take a full minute to give you a - success message -

- ) : ( -

- {ratings.message} -

- )} -
-
- ); - default: - return ( -
-
-
- -
- {Object.keys(ratings).length === 0 ? ( -

- upload your letterboxd csv file here to get all past movie - ratings -

- ) : ( -

- {ratings.message} -

- )} -
- - {/* this shows the recommendations movie cards */} -

Your Recommendations

-
- {/* should off set up to 200 and then retun nothing */} - {recommendations.map((x, index) => - index < 201 ? ( - - ) : null - )} -
-
- ); - } -}; - -export default Dashboardv1; diff --git a/src/components/dashboard/dashboardv1.test.js b/src/components/dashboard/dashboardv1.test.js deleted file mode 100644 index 3583c17..0000000 --- a/src/components/dashboard/dashboardv1.test.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from "react"; -import { render } from "@testing-library/react"; -import { Router, Route } from "react-router-dom"; -import { getAllByTestId } from "../../utils/test-utils.js"; - -// component to be tested. -import Dashboardv1 from "./Dashboardv1.js"; -import { createMemoryHistory } from "history"; - -it("renders dashboardv1 component on the path '/:userid/recommendations", () => { - let userid = 2394572390487239458732957324985723497; - const route = `/${userid}/recommended`; - let history = createMemoryHistory({ initialEntries: [route] }); - - const { container } = render( - - - - ); - - const component = getAllByTestId(container, "dashboard-screen"); - expect(component.length).toBe(1); -}); From 456101c746511cf8bc69bb17532223c534d4c3bc Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:19:16 -0500 Subject: [PATCH 267/822] files from merge --- src/components/auth/Congratulations.js | 35 ++++++++++++-------------- src/components/auth/login.js | 1 + 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index ecfa0b5..899074f 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -2,24 +2,21 @@ import React from "react"; import "../auth/Congratulations.scss"; const Congrats = () => { - - return ( -
-
-
-
-

Congratulations!

-

Your ratings have been successfully uploaded.

-
- -
- -
- -
+ return ( +
+
+
+
+

Congratulations!

+

Your ratings have been successfully uploaded.

+
+ Success png
- + +
- ) -} -export default Congrats \ No newline at end of file +
+
+ ); +}; +export default Congrats; diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 5cb18ec..ee14730 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -59,6 +59,7 @@ class LoginPage extends React.Component { axiosWithAuth() .post("/login", this.state.user) .then(res => { + console.log(res.data.id); localStorage.setItem("token", res.data.token); // updates token to refresh navbar this.props.updateToken(localStorage.getItem("token")); From f132c352850621c396baea421b4d8f9eec6b6826 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:19:58 -0500 Subject: [PATCH 268/822] recommendations component --- src/components/dashboard/Recommendations.js | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/components/dashboard/Recommendations.js diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js new file mode 100644 index 0000000..480f4d5 --- /dev/null +++ b/src/components/dashboard/Recommendations.js @@ -0,0 +1,58 @@ +import React, { useState, useEffect } from "react"; +// tools +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { ifDev } from "../../utils/removeAttribute.js"; +import "./_Dashboard.scss"; +// children components +import LoadingScreen from "../layout/LoadingScreen.js"; +import MovieCard from "../movies/MovieCard.js"; + +export default function Recommendations({ initialState = [] }) { + const [recommendations, setRecommendations] = useState(initialState); + + useEffect(() => { + axiosWithAuth() + // testing with userid 48485 until everything is integrated + // .get(`/${match.params.userid}/recommendations`) + .get("/48485/recommendations") + .then(res => setRecommendations(res.data.recommendation_json)) + .catch(() => ( +

+ Sorry something went wrong while trying to get your recommendations +

+ )); + }, []); + + if (!recommendations.length) return ; + return ( +
+

Your recommendations

+
+ {recommendations.map((x, index) => { + let posterURI = x["Poster URL"]; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + + return ( + + ); + })} +
+
+ ); +} From 3a869012ef7560e3cec9ae8215ce9aabc88ccb05 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:20:25 -0500 Subject: [PATCH 269/822] added tests and updated minor styling --- .../dashboard/Recommendations.test.js | 34 ++++++++++++++ src/components/dashboard/_Dashboard.scss | 46 +++++++------------ src/components/movies/MovieCard.js | 6 +-- 3 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 src/components/dashboard/Recommendations.test.js diff --git a/src/components/dashboard/Recommendations.test.js b/src/components/dashboard/Recommendations.test.js new file mode 100644 index 0000000..0e25529 --- /dev/null +++ b/src/components/dashboard/Recommendations.test.js @@ -0,0 +1,34 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../utils/test-utils.js"; +import { BrowserRouter as Router } from "react-router-dom"; +// component to be tested. +import Recommendations from "./Recommendations.js"; + +it("renders Recommendations with array has length.", async () => { + const fakeRecommendations = [ + { Title: "The Godfather", Year: "1972" }, + { Title: "The Wizard of Oz", Year: "1939" }, + { Title: "Citizen Kane", Year: "1941" } + ]; + + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "recommendations-component"); + expect(component.length).toBe(1); +}); + +it("renders LoadingScreen when recommendations array is empty", () => { + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "loading-screen-component"); + expect(component.length).toBe(1); +}); diff --git a/src/components/dashboard/_Dashboard.scss b/src/components/dashboard/_Dashboard.scss index 1e9672c..7dd78a2 100644 --- a/src/components/dashboard/_Dashboard.scss +++ b/src/components/dashboard/_Dashboard.scss @@ -1,43 +1,29 @@ -.bigContainer { +.container.recommendations { font-family: lato; - background: whitesmoke; + background: linear-gradient( + to bottom, + black 0%, + rgba(0, 0, 0, 0.9), + rgba(0, 0, 0, 0.7), + rgba(0, 0, 0, 0.85) + ); display: flex; flex-direction: column; - - .form-hover { - margin: 2% auto; - input { - font-size: 1.3rem; - } - #zip-input { - margin: 3% auto; - padding: 15%; - background: white; - border: 3px dashed grey; - border-radius: 4px; - } - .form-directions { - font-size: 1.1rem; - margin: 2% auto; - } - .upload-successful { - font-size: 1.2rem; - margin: 2% auto; - color: green; - } - } + color: black; h2 { font-size: 24px; text-align: center; margin: 2% auto; } - .box-container { - width: 80%; + .movie-cards { + width: 70%; margin: 3% auto; display: flex; flex-direction: row; flex-wrap: wrap; .box { + border-radius: 10px; + background: white; width: 100%; max-width: 347px; height: auto; @@ -52,9 +38,11 @@ } .text-container { color: black; - margin-left: 5%; + width: 100%; + max-width: 40%; + height: auto; + margin: 1% auto; p { - padding: 10% 0%; font-size: 1.1rem; } } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 8451ce3..cf0ce11 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,15 +1,13 @@ import React from "react"; // more fields will be appearing according to the Figma file -export default function MovieCard({ name, year, rating, image }) { +export default function MovieCard({ name, year, image }) { return (
Random Movie poster as a placeholder.
- {/* changed to p tags because it is more accessible for screen readers */} -

{name}

+

{name}

{year}

-

Average Rating: {rating}

); From 76c155086670a9d2cd45ecd19dc5de5983e833e8 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:20:50 -0500 Subject: [PATCH 270/822] edited import for recommendation in app --- src/App.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 81f3fee..3161a0b 100644 --- a/src/App.js +++ b/src/App.js @@ -3,7 +3,7 @@ import { Route } from "react-router-dom"; // local imports import PrivateRoute from "./utils/privateRoute.js"; -import Dashboardv1 from "./components/dashboard/dashboardv1.js"; +import Recommendations from "./components/dashboard/Recommendations.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; @@ -52,7 +52,7 @@ function App() { )} /> - +
From fc603b7714bc4893765d2916fac2234842b52464 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Thu, 12 Mar 2020 23:30:58 -0500 Subject: [PATCH 271/822] added env var to docs --- README.md | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 6e5bb4e..d639a11 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,20 @@ -🚫 Note: All lines that start with 🚫 are instructions and should be deleted before this is posted to your portfolio. This is intended to be a guideline, feel free to add your own flare to it. - -🚫 The numbers 1ļøāƒ£ through 5ļøāƒ£ next to each item represent the week that part of the docs needs to be comepleted by. Make sure to delete the numbers by the end of Labs. - -🚫 Each student has a required minimum number of meaningful PRs each week per the rubric. Contributing to docs does NOT count as a PR to meet your weekly requirements. - # Gróa You can find the deployed project at [https://www.groa.us/](https://www.groa.us/). ## 4ļøāƒ£ Contributors -🚫Add contributor info below, make sure add images and edit the social links for each member. Add to or delete these place-holders as needed - -| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) -| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | -| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/marielapg) | -| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | - - +| [Brianna Keune](https://github.com/briannakeune) | [Benjamin Solt](https://github.com/bensolt) | [Mariela Gonzales](https://github.com/marielapg) | +| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | +| [](https://github.com/briannakeune) | [](https://github.com/bensolt) | [](https://github.com/marielapg) | +| [ ](https://github.com/briannakeune) | [ ](https://github.com/bensolt) | [ ](https://github.com/marielapg) | +| [ ](https://www.linkedin.com/in/brianna-keune/) | [ ](https://www.linkedin.com/in/ben-solt-8447bb94) | [ ](https://www.linkedin.com/in/marielapg) | -|[Billy Gingrich](https://github.com/bgingrich) | [TJ Katalenas](https://github.com/robomantis19) | [Cody M Russell](https://github.com/cmruss) | -| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -|[](https://github.com/bgingrich) | [](https://github.com/robomantis19) | [](https://github.com/cmruss) | -| [ ](https://github.com/bgingrich) | [ ](https://github.com/robomantis19) | [ ](https://github.com/cmruss) | -| [ ](https://www.linkedin.com/in/whgingrich) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/cm-russell) | +| [Billy Gingrich](https://github.com/bgingrich) | [TJ Katalenas](https://github.com/robomantis19) | [Cody M Russell](https://github.com/cmruss) | +| :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [](https://github.com/bgingrich) | [](https://github.com/robomantis19) | [](https://github.com/cmruss) | +| [ ](https://github.com/bgingrich) | [ ](https://github.com/robomantis19) | [ ](https://github.com/cmruss) | +| [ ](https://www.linkedin.com/in/whgingrich) | [ ](https://www.linkedin.com/) | [ ](https://www.linkedin.com/in/cm-russell) |

@@ -89,7 +79,8 @@ Gróa will use our Discovery Engine to present movies suited to your taste based In order for the app to function correctly, the user must set up their own environment variables. There should be a .env file containing the following: - * REACT_APP_ANALYTICS_ID - this is your Google analytics key, which can be generated in the Google Analytics Console. + REACT_APP_ANALYTICS_ID - this is your Google analytics key, which can be generated in the Google Analytics Console. + REACT_APP_TMDB_API_KEY - this is your API key from TMDb it sources the movie posters we user. # 5ļøāƒ£ Content Licenses From d2b46c05c467c1950406a67dd311dcd910cffffe Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 12:49:10 -0500 Subject: [PATCH 272/822] updated login register pages to share classnames and scss file --- src/components/auth/Register.js | 19 ++-- src/components/auth/_Register.scss | 26 +++-- src/components/auth/login.js | 167 +++++++++++++++-------------- 3 files changed, 113 insertions(+), 99 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 3fa8302..2fc01f8 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -4,7 +4,7 @@ import { ifDev } from "../../utils/removeAttribute.js"; // styling imports import "./_Register.scss"; -import GroaWhite from "./GroaWhite.png"; +import GroaLogo from "./Groa-logo-B2AA.png"; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; @@ -83,16 +83,17 @@ class Register extends React.Component { return (
-
+
-
-
- groa logo +
+
+ Groa Loga
-
+ +
@@ -186,9 +187,9 @@ class Register extends React.Component { {/* todo: add Remember functionality */}
-
Remember me
+

Remember me

-
+
diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss index f1d6ea0..aff37cd 100644 --- a/src/components/auth/_Register.scss +++ b/src/components/auth/_Register.scss @@ -10,17 +10,18 @@ rgba(0, 0, 0, 0.85) ); - .registerNav { + .onboarding-nav { display: flex; justify-content: flex-end; padding: 0.5% 1%; } - .boxHolder { + .box-container { display: flex; + margin: 7% auto; } - .boxLeft { + .box-left { width: 40%; margin: auto; .logo { @@ -30,7 +31,7 @@ } } - .boxRight { + .box-right { display: flex; flex-direction: column; justify-content: center; @@ -51,7 +52,7 @@ .form { margin: auto; padding: 3%; - max-width: 370px; + max-width: 393px; width: 100%; } @@ -69,22 +70,27 @@ } .bottom-form { + width: 100%; display: flex; justify-content: space-between; - margin: 3% auto; + margin: 3% 0; .check-box-container { display: flex; - h5 { + p { color: black; } } - .signup-btn-container { + .btn-container { + width: 100%; display: flex; justify-content: flex-end; - .signup-btn { - max-width: 215px; + .signup-btn, + button.login-btn { + align-self: end; + border: none; width: 100%; + max-width: 115px; height: 36px; border-radius: 4px; background: #21242c; diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 5cb18ec..67f2b52 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -1,12 +1,12 @@ import React from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth"; -import { Link } from "react-router-dom"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions/loginAction"; -import "./login.scss"; -import Groa2 from "../auth/Groa-logo-B2AA.png"; +import GroaLogo from "../auth/Groa-logo-B2AA.png"; import { ifDev } from "../../utils/removeAttribute.js"; +import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; +import "./_Register.scss"; class LoginPage extends React.Component { constructor(props) { @@ -77,96 +77,103 @@ class LoginPage extends React.Component { render() { const { errors, submitted, user, errorStatus } = this.state; return ( -
- {/* Container - ENTIRE PAGE */} -
-
- -
-
- GroaLogo -
- {/* END BOX LEFT */} -
- -

Log in

- - {/* ERROR MESSAGES */} - {/* Submit Error */} - - {errorStatus && user.user_name && ( -
Invalid Credentials
- )} - - {submitted && !user.user_name && ( -
Username is required
- )} - {/* Length of username */} - {errors.user_name && ( - - {errors.user_name} - - )} - - - {/* ERROR MESSAGES */} - {/* Submit Error */} - {submitted && !user.password && ( -
Password is required
- )} - {/* Length of password */} - {errors.password && ( - - {errors.password} - - )} - -
-
- +
+
+ +
+
+
+ Groa Logo +
+ {/* END BOX LEFT */} +
+ +

Log in

+ + {/* ERROR MESSAGES */} + {/* Submit Error */} + + {errorStatus && user.user_name && ( +
Invalid Credentials
+ )} + + {submitted && !user.user_name && ( +
Username is required
+ )} + {/* Length of username */} + {errors.user_name && ( + + {errors.user_name} + + )} + + + {/* ERROR MESSAGES */} + {/* Submit Error */} + {submitted && !user.password && ( +
Password is required
+ )} + {/* Length of password */} + {errors.password && ( + + {errors.password} + + )} + +
+
+
+ +

Remember me

-
Remember me
-
+
Forgot password?
-
- Don't have an account? +
- -
- {/* END BOX RIGHT */} +
+
- {/* END MIDDLE */} + {/* END BOX RIGHT */}
- {/* END CONTAINER */} + {/* END MIDDLE */}
// END LOGIN PAGE ); From 7f04185a5bbf366013db600f871a7e7a62770fb1 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 12:50:32 -0500 Subject: [PATCH 273/822] updated RegisterNavLinks to be more uniform and to the styles to hold the login --- src/components/layout/nav-layouts/RegisterNavLinks.js | 6 +++--- src/components/layout/nav-layouts/RegisterNavLinks.scss | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index f8a5bbe..910b648 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -5,10 +5,10 @@ import "./RegisterNavLinks.scss"; export default function RegisterNavLinks() { return ( -
- +
+ Log in
); -} \ No newline at end of file +} diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.scss b/src/components/layout/nav-layouts/RegisterNavLinks.scss index 0e8bad3..2a63bc0 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.scss +++ b/src/components/layout/nav-layouts/RegisterNavLinks.scss @@ -1,13 +1,13 @@ -.register-nav { +.register.nav, +.login.nav { font-family: lato; margin: 1% 5%; - - .login-link { + + .link { width: 100%; max-width: 53px; height: auto; font-size: 22px; - color: white; text-decoration: none; From 9e614d61c9932c96026e04acf797a01cb2ba76fe Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 12:50:44 -0500 Subject: [PATCH 274/822] added login nav links component --- .../layout/nav-layouts/LoginNavLinks.js | 14 ++++++++++++++ .../layout/nav-layouts/LoginNavLinks.test.js | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/components/layout/nav-layouts/LoginNavLinks.js create mode 100644 src/components/layout/nav-layouts/LoginNavLinks.test.js diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js new file mode 100644 index 0000000..42b590e --- /dev/null +++ b/src/components/layout/nav-layouts/LoginNavLinks.js @@ -0,0 +1,14 @@ +import React from "react"; +import { ifDev } from "../../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; +import "./RegisterNavLinks.scss"; + +export default function LoginNavLinks() { + return ( +
+ + Register + +
+ ); +} diff --git a/src/components/layout/nav-layouts/LoginNavLinks.test.js b/src/components/layout/nav-layouts/LoginNavLinks.test.js new file mode 100644 index 0000000..d697d49 --- /dev/null +++ b/src/components/layout/nav-layouts/LoginNavLinks.test.js @@ -0,0 +1,18 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { getAllByTestId } from "../../../utils/test-utils.js"; +import { BrowserRouter as Router } from "react-router-dom"; + +// component to be tested. +import LoginNavLinks from "./LoginNavLinks.js"; + +it("renders login-nav-component", () => { + const { container } = render( + + + + ); + + const component = getAllByTestId(container, "login-nav-component"); + expect(component.length).toBe(1); +}); From fff9469c906c5692c26448229108ece48028d47b Mon Sep 17 00:00:00 2001 From: BenSolt <52627840+BenSolt@users.noreply.github.com> Date: Fri, 13 Mar 2020 14:53:18 -0400 Subject: [PATCH 275/822] pulled in master branch --- src/App.js | 3 +++ src/components/auth/Register.js | 2 +- src/components/auth/dataUpload.js | 7 ++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index fe93a45..dee6198 100644 --- a/src/App.js +++ b/src/App.js @@ -8,8 +8,10 @@ import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; import PostLogin from "./components/auth/postLogin.js"; +import DataUpload from "./components/auth/dataUpload"; import LoadingScreen from "./components/layout/LoadingScreen.js"; import Congrats from "./components/auth/Congratulations.js"; + // for testing import { ifDev } from "./utils/removeAttribute.js"; // config imports @@ -83,6 +85,7 @@ function App() { component={Congrats} /> +
diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index e85535e..20796c9 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -65,7 +65,7 @@ class Register extends React.Component { localStorage.setItem("token", res2.data.token); this.props.updateToken(localStorage.getItem("token")); this.props.updateUserid(res2.data.id); - this.props.history.push(`/setup-wizard/dataupload`); + this.props.history.push(`/recommended`); }) .catch(err2 => { console.log(err2, "Username already used"); diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 4cf0bdb..66306b8 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -11,7 +11,7 @@ const DataUpload = props => { const [input, setInput] = useState({file:''}) const [loading, setLoading] = useState() - +const [ratings, setRatings] = useState() @@ -35,7 +35,8 @@ function clikR() { } } } - let { userid } = props.match.params; + //let { userid } = props.match.params; + let {userid} = 1 const handleChange = e => { let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); @@ -49,7 +50,7 @@ function clikR() { }) .then(res => { // waiting to set ratings var for 45 seconds. - props.setRatings(res.data) + setRatings(res.data) //NEED to direct to uploading screen while retrieving file. // props.history.push(`/${props.userid}/recommended`); }) From eca644001a0e4cbd92aa52709d40504ff0a1f682 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 15:24:36 -0500 Subject: [PATCH 276/822] updated state management for login --- src/components/auth/dataUpload.js | 234 +++++++++++++++-------------- src/components/auth/login.js | 31 +--- src/store/actions/loginAction.js | 51 +++---- src/store/reducers/loginReducer.js | 68 +++------ 4 files changed, 176 insertions(+), 208 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 66306b8..3380807 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,143 +1,157 @@ -import React, {useState} from 'react'; +import React, { useState } from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; -import IMDbImg from '../auth/images 2.png' -import LetterboxdImg from '../auth/Letterboxd_logo_(2018) 3.png' -import './dataUpload.scss' +import "./dataUpload.scss"; -const DataUpload = props => { +const DataUpload = ({ match, history }) => { + const [input] = useState({ file: "" }); - -const [input, setInput] = useState({file:''}) -const [loading, setLoading] = useState() -const [ratings, setRatings] = useState() - - - -function clikL() { + function clikL() { document.getElementById("myDropdownL").classList.toggle("show"); } -function clikR() { + function clikR() { document.getElementById("myDropdownR").classList.toggle("show"); - } + } window.onclick = function(event) { - if (!event.target.matches('.dropbtn')) { + if (!event.target.matches(".dropbtn")) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; - if (openDropdown.classList.contains('show')) { - openDropdown.classList.remove('show'); + if (openDropdown.classList.contains("show")) { + openDropdown.classList.remove("show"); } } } - } - //let { userid } = props.match.params; - let {userid} = 1 - const handleChange = e => { - let data = new FormData(); - data.append("movies", e.target.files[0], e.target.files[0].name); - - axiosWithAuth() - // this is insantiated when a file is added to input - .post(`/${userid}/uploading`, data, { - headers: { - "Content-Type": "multipart/form-data" - } - }) - .then(res => { - // waiting to set ratings var for 45 seconds. - setRatings(res.data) - //NEED to direct to uploading screen while retrieving file. - // props.history.push(`/${props.userid}/recommended`); - }) - .catch(err => { - console.log(err); - }); - // clears out previous uploaded file - data = new FormData(); -} + }; + let { userid } = match.params; + const handleChange = e => { + let data = new FormData(); + data.append("movies", e.target.files[0], e.target.files[0].name); -// DO we need the Use Effect from dashboardv1 - in (dataUpload?) + axiosWithAuth() + // this is insantiated when a file is added to input + .post(`/${userid}/uploading`, data, { + headers: { + "Content-Type": "multipart/form-data" + } + }) + .then(() => { + history.push(`/${userid}/recommended`); + }) + .catch(err => { + console.log(err); + }); + // clears out previous uploaded file + data = new FormData(); + }; -return ( -
-
-
-

Already rated movies elsewhere?

-

Groa lets you easily upload your ratings from -
- either LetterBoxd or IMDb:

+ return ( +
+
+
+

Already rated movies elsewhere?

+

+ Groa lets you easily upload your ratings from +
+ either LetterBoxd or IMDb: +

+
-
- -
- -
- +
+
+
-
-
- -

1.Log in to Letterboxd

-

2.Click on your username and select SETTINGS from the dropdown menu.

-

3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR DATA. Save the ratings.csv file somwhere - convenient like your desktop or downloads folder.

-

4.Click to browse or simply drop your .csv file below

-
+
+
+ Letterboxd Logo +

1.Log in to Letterboxd

+

+ 2.Click on your username and select SETTINGS from the + dropdown menu. +

+

+ 3.Go to the IMPORT and XPORT tab, then click EXPORT YOUR + DATA. Save the ratings.csv file somwhere convenient like + your desktop or downloads folder. +

+

+ 4.Click to browse or simply drop your .csv file below +

- {/* END DboxLeft*/} +
+ {/* END DboxLeft*/}
{/* END dropdown-content*/} -
- {/* END DROPDOWN */} +
+ {/* END DROPDOWN */} - -
- +
+
-
- -

1.Log in to IMDb

-

2.Click on your username and select YOUR RATINGS fromthe dropdown menu.

-

3.Click on the icon and select Export. Save the ratings.csv file somwhere convenient like your desktop or downloads folder.

-

4.Click to browse or simply drop your .csv file below

-
- {/* END DboxRight*/} +
+ IMDb Logo +

1.Log in to IMDb

+

+ 2.Click on your username and select YOUR RATINGS fromthe + dropdown menu. +

+

+ 3.Click on the icon and select Export. Save the ratings.csv + file somwhere convenient like your desktop or downloads + folder. +

+

+ 4.Click to browse or simply drop your .csv file below +

+
+ {/* END DboxRight*/}
{/* END dropdown-content*/} +
+ {/* END DROPDOWN */}
-{/* END DROPDOWN */} -
-{/* END DboxContainer */} - -{/* ///////////////UPLOAD FILE //////////////////// */} -
-
- -
+ {/* END DboxContainer */} + + {/* ///////////////UPLOAD FILE //////////////////// */} +
+
+ +
-
-
Groa values your privacy strives to be transparent to all users. -
- Your data will be kept strictly confidential-you're the only one - who will be able to view or access it. -
+
+
+ Groa values your privacy strives to be transparent to all users. +
+ Your data will be kept strictly confidential-you're the only one who + will be able to view or access it. +
- +
- -
-// END DataUploadPage - ) -} -export default DataUpload; \ No newline at end of file + // END DataUploadPage + ); +}; +export default DataUpload; diff --git a/src/components/auth/login.js b/src/components/auth/login.js index ee14730..cc928cd 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -1,9 +1,9 @@ import React from "react"; -import { axiosWithAuth } from "../../utils/axiosWithAuth"; import { Link } from "react-router-dom"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions/loginAction"; + import "./login.scss"; import Groa2 from "../auth/Groa-logo-B2AA.png"; import { ifDev } from "../../utils/removeAttribute.js"; @@ -21,8 +21,7 @@ class LoginPage extends React.Component { user_name: "", password: "" }, - submitted: false, - errorStatus: false + submitted: false }; } @@ -56,27 +55,12 @@ class LoginPage extends React.Component { e.preventDefault(); this.setState({ submitted: true }); if (this.state.user.user_name && this.state.user.password) { - axiosWithAuth() - .post("/login", this.state.user) - .then(res => { - console.log(res.data.id); - localStorage.setItem("token", res.data.token); - // updates token to refresh navbar - this.props.updateToken(localStorage.getItem("token")); - // sets up userid in app - this.props.updateUserid(res.data.id); - //redirect to Groas dashboard page - this.props.history.push(`/${res.data.id}/recommended`); - }) - .catch(err => { - console.log(err.response.data.errorMessage, "errr"); - this.setState({ errorStatus: true }); - }); + this.props.loginAction(this.state.user, this.props.history); } }; render() { - const { errors, submitted, user, errorStatus } = this.state; + const { errors, submitted, user } = this.state; return (
{/* Container - ENTIRE PAGE */} @@ -107,7 +91,7 @@ class LoginPage extends React.Component { {/* ERROR MESSAGES */} {/* Submit Error */} - {errorStatus && user.user_name && ( + {this.props.errorStatus && user.user_name && (
Invalid Credentials
)} @@ -176,9 +160,8 @@ class LoginPage extends React.Component { const mapStateToProps = state => { return { - userData: state.userData, - isFetching: state.isFetching, - error: state.error + userid: state.userid, + errorStatus: state.error }; }; diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 3b45d69..d7006b8 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -1,33 +1,24 @@ -export const FETCHING_USER_LOGIN = "FETCHING_USER_LOGIN" -export const FETCHING_USER_LOGIN_SUCCESS = "FETCHING_USER_LOGIN_SUCCESS" -export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL" -export const USER_LOGOUT = "USER_LOGOUT" - -export const loginAction = { - login, - logout -}; +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +export const FETCHING_USER_LOGIN_SUCCESS = "FETCHING_USER_LOGIN_SUCCESS"; +export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; // LOGIN -function login(username, password) { - return dispatch => { - dispatch({ type: FETCHING_USER_LOGIN }); - (username, password) - .then(res => { - console.log(res) - dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data }); - - }) - .catch(err => { - console.log(err) - dispatch({ type: FETCHING_USER_LOGIN_FAIL }); - },); - }; -} - -//LOGOUT -function logout() { - return dispatch => { - dispatch({ type: USER_LOGOUT }); - } +export function loginAction(userCreds, history) { + console.log("userCreds: ", userCreds); + return dispatch => { + axiosWithAuth() + .post("/login", userCreds) + .then(res => { + localStorage.setItem("token", res.data.token); + dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.id }); + history.push(`/${res.data.id}/recommended`); + }) + .catch(err => { + console.log("ERROR: ", err); + dispatch({ + type: FETCHING_USER_LOGIN_FAIL, + payload: err + }); + }); + }; } diff --git a/src/store/reducers/loginReducer.js b/src/store/reducers/loginReducer.js index aa82b1b..ce6a3e4 100644 --- a/src/store/reducers/loginReducer.js +++ b/src/store/reducers/loginReducer.js @@ -1,50 +1,30 @@ -import {FETCHING_USER_LOGIN,FETCHING_USER_LOGIN_SUCCESS, FETCHING_USER_LOGIN_FAIL, USER_LOGOUT } from '../actions/loginAction'; +import { + FETCHING_USER_LOGIN_SUCCESS, + FETCHING_USER_LOGIN_FAIL +} from "../actions/loginAction"; const initialState = { - userData:[], - isFetching: false, - error:'' -} + userid: "", + error: "" +}; export const loginReducer = (state = initialState, action) => { - switch (action.type) { + switch (action.type) { + //LOGIN SUCCESS + case FETCHING_USER_LOGIN_SUCCESS: + return { + ...state, + userid: action.payload + }; - //FETCHING USER - case FETCHING_USER_LOGIN: - return { - ...state, - isFetching: true, - error: '' - }; + //LOGIN FAIL + case FETCHING_USER_LOGIN_FAIL: + return { + ...state, + error: action.payload + }; - //LOGIN SUCCESS - case FETCHING_USER_LOGIN_SUCCESS: - return { - ...state, - userData: action.payload, - isFetching: false, - error: '' - }; - - //LOGIN FAIL - case FETCHING_USER_LOGIN_FAIL: - return { - ...state, - isFetching: false, - error: action.payload - }; - - //Not sure what to do with LOGOUT - case USER_LOGOUT: - return { - ...state, - isFetching: false, - error: '' - }; - - - default: - return state; - - } -} + default: + return state; + } +}; From 13d6de4d29598754344c1f31ecf108af11b3a393 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 15:49:24 -0500 Subject: [PATCH 277/822] deleted unused scss file --- src/components/auth/login.scss | 134 --------------------------------- 1 file changed, 134 deletions(-) delete mode 100644 src/components/auth/login.scss diff --git a/src/components/auth/login.scss b/src/components/auth/login.scss deleted file mode 100644 index 355ae18..0000000 --- a/src/components/auth/login.scss +++ /dev/null @@ -1,134 +0,0 @@ -//BACKGROUND - App2 - -.LoginPage{ - display: flex; - justify-content: space-between; - padding: 0 10% 0 10%; - min-height: 100vh; - background-image: linear-gradient(to bottom, black 0%, rgba(0, 0, 0, .9), - rgba(0, 0, 0, .70),rgba(0, 0, 0, .85)); -} - -.containerLogin{ - width: 100%; -} - -.bartop{ - display: flex; - justify-content: space-between; - height: 150px; - - .Register{ - color: white; - padding: 3% 0 0 4%; - text-decoration: none; - - } - } - -.Middle{ - display: flex; - -//Text Motto - your movies your way. - .boxLeft{ - margin-top: 3%; - color: white; - width: 70%; - -// LOGO BIG - .Logo2{ - height: 40%; - } - } -} - -// BOX RIGHT SIDE OF SCREEN - Login form -.boxRight{ - width: 50%; - display: flex; - justify-content: flex-end; - margin-top: 3%; - - - //////// Login Form ///////////////// - .LoginForm{ - display: flex; - flex-direction: column; - width:518px; - height:310px; - background: #FFFFFF; - } - -} - - - -.textlogin{ - margin: 2% 8% 2% 8%; -} - -//TEXT REMEMBER, FORGOT PASSWORD? -.TextandCheck{ - display: flex; - - .TextandCheck2{ - padding-left: 145px; - } - - .CheckBoxContainer{ - padding: 20px 15px 0 60px; - padding-top: 20px; - } - - .Checkbox{ - width: 20px; - height: 20px; - } -} - - - -//input fields/////////////////////// -.input1{ - padding: 7px; - margin: 2% 12% 2% 12%; - border: 1px solid black; - border-radius: 4px; -} - -.input2{ - padding: 7px; - margin: 2% 12% 2% 12%; - color: white; -} -.error{ - display: flex; - justify-content: center; - font-weight: 650; - color: red; -} - -.BtnContainer{ -display: flex; -justify-content: flex-end; - -} - -.BtnLoginWith{ - margin: 1% 12% 3% 12%; - padding: 8px; - background:#7A7A7A; - border-radius: 4px; - color: white; -} - -.BtnLogin{ - margin: 4% 12% 0 0; - width: 115px; - height:36px; - background:#21242C; - color: white; - border-radius: 4px; -} - - From e4eaab031f604afa8cfb859868ca66dce777fb17 Mon Sep 17 00:00:00 2001 From: cmruss Date: Fri, 13 Mar 2020 18:25:18 -0400 Subject: [PATCH 278/822] registerAction created with auto login --- src/components/auth/Register.js | 43 +++++++++------------------ src/store/actions/index.js | 9 ++++-- src/store/actions/loginAction.js | 2 +- src/store/actions/registerAction.js | 37 +++++++++++++++++++++++ src/store/reducers/index.js | 4 ++- src/store/reducers/registerReducer.js | 30 +++++++++++++++++++ 6 files changed, 91 insertions(+), 34 deletions(-) create mode 100644 src/store/actions/registerAction.js create mode 100644 src/store/reducers/registerReducer.js diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 20796c9..246b28b 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,5 +1,6 @@ import React from "react"; -import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import { connect } from "react-redux"; +import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; // styling imports @@ -20,7 +21,6 @@ class Register extends React.Component { confirmpassword: "" }, submitted: false, - errorStatus: false }; this.handleChange = this.handleChange.bind(this); @@ -52,35 +52,12 @@ class Register extends React.Component { this.state.user.password.length >= 6 && this.state.user.confirmpassword === this.state.user.password ) { - axiosWithAuth() - .post("https://api.groa.us/api/users/register", user) - .then(() => { - user = { - user_name: this.state.user.user_name, - password: this.state.user.password - }; - axiosWithAuth() - .post("https://api.groa.us/api/users/login", user) - .then(res2 => { - localStorage.setItem("token", res2.data.token); - this.props.updateToken(localStorage.getItem("token")); - this.props.updateUserid(res2.data.id); - this.props.history.push(`/recommended`); - }) - .catch(err2 => { - console.log(err2, "Username already used"); - }); - }) - .catch(err => { - console.log("Registration Error", err.response.data.errorMessage); - this.setState({ errorStatus: true }); - }); + this.props.registerAction(user, this.props.history) } } render() { - const { user, submitted, errorStatus } = this.state; - + const { user, submitted } = this.state; return (
@@ -138,7 +115,7 @@ class Register extends React.Component {
)} - {errorStatus && user.user_name && ( + {this.props.errorStatus && user.user_name && (
Username is already in use
)} @@ -203,4 +180,12 @@ class Register extends React.Component { } } -export default Register; +const mapStateToProps = ({registerReducer, loginReducer }) => { + return { + registerSuccess: registerReducer.registerSuccess, + userid: loginReducer.userid, + errorStatus: registerReducer.error + }; +}; + +export default connect(mapStateToProps, { registerAction, loginAction })(Register); diff --git a/src/store/actions/index.js b/src/store/actions/index.js index e1e44a7..9e282b8 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -1,4 +1,7 @@ -import { Login } from "./backendUserActions.js"; +import { loginAction} from "./loginAction.js" +import { registerAction} from "./registerAction.js" -import { setLogin } from "./dsUserActions"; -export { Login, setLogin }; +export { + loginAction, + registerAction +}; \ No newline at end of file diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index d7006b8..7a94fd1 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -21,4 +21,4 @@ export function loginAction(userCreds, history) { }); }); }; -} +}; \ No newline at end of file diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js new file mode 100644 index 0000000..74d0bef --- /dev/null +++ b/src/store/actions/registerAction.js @@ -0,0 +1,37 @@ +import { FETCHING_USER_LOGIN_SUCCESS } from "./loginAction" +import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +export const FETCHING_USER_REGISTER_SUCCESS = "FETCHING_USER_REGISTER_SUCCESS"; +export const FETCHING_USER_REGISTER_FAIL = "FETCHING_USER_REGISTER_FAIL"; + +// REGISTER +export function registerAction(userCreds, history) { + console.log("userCreds: ", userCreds); + console.log("herstory", history) + let newUser = { + user_name: userCreds.user_name, + password: userCreds.password + } + return dispatch => { + axiosWithAuth() + .post("/register", userCreds) + .then(res => { + console.log("response from register", res) + dispatch({ type: FETCHING_USER_REGISTER_SUCCESS }) + axiosWithAuth() + .post("/login", newUser) + .then(res => { + console.log(res) + localStorage.setItem("token", res.data.token); + dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.id }); + history.push(`/${res.data.id}/recommended`); + }) + }) + .catch(err => { + console.log("ERROR: ", err); + dispatch({ + type: FETCHING_USER_REGISTER_FAIL, + payload: err + }); + }); + } +}; \ No newline at end of file diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 199bbda..85d7076 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -2,9 +2,11 @@ import { combineReducers } from "redux"; import { watchListReducer } from "./watchListReducer.js"; import { dashboardMain } from "./dashboardMain.js"; import { loginReducer } from './loginReducer'; +import { registerReducer } from './registerReducer'; export const reducer = combineReducers({ watchListReducer: watchListReducer, dashboardMain: dashboardMain, - loginReducer: loginReducer + loginReducer: loginReducer, + registerReducer: registerReducer }); diff --git a/src/store/reducers/registerReducer.js b/src/store/reducers/registerReducer.js new file mode 100644 index 0000000..095ec9d --- /dev/null +++ b/src/store/reducers/registerReducer.js @@ -0,0 +1,30 @@ +import { + FETCHING_USER_REGISTER_SUCCESS, + FETCHING_USER_REGISTER_FAIL + } from "../actions/registerAction"; + + const initialState = { + registerSuccess: false, + error: "" + }; + + export const registerReducer = (state = initialState, action) => { + switch (action.type) { + //LOGIN SUCCESS + case FETCHING_USER_REGISTER_SUCCESS: + return { + ...state, + registerSuccess: true + }; + + //LOGIN FAIL + case FETCHING_USER_REGISTER_FAIL: + return { + ...state, + error: action.payload + }; + + default: + return state; + } + }; \ No newline at end of file From 760d623e51f4cb6c7e0b79a8cf305888efcc0925 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 18:33:32 -0500 Subject: [PATCH 279/822] cleaned up App.js --- src/App.js | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/src/App.js b/src/App.js index 1c3fc71..91b8e9c 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect } from "react"; import { Route } from "react-router-dom"; // local imports @@ -7,9 +7,7 @@ import Recommendations from "./components/dashboard/Recommendations.js"; import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; -import PostLogin from "./components/auth/postLogin.js"; import DataUpload from "./components/auth/dataUpload"; -import LoadingScreen from "./components/layout/LoadingScreen.js"; import Congrats from "./components/auth/Congratulations.js"; // for testing @@ -32,9 +30,7 @@ const store = createStore( ); function App() { - const [hasToken, setHasToken] = useState(localStorage.getItem("token")); - const [userid, setUserid] = useState(); - useEffect(() => reactGAinitialization(), [userid]); + useEffect(() => reactGAinitialization(), []); return ( @@ -47,9 +43,10 @@ function App() { "/:userid/recommended", "/:userid/trending", "/:userid/watchlist", - "/:userid/explore" + "/:userid/explore", + "/:userid/upload" ]} - render={props => } + component={Navigation} /> - ( - - )} - /> - ( - - )} - /> + + + + {/* this could be a modal */} - - -
); } -export default App; \ No newline at end of file +export default App; From 276eb0966a2191d07461ddee0933b58827bcb77f Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 18:34:07 -0500 Subject: [PATCH 280/822] cleaned up store --- src/store/actions/loginAction.js | 3 +- src/store/actions/registerAction.js | 52 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 7a94fd1..a29a522 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -4,7 +4,6 @@ export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; // LOGIN export function loginAction(userCreds, history) { - console.log("userCreds: ", userCreds); return dispatch => { axiosWithAuth() .post("/login", userCreds) @@ -21,4 +20,4 @@ export function loginAction(userCreds, history) { }); }); }; -}; \ No newline at end of file +} diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 74d0bef..3a813cb 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -1,37 +1,35 @@ -import { FETCHING_USER_LOGIN_SUCCESS } from "./loginAction" +import { FETCHING_USER_LOGIN_SUCCESS } from "./loginAction"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; export const FETCHING_USER_REGISTER_SUCCESS = "FETCHING_USER_REGISTER_SUCCESS"; export const FETCHING_USER_REGISTER_FAIL = "FETCHING_USER_REGISTER_FAIL"; -// REGISTER +// REGISTER export function registerAction(userCreds, history) { - console.log("userCreds: ", userCreds); - console.log("herstory", history) - let newUser = { - user_name: userCreds.user_name, - password: userCreds.password - } - return dispatch => { + let newUser = { + user_name: userCreds.user_name, + password: userCreds.password + }; + return dispatch => { + axiosWithAuth() + .post("/register", userCreds) + .then(res => { + dispatch({ type: FETCHING_USER_REGISTER_SUCCESS }); axiosWithAuth() - .post("/register", userCreds) - .then(res => { - console.log("response from register", res) - dispatch({ type: FETCHING_USER_REGISTER_SUCCESS }) - axiosWithAuth() - .post("/login", newUser) - .then(res => { - console.log(res) + .post("/login", newUser) + .then(res => { localStorage.setItem("token", res.data.token); - dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.id }); - history.push(`/${res.data.id}/recommended`); - }) - }) - .catch(err => { - console.log("ERROR: ", err); dispatch({ - type: FETCHING_USER_REGISTER_FAIL, - payload: err + type: FETCHING_USER_LOGIN_SUCCESS, + payload: res.data.id }); + history.push(`/${res.data.id}/upload`); + }); + }) + .catch(err => { + dispatch({ + type: FETCHING_USER_REGISTER_FAIL, + payload: err }); - } -}; \ No newline at end of file + }); + }; +} From 398dc9d32db459b70bd4650ca1e705874951af98 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Fri, 13 Mar 2020 18:34:27 -0500 Subject: [PATCH 281/822] setup upload flow --- src/components/auth/Congratulations.js | 7 ++- src/components/auth/dataUpload.js | 7 ++- src/components/auth/dataUpload.test.js | 56 ++++++++++----------- src/components/dashboard/Recommendations.js | 11 ++-- src/components/dashboard/navigation.js | 26 +++++++++- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index 899074f..c40bb7d 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -1,7 +1,10 @@ import React from "react"; import "../auth/Congratulations.scss"; -const Congrats = () => { +const Congrats = ({ history, userid }) => { + function pushToRecommended() { + history.push(`/${userid}/recommended`); + } return (
@@ -12,7 +15,7 @@ const Congrats = () => {
Success png
- +
diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 3380807..f552e88 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,11 +1,12 @@ import React, { useState } from "react"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; - +import Congratulations from "./Congratulations.js"; import "./dataUpload.scss"; const DataUpload = ({ match, history }) => { const [input] = useState({ file: "" }); + const [uploadSuccess, setUploadSuccess] = useState(false); function clikL() { document.getElementById("myDropdownL").classList.toggle("show"); @@ -40,7 +41,7 @@ const DataUpload = ({ match, history }) => { } }) .then(() => { - history.push(`/${userid}/recommended`); + setUploadSuccess(true); }) .catch(err => { console.log(err); @@ -49,6 +50,8 @@ const DataUpload = ({ match, history }) => { data = new FormData(); }; + if (uploadSuccess === true) + return ; return (
diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index c9a25d9..fb90448 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -1,38 +1,36 @@ import React from "react"; import { render, fireEvent } from "@testing-library/react"; -import { getAllByTestId, getAllByText, getByTestId } from "../../utils/test-utils.js"; -import { Router, Route } from "react-router-dom"; +import { + getAllByTestId, + getAllByText, + getByTestId +} from "../../utils/test-utils.js"; +import { Router, Route } from "react-router-dom"; import { createMemoryHistory } from "history"; -import DataUpload from './dataUpload.js'; +import DataUpload from "./dataUpload.js"; +it("renders DataUpload component", () => { + let history = createMemoryHistory(); + const { container } = render( + + + + ); + let component = getAllByTestId(container, "DataUploadPage-test"); + expect(component.length).toBe(1); + let button = getAllByTestId(container, "clickLetterBoxd"); + expect(button.length).toBe(1); - it("renders DataUpload component", () => { - let history = createMemoryHistory(); - const { container } = render( - - - - ); - console.log(window.location.pathname) - let component = getAllByTestId(container, "DataUploadPage-test"); - expect(component.length).toBe(1); - + fireEvent.click(getByTestId(container, "clickLetterBoxd")); + component = getAllByText(container, "1.Log in to Letterboxd"); + expect(component.length).toBe(1); - let button = getAllByTestId(container, "clickLetterBoxd"); - expect(button.length).toBe(1); + button = getAllByTestId(container, "clickIMDb"); + expect(button.length).toBe(1); - fireEvent.click(getByTestId(container, "clickLetterBoxd")) - component = getAllByText(container, "1.Log in to Letterboxd"); - expect(component.length).toBe(1); - - - button = getAllByTestId(container, "clickIMDb"); - expect(button.length).toBe(1); - - fireEvent.click(getByTestId(container, "clickIMDb")) - component = getAllByText(container, "1.Log in to IMDb"); - expect(component.length).toBe(1); - - }) \ No newline at end of file + fireEvent.click(getByTestId(container, "clickIMDb")); + component = getAllByText(container, "1.Log in to IMDb"); + expect(component.length).toBe(1); +}); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 480f4d5..398e489 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -7,23 +7,22 @@ import "./_Dashboard.scss"; import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; -export default function Recommendations({ initialState = [] }) { +export default function Recommendations({ initialState = [], match }) { const [recommendations, setRecommendations] = useState(initialState); useEffect(() => { axiosWithAuth() - // testing with userid 48485 until everything is integrated - // .get(`/${match.params.userid}/recommendations`) - .get("/48485/recommendations") + .get(`/${match.params.userid}/recommendations`) .then(res => setRecommendations(res.data.recommendation_json)) .catch(() => (

Sorry something went wrong while trying to get your recommendations

)); - }, []); + }, [match.params.userid]); - if (!recommendations.length) return ; + if (!recommendations.length || recommendations === "") + return ; return (
{ + localStorage.removeItem("token"); + }; + render() { return (
@@ -55,6 +60,19 @@ class Navigation extends Component { Recommended + {/* adding this here until all other nav functionality is added */} + + Upload Data + + + + Logout + + Date: Sat, 14 Mar 2020 01:47:19 -0400 Subject: [PATCH 282/822] All current tests passing with reedux implemented on all necessary components, was losing userid on link clicks so expanded state management --- src/App.test.js | 25 +++++++++++-- src/components/auth/Congratulations.js | 3 +- src/components/auth/Register.js | 8 ++-- src/components/auth/dataUpload.js | 31 +++++++++++++--- src/components/auth/dataUpload.scss | 1 + src/components/auth/dataUpload.test.js | 22 +++++++++-- src/components/auth/login.js | 4 +- src/components/auth/login.test.js | 20 +++++++--- src/components/auth/register.test.js | 35 ++++++++++++++---- src/components/dashboard/Recommendations.js | 19 ++++++++-- .../dashboard/Recommendations.test.js | 32 +++++++++++++--- src/components/dashboard/navigation.js | 10 +++-- src/components/dashboard/navigation.test.js | 19 ++++++++-- {public => src}/img/imdb-logo.svg | 0 {public => src}/img/letterboxd-logo.svg | 0 {public => src/img}/success.png | Bin src/store/reducers/index.js | 14 +++---- src/store/reducers/loginReducer.js | 2 +- src/store/reducers/registerReducer.js | 6 +-- src/store/reducers/watchListReducer.js | 2 +- 20 files changed, 190 insertions(+), 63 deletions(-) rename {public => src}/img/imdb-logo.svg (100%) rename {public => src}/img/letterboxd-logo.svg (100%) rename {public => src/img}/success.png (100%) diff --git a/src/App.test.js b/src/App.test.js index d7d2a50..472873f 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -28,11 +28,22 @@ it("calls reactGAinitialization once", () => { it("renders register component and register navigation component when the route is directed to '/register'", () => { let history = createMemoryHistory(); + let store = mockStore({ + login: { + userid: 4 + }, + register: { + success: false, + error: "" + } + }); history.push("/register"); const { container } = render( - - - + + + + + ); let component = getAllByTestId(container, "register-component"); @@ -58,7 +69,13 @@ describe("login component", () => { let store; beforeEach(() => { store = mockStore({ - myState: "sample test" + login: { + userid: 4 + }, + register: { + success: false, + error: "" + } }); }); it("renders Login component when the application route is directed to '/login'", () => { diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index c40bb7d..3bde368 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -1,5 +1,6 @@ import React from "react"; import "../auth/Congratulations.scss"; +import successImg from "../../img/success.png" const Congrats = ({ history, userid }) => { function pushToRecommended() { @@ -13,7 +14,7 @@ const Congrats = ({ history, userid }) => {

Congratulations!

Your ratings have been successfully uploaded.

- Success png +
diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 246b28b..d964b47 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -180,11 +180,11 @@ class Register extends React.Component { } } -const mapStateToProps = ({registerReducer, loginReducer }) => { +const mapStateToProps = state => { return { - registerSuccess: registerReducer.registerSuccess, - userid: loginReducer.userid, - errorStatus: registerReducer.error + registerSuccess: state.register.success, + userid: state.login.userid, + errorStatus: state.register.error }; }; diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index f552e88..2a3f432 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -1,20 +1,32 @@ import React, { useState } from "react"; +// tools +import { connect } from "react-redux"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; -import Congratulations from "./Congratulations.js"; import "./dataUpload.scss"; +import letterboxdLogo from "../../img/letterboxd-logo.svg"; +import imdbLogo from "../../img/imdb-logo.svg"; +// children components +import Congratulations from "./Congratulations.js"; const DataUpload = ({ match, history }) => { const [input] = useState({ file: "" }); const [uploadSuccess, setUploadSuccess] = useState(false); function clikL() { + if (document.getElementById("myDropdownR").classList.contains("show")) { + document.getElementById("myDropdownR").classList.remove("show") + } document.getElementById("myDropdownL").classList.toggle("show"); } - function clikR() { - document.getElementById("myDropdownR").classList.toggle("show"); +function clikR() { + if (document.getElementById("myDropdownL").classList.contains("show")) { + document.getElementById("myDropdownL").classList.remove("show") } + document.getElementById("myDropdownR").classList.toggle("show"); + } + window.onclick = function(event) { if (!event.target.matches(".dropbtn")) { @@ -76,7 +88,7 @@ const DataUpload = ({ match, history }) => {
- Letterboxd Logo +

1.Log in to Letterboxd

2.Click on your username and select SETTINGS from the @@ -108,7 +120,7 @@ const DataUpload = ({ match, history }) => {

- IMDb Logo + IMDb Logo

1.Log in to IMDb

2.Click on your username and select YOUR RATINGS fromthe @@ -157,4 +169,11 @@ const DataUpload = ({ match, history }) => { // END DataUploadPage ); }; -export default DataUpload; +const mapStateToProps = state => { + return { + userid: state.login.userid, + errorStatus: state.error + }; +}; + +export default connect(mapStateToProps, {})(DataUpload); \ No newline at end of file diff --git a/src/components/auth/dataUpload.scss b/src/components/auth/dataUpload.scss index b5cb9e1..580115c 100644 --- a/src/components/auth/dataUpload.scss +++ b/src/components/auth/dataUpload.scss @@ -49,6 +49,7 @@ font-weight: 500; border: none; border-radius: 6px; cursor: pointer; + outline: inherit; } .dropbtn:hover, .dropbtn:focus { diff --git a/src/components/auth/dataUpload.test.js b/src/components/auth/dataUpload.test.js index fb90448..6914f32 100644 --- a/src/components/auth/dataUpload.test.js +++ b/src/components/auth/dataUpload.test.js @@ -1,21 +1,35 @@ import React from "react"; import { render, fireEvent } from "@testing-library/react"; +import { Router, Route } from "react-router-dom"; import { getAllByTestId, getAllByText, getByTestId } from "../../utils/test-utils.js"; -import { Router, Route } from "react-router-dom"; import { createMemoryHistory } from "history"; +// component to be tested. import DataUpload from "./dataUpload.js"; +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + it("renders DataUpload component", () => { let history = createMemoryHistory(); + let store; + store = mockStore({ + login: { + userid: 4 + } + }); const { container } = render( - - - + + + + + ); let component = getAllByTestId(container, "DataUploadPage-test"); expect(component.length).toBe(1); diff --git a/src/components/auth/login.js b/src/components/auth/login.js index cc928cd..3af79ef 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -160,8 +160,8 @@ class LoginPage extends React.Component { const mapStateToProps = state => { return { - userid: state.userid, - errorStatus: state.error + userid: state.login.userid, + errorStatus: state.login.error }; }; diff --git a/src/components/auth/login.test.js b/src/components/auth/login.test.js index 46eb1fb..a24ebf9 100644 --- a/src/components/auth/login.test.js +++ b/src/components/auth/login.test.js @@ -1,16 +1,26 @@ import React from "react"; -import { Provider } from "react-redux"; import { render, fireEvent } from "@testing-library/react"; -import Login from "./login"; +import { BrowserRouter as Router } from "react-router-dom"; import { getAllByTestId, getByTestId, getAllByText } from "../../utils/test-utils"; -import { BrowserRouter as Router } from "react-router-dom"; -import { createStore, applyMiddleware } from "redux"; -const store = createStore(applyMiddleware); +// component to be tested. +import Login from "./login"; + +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + +let store; +store = mockStore({ + login: { + userid: null + } +}); it("renders login component", () => { const { container } = render( diff --git a/src/components/auth/register.test.js b/src/components/auth/register.test.js index 5f4fddc..704194c 100644 --- a/src/components/auth/register.test.js +++ b/src/components/auth/register.test.js @@ -6,24 +6,43 @@ import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import Register from "./Register.js"; +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + +let store = mockStore({ + login: { + userid: 4 + }, + register: { + success: false, + error: "" + } +}); it("renders Register component", () => { + const { container } = render( - - - + + + + + + ); const component = getAllByTestId(container, "register-component"); expect(component.length).toBe(1); }); - - it("renders errors to register on Click if info not filled out", () => { const { container } = render( - - - + + + + + + ); let form = getAllByTestId(container, "registerForm"); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 398e489..9c3da7a 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; // tools +import { connect } from "react-redux"; import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; import "./_Dashboard.scss"; @@ -7,21 +8,21 @@ import "./_Dashboard.scss"; import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; -export default function Recommendations({ initialState = [], match }) { +function Recommendations({ initialState = [], userid }) { const [recommendations, setRecommendations] = useState(initialState); useEffect(() => { axiosWithAuth() - .get(`/${match.params.userid}/recommendations`) + .get(`/${userid}/recommendations`) .then(res => setRecommendations(res.data.recommendation_json)) .catch(() => (

Sorry something went wrong while trying to get your recommendations

)); - }, [match.params.userid]); + }, [userid]); - if (!recommendations.length || recommendations === "") + if (!recommendations.length || recommendations === [""]) return ; return (
); } + +const mapStateToProps = state => { + return { + userid: state.login.userid, + errorStatus: state.error + }; +}; + +export default connect(mapStateToProps, {})(Recommendations); \ No newline at end of file diff --git a/src/components/dashboard/Recommendations.test.js b/src/components/dashboard/Recommendations.test.js index 0e25529..6e723a2 100644 --- a/src/components/dashboard/Recommendations.test.js +++ b/src/components/dashboard/Recommendations.test.js @@ -4,6 +4,20 @@ import { getAllByTestId } from "../../utils/test-utils.js"; import { BrowserRouter as Router } from "react-router-dom"; // component to be tested. import Recommendations from "./Recommendations.js"; +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + +let store = mockStore({ + login: { + userid: 4 + }, + register: { + success: false, + error: "" + } +}); it("renders Recommendations with array has length.", async () => { const fakeRecommendations = [ @@ -13,9 +27,13 @@ it("renders Recommendations with array has length.", async () => { ]; const { container } = render( - - - + + + + + ); let component = getAllByTestId(container, "recommendations-component"); @@ -24,9 +42,11 @@ it("renders Recommendations with array has length.", async () => { it("renders LoadingScreen when recommendations array is empty", () => { const { container } = render( - - - + + + + + ); let component = getAllByTestId(container, "loading-screen-component"); diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index 5e7601b..a9894a1 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -1,6 +1,7 @@ import React, { Component } from "react"; import { NavLink } from "react-router-dom"; import { connect } from "react-redux"; +import { loginAction } from "../../store/actions/loginAction"; import { faSearch, faUserCircle, @@ -126,10 +127,11 @@ class Navigation extends Component { } } -function mapStateToProps({ loginReducer }) { + +const mapStateToProps = state => { return { - userid: loginReducer.userid + userid: state.login.userid }; -} +}; -export default connect(mapStateToProps, {})(Navigation); +export default connect(mapStateToProps, { loginAction })(Navigation); diff --git a/src/components/dashboard/navigation.test.js b/src/components/dashboard/navigation.test.js index d127137..2c3d66d 100644 --- a/src/components/dashboard/navigation.test.js +++ b/src/components/dashboard/navigation.test.js @@ -6,11 +6,24 @@ import { getAllByTestId } from "../../utils/test-utils.js"; // component to be tested. import Navigation from "./navigation.js"; +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + it("renders navigation component", () => { + let store; + store = mockStore({ + login: { + userid: 4 + } + }); const { container } = render( - - - + + + + + ); // the uri when this component renders is "/" so it'll go to the RegisterNavLinks component diff --git a/public/img/imdb-logo.svg b/src/img/imdb-logo.svg similarity index 100% rename from public/img/imdb-logo.svg rename to src/img/imdb-logo.svg diff --git a/public/img/letterboxd-logo.svg b/src/img/letterboxd-logo.svg similarity index 100% rename from public/img/letterboxd-logo.svg rename to src/img/letterboxd-logo.svg diff --git a/public/success.png b/src/img/success.png similarity index 100% rename from public/success.png rename to src/img/success.png diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 85d7076..c696a83 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,12 +1,12 @@ import { combineReducers } from "redux"; -import { watchListReducer } from "./watchListReducer.js"; +import { watchList } from "./watchListReducer.js"; import { dashboardMain } from "./dashboardMain.js"; -import { loginReducer } from './loginReducer'; -import { registerReducer } from './registerReducer'; +import { login } from './loginReducer'; +import { register } from './registerReducer'; export const reducer = combineReducers({ - watchListReducer: watchListReducer, - dashboardMain: dashboardMain, - loginReducer: loginReducer, - registerReducer: registerReducer + watchList, + dashboardMain, + login, + register }); diff --git a/src/store/reducers/loginReducer.js b/src/store/reducers/loginReducer.js index ce6a3e4..d38ebd2 100644 --- a/src/store/reducers/loginReducer.js +++ b/src/store/reducers/loginReducer.js @@ -8,7 +8,7 @@ const initialState = { error: "" }; -export const loginReducer = (state = initialState, action) => { +export const login = (state = initialState, action) => { switch (action.type) { //LOGIN SUCCESS case FETCHING_USER_LOGIN_SUCCESS: diff --git a/src/store/reducers/registerReducer.js b/src/store/reducers/registerReducer.js index 095ec9d..0f22f57 100644 --- a/src/store/reducers/registerReducer.js +++ b/src/store/reducers/registerReducer.js @@ -5,16 +5,16 @@ import { const initialState = { registerSuccess: false, - error: "" + registerError: "" }; - export const registerReducer = (state = initialState, action) => { + export const register = (state = initialState, action) => { switch (action.type) { //LOGIN SUCCESS case FETCHING_USER_REGISTER_SUCCESS: return { ...state, - registerSuccess: true + success: true }; //LOGIN FAIL diff --git a/src/store/reducers/watchListReducer.js b/src/store/reducers/watchListReducer.js index ac7b7b5..2a5d5c6 100644 --- a/src/store/reducers/watchListReducer.js +++ b/src/store/reducers/watchListReducer.js @@ -5,7 +5,7 @@ const initialState = { isPostingUserError: null }; -export const watchListReducer = (state = initialState, { type, payload }) => { +export const watchList = (state = initialState, { type, payload }) => { switch (type) { case constants.Post_USER: return { From be57cd7867c96b531575477ea1063bf7a6e64745 Mon Sep 17 00:00:00 2001 From: cmruss Date: Sat, 14 Mar 2020 17:16:12 -0400 Subject: [PATCH 283/822] persist state to local storage --- src/App.js | 14 ++++++++---- src/components/auth/Congratulations.js | 18 ++++++++++----- .../auth/Letterboxd_logo_(2018) 3.png | Bin 5367 -> 0 bytes src/components/auth/dataUpload.js | 8 +++---- src/components/auth/images 2.png | Bin 12439 -> 0 bytes src/components/auth/login.js | 2 +- src/components/dashboard/Recommendations.js | 15 ++++++------- src/components/dashboard/navigation.js | 1 - src/store/actions/loginAction.js | 2 +- src/store/actions/registerAction.js | 2 +- src/store/localStorage.js | 21 ++++++++++++++++++ src/utils/axiosWithAuth.js | 7 +++--- 12 files changed, 61 insertions(+), 29 deletions(-) delete mode 100644 src/components/auth/Letterboxd_logo_(2018) 3.png delete mode 100644 src/components/auth/images 2.png create mode 100644 src/store/localStorage.js diff --git a/src/App.js b/src/App.js index 91b8e9c..ba75e94 100644 --- a/src/App.js +++ b/src/App.js @@ -8,10 +8,10 @@ import Navigation from "./components/dashboard/navigation.js"; import Register from "./components/auth/Register"; import Login from "./components/auth/login"; import DataUpload from "./components/auth/dataUpload"; -import Congrats from "./components/auth/Congratulations.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; + // config imports import reactGAinitialization from "./config/analytics.js"; @@ -22,13 +22,19 @@ import thunk from "redux-thunk"; import logger from "redux-logger"; import { reducer } from "./store/reducers"; import { BrowserRouter as Router } from "react-router-dom"; +import {loadState, saveState } from "./store/localStorage.js"; const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const store = createStore( reducer, - composeEnhancers(applyMiddleware(thunk, logger)) + loadState(), + composeEnhancers(applyMiddleware(thunk, logger)), ); +store.subscribe(() => { + saveState(store.getState()) +}) + function App() { useEffect(() => reactGAinitialization(), []); @@ -54,11 +60,11 @@ function App() { component={Recommendations} data-test={ifDev("dash-component")} /> - + {/* this could be a modal */} - + {/* */}
diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index 3bde368..7e569e3 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -1,11 +1,10 @@ import React from "react"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; import "../auth/Congratulations.scss"; import successImg from "../../img/success.png" -const Congrats = ({ history, userid }) => { - function pushToRecommended() { - history.push(`/${userid}/recommended`); - } +const Congrats = ({ userid }) => { return (
@@ -16,11 +15,18 @@ const Congrats = ({ history, userid }) => {
- +
); }; -export default Congrats; + +const mapStateToProps = state => { + return { + userid: state.login.userid, + errorStatus: state.login.error + }; +}; +export default connect(mapStateToProps, {})(Congrats); \ No newline at end of file diff --git a/src/components/auth/Letterboxd_logo_(2018) 3.png b/src/components/auth/Letterboxd_logo_(2018) 3.png deleted file mode 100644 index b8f1386a4903039a0ae797a691d4c3b339ea07d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5367 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 { +const DataUpload = ({ userid }) => { const [input] = useState({ file: "" }); const [uploadSuccess, setUploadSuccess] = useState(false); @@ -40,7 +40,6 @@ function clikR() { } } }; - let { userid } = match.params; const handleChange = e => { let data = new FormData(); data.append("movies", e.target.files[0], e.target.files[0].name); @@ -63,7 +62,8 @@ function clikR() { }; if (uploadSuccess === true) - return ; + return ; + else return (
diff --git a/src/components/auth/images 2.png b/src/components/auth/images 2.png deleted file mode 100644 index 656301c968ef4aaab70efd2956019ea399866085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12439 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 diff --git a/src/components/auth/login.js b/src/components/auth/login.js index 3af79ef..cb42138 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -5,7 +5,7 @@ import { connect } from "react-redux"; import { loginAction } from "../../store/actions/loginAction"; import "./login.scss"; -import Groa2 from "../auth/Groa-logo-B2AA.png"; +import Groa2 from "./Groa-logo-B2AA.png"; import { ifDev } from "../../utils/removeAttribute.js"; class LoginPage extends React.Component { diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 9c3da7a..08d4446 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,21 +1,21 @@ import React, { useState, useEffect } from "react"; // tools import { connect } from "react-redux"; -import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import axiosWithAuth from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; import "./_Dashboard.scss"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; -function Recommendations({ initialState = [], userid }) { - const [recommendations, setRecommendations] = useState(initialState); +function Recommendations({ userid }) { + const [recommendations, setRecommendations] = useState([]); useEffect(() => { axiosWithAuth() - .get(`/${userid}/recommendations`) - .then(res => setRecommendations(res.data.recommendation_json)) - .catch(() => ( + .get(`${userid}/recommendations`) + .then(res => setRecommendations(res.data.recommendation_json)) + .catch(() => (

Sorry something went wrong while trying to get your recommendations

@@ -24,6 +24,7 @@ function Recommendations({ initialState = [], userid }) { if (!recommendations.length || recommendations === [""]) return ; + else return (
{ return { userid: state.login.userid, - errorStatus: state.error }; }; - export default connect(mapStateToProps, {})(Recommendations); \ No newline at end of file diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index a9894a1..5e24c55 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -127,7 +127,6 @@ class Navigation extends Component { } } - const mapStateToProps = state => { return { userid: state.login.userid diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index a29a522..d801693 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -1,4 +1,4 @@ -import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const FETCHING_USER_LOGIN_SUCCESS = "FETCHING_USER_LOGIN_SUCCESS"; export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 3a813cb..1c00c16 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -1,5 +1,5 @@ import { FETCHING_USER_LOGIN_SUCCESS } from "./loginAction"; -import { axiosWithAuth } from "../../utils/axiosWithAuth.js"; +import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const FETCHING_USER_REGISTER_SUCCESS = "FETCHING_USER_REGISTER_SUCCESS"; export const FETCHING_USER_REGISTER_FAIL = "FETCHING_USER_REGISTER_FAIL"; diff --git a/src/store/localStorage.js b/src/store/localStorage.js new file mode 100644 index 0000000..5f2472e --- /dev/null +++ b/src/store/localStorage.js @@ -0,0 +1,21 @@ +export const loadState = () => { + try { + const serializedState = localStorage.getItem('state'); + if (serializedState === null) { + return undefined; + } + return JSON.parse(serializedState); + } catch (err) { + console.log(err) + return undefined; + } +}; + +export const saveState = (state) => { + try { + const serializedState = JSON.stringify(state); + localStorage.setItem("state", serializedState); + } catch (err) { + console.log(err) + } +} \ No newline at end of file diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 4a6e4f8..0fe4aa3 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -1,13 +1,14 @@ import axios from "axios"; -export const axiosWithAuth = () => { +const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ baseURL: "https://api.groa.us/api/users", headers: { - "Content-type": "application/json", - Authorization: `${token}` + Authorization: token } }); }; + +export default axiosWithAuth; \ No newline at end of file From 0939363c32e62b168623fed92a1812d4880b895d Mon Sep 17 00:00:00 2001 From: cmruss Date: Sat, 14 Mar 2020 17:32:43 -0400 Subject: [PATCH 284/822] cleaned up actions and reducers --- src/store/actions/backendUserActions.js | 5 ----- src/store/actions/dsUserActions.js | 6 ------ src/store/constants.js | 7 ------- src/store/localStorage.js | 1 - src/store/reducers/dashboardMain.js | 20 -------------------- src/store/reducers/index.js | 4 ---- src/store/reducers/watchListReducer.js | 18 ------------------ 7 files changed, 61 deletions(-) delete mode 100644 src/store/actions/backendUserActions.js delete mode 100644 src/store/actions/dsUserActions.js delete mode 100644 src/store/constants.js delete mode 100644 src/store/reducers/dashboardMain.js delete mode 100644 src/store/reducers/watchListReducer.js diff --git a/src/store/actions/backendUserActions.js b/src/store/actions/backendUserActions.js deleted file mode 100644 index 8d67ea7..0000000 --- a/src/store/actions/backendUserActions.js +++ /dev/null @@ -1,5 +0,0 @@ -import constants from "../constants"; - -export const Login = Id => { - return { type: constants.USER_LOGIN, payload: Id }; -}; diff --git a/src/store/actions/dsUserActions.js b/src/store/actions/dsUserActions.js deleted file mode 100644 index 5e45153..0000000 --- a/src/store/actions/dsUserActions.js +++ /dev/null @@ -1,6 +0,0 @@ -import constants from "../constants.js"; - -export const setLogin = input => dispatch => { - console.log(constants.POST_USER); - dispatch({ type: constants.POST_USER }); -}; diff --git a/src/store/constants.js b/src/store/constants.js deleted file mode 100644 index ee73df3..0000000 --- a/src/store/constants.js +++ /dev/null @@ -1,7 +0,0 @@ -// a file to easily grab dispatch actions into reducers -export const constants = { - POST_USER: "POST_USER", - USER_LOGIN: "USER_LOGIN" -}; - -export default constants; diff --git a/src/store/localStorage.js b/src/store/localStorage.js index 5f2472e..b1f6dbc 100644 --- a/src/store/localStorage.js +++ b/src/store/localStorage.js @@ -10,7 +10,6 @@ export const loadState = () => { return undefined; } }; - export const saveState = (state) => { try { const serializedState = JSON.stringify(state); diff --git a/src/store/reducers/dashboardMain.js b/src/store/reducers/dashboardMain.js deleted file mode 100644 index 813b17e..0000000 --- a/src/store/reducers/dashboardMain.js +++ /dev/null @@ -1,20 +0,0 @@ -import constants from "../constants"; - -const initialState = { - isPostingUser: false, - isPostingUserError: null, - userid: null -}; - -export const dashboardMain = (state = initialState, { type, payload }) => { - switch (type) { - case constants.USER_LOGIN: - return { - ...state, - isPostingUser: true, - userid: payload - }; - default: - return state; - } -}; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index c696a83..f2b78ac 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,12 +1,8 @@ import { combineReducers } from "redux"; -import { watchList } from "./watchListReducer.js"; -import { dashboardMain } from "./dashboardMain.js"; import { login } from './loginReducer'; import { register } from './registerReducer'; export const reducer = combineReducers({ - watchList, - dashboardMain, login, register }); diff --git a/src/store/reducers/watchListReducer.js b/src/store/reducers/watchListReducer.js deleted file mode 100644 index 2a5d5c6..0000000 --- a/src/store/reducers/watchListReducer.js +++ /dev/null @@ -1,18 +0,0 @@ -import constants from "../constants"; - -const initialState = { - isPostingUser: false, - isPostingUserError: null -}; - -export const watchList = (state = initialState, { type, payload }) => { - switch (type) { - case constants.Post_USER: - return { - ...state, - isPostingUser: true - }; - default: - return state; - } -}; From 828182f2050c12529a65634675b1ba446be7c5bf Mon Sep 17 00:00:00 2001 From: cmruss Date: Sat, 14 Mar 2020 21:52:10 -0400 Subject: [PATCH 285/822] added recommendationsAction and reducer --- src/components/auth/login.js | 1 - src/components/dashboard/Recommendations.js | 25 ++++++----------- src/store/actions/index.js | 8 ++++-- src/store/actions/recommendationAction.js | 24 ++++++++++++++++ src/store/reducers/index.js | 4 ++- src/store/reducers/recommendationReducer.js | 31 +++++++++++++++++++++ 6 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 src/store/actions/recommendationAction.js create mode 100644 src/store/reducers/recommendationReducer.js diff --git a/src/components/auth/login.js b/src/components/auth/login.js index cb42138..5d7a73a 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -47,7 +47,6 @@ class LoginPage extends React.Component { default: break; } - this.setState({ errors, [name]: value }, () => {}); }; diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 08d4446..bb18f00 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,28 +1,19 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import axiosWithAuth from "../../utils/axiosWithAuth.js"; import { ifDev } from "../../utils/removeAttribute.js"; +import { recommendationAction } from "../../store/actions/index.js"; import "./_Dashboard.scss"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; -function Recommendations({ userid }) { - const [recommendations, setRecommendations] = useState([]); - +function Recommendations({ recommendations, userid, recommendationAction }) { useEffect(() => { - axiosWithAuth() - .get(`${userid}/recommendations`) - .then(res => setRecommendations(res.data.recommendation_json)) - .catch(() => ( -

- Sorry something went wrong while trying to get your recommendations -

- )); - }, [userid]); + recommendationAction(userid) + }, [userid, recommendationAction]); - if (!recommendations.length || recommendations === [""]) + if (recommendations.length === 0) return ; else return ( @@ -62,6 +53,8 @@ function Recommendations({ userid }) { const mapStateToProps = state => { return { userid: state.login.userid, + recommendations: state.recommendations.movies, + recommendationsError: state.recommendations.error }; }; -export default connect(mapStateToProps, {})(Recommendations); \ No newline at end of file +export default connect(mapStateToProps, { recommendationAction })(Recommendations); \ No newline at end of file diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 9e282b8..8aa6bf3 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -1,7 +1,9 @@ -import { loginAction} from "./loginAction.js" -import { registerAction} from "./registerAction.js" +import { loginAction } from "./loginAction.js" +import { registerAction } from "./registerAction.js" +import { recommendationAction } from "./recommendationAction.js" export { loginAction, - registerAction + registerAction, + recommendationAction }; \ No newline at end of file diff --git a/src/store/actions/recommendationAction.js b/src/store/actions/recommendationAction.js new file mode 100644 index 0000000..bca2c7a --- /dev/null +++ b/src/store/actions/recommendationAction.js @@ -0,0 +1,24 @@ +import axiosWithAuth from "../../utils/axiosWithAuth.js"; +export const FETCHING_RECOMMENDATIONS_SUCCESS = "FETCHING_RECOMMENDATIONS_SUCCESS"; +export const FETCHING_RECOMMENDATIONS_FAIL = "FETCHING_RECOMMENDATIONS_FAIL"; + +// RECOMMENDATIONS +export function recommendationAction(id) { + return dispatch => { + axiosWithAuth() + .get(`${id}/recommendations`) + .then(res => { + dispatch({ + type: FETCHING_RECOMMENDATIONS_SUCCESS, + payload: res.data.recommendation_json + }) + }) + .catch(err => { + console.log("ERROR: ", err); + dispatch({ + type: FETCHING_RECOMMENDATIONS_FAIL, + payload: err + }); + }); + }; +} diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index f2b78ac..e07767b 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,8 +1,10 @@ import { combineReducers } from "redux"; import { login } from './loginReducer'; import { register } from './registerReducer'; +import { recommendations } from './recommendationReducer'; export const reducer = combineReducers({ login, - register + register, + recommendations }); diff --git a/src/store/reducers/recommendationReducer.js b/src/store/reducers/recommendationReducer.js new file mode 100644 index 0000000..b4bbd50 --- /dev/null +++ b/src/store/reducers/recommendationReducer.js @@ -0,0 +1,31 @@ +import { + FETCHING_RECOMMENDATIONS_SUCCESS, + FETCHING_RECOMMENDATIONS_FAIL + } from "../actions/recommendationAction"; + + const initialState = { + movies: [], + error: "" + }; + + export const recommendations = (state = initialState, action) => { + switch (action.type) { + //RECOMMENDATIONS SUCCESS + case FETCHING_RECOMMENDATIONS_SUCCESS: + return { + ...state, + movies: action.payload + }; + + //RECOMMENDATIONS FAIL + case FETCHING_RECOMMENDATIONS_FAIL: + return { + ...state, + error: action.payload + }; + + default: + return state; + } + }; + \ No newline at end of file From 44c6336dbc01685caba0531600cf8171169249d5 Mon Sep 17 00:00:00 2001 From: cmruss Date: Sun, 15 Mar 2020 00:14:15 -0400 Subject: [PATCH 286/822] refactored movie instructions toggle DRY --- src/components/auth/dataUpload.js | 27 +++++---------------- src/components/dashboard/Recommendations.js | 2 +- src/store/actions/index.js | 2 +- src/store/reducers/index.js | 4 +-- src/store/reducers/registerReducer.js | 4 +-- 5 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/components/auth/dataUpload.js b/src/components/auth/dataUpload.js index 8d5198d..349743d 100644 --- a/src/components/auth/dataUpload.js +++ b/src/components/auth/dataUpload.js @@ -13,23 +13,7 @@ const DataUpload = ({ userid }) => { const [input] = useState({ file: "" }); const [uploadSuccess, setUploadSuccess] = useState(false); - function clikL() { - if (document.getElementById("myDropdownR").classList.contains("show")) { - document.getElementById("myDropdownR").classList.remove("show") - } - document.getElementById("myDropdownL").classList.toggle("show"); - } - -function clikR() { - if (document.getElementById("myDropdownL").classList.contains("show")) { - document.getElementById("myDropdownL").classList.remove("show") - } - document.getElementById("myDropdownR").classList.toggle("show"); - } - - - window.onclick = function(event) { - if (!event.target.matches(".dropbtn")) { + const toggleInstructions = window.onclick = function(event) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { @@ -38,7 +22,9 @@ function clikR() { openDropdown.classList.remove("show"); } } - } + if (event.target.matches(".dropbtn")) { + event.target.nextSibling.classList.toggle("show") + } }; const handleChange = e => { let data = new FormData(); @@ -79,7 +65,7 @@ function clikR() {
+
@@ -29,4 +31,4 @@ const mapStateToProps = state => { errorStatus: state.login.error }; }; -export default connect(mapStateToProps, {})(Congrats); \ No newline at end of file +export default connect(mapStateToProps, {})(Congrats); diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 2733b29..1cde727 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -3,7 +3,6 @@ import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; // styling imports -import "./_Register.scss"; import GroaLogo from "./Groa-logo-B2AA.png"; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; @@ -19,7 +18,7 @@ class Register extends React.Component { password: "", confirmpassword: "" }, - submitted: false, + submitted: false }; this.handleChange = this.handleChange.bind(this); @@ -51,7 +50,7 @@ class Register extends React.Component { this.state.user.password.length >= 6 && this.state.user.confirmpassword === this.state.user.password ) { - this.props.registerAction(user, this.props.history) + this.props.registerAction(user, this.props.history); } } @@ -187,4 +186,6 @@ const mapStateToProps = state => { errorStatus: state.register.error }; }; -export default connect(mapStateToProps, { registerAction, loginAction })(Register); \ No newline at end of file +export default connect(mapStateToProps, { registerAction, loginAction })( + Register +); diff --git a/src/components/auth/_Register.scss b/src/components/auth/_Register.scss deleted file mode 100644 index aff37cd..0000000 --- a/src/components/auth/_Register.scss +++ /dev/null @@ -1,112 +0,0 @@ -.container { - font-family: Lato; - min-height: 100vh; - color: white; - background-image: linear-gradient( - to bottom, - black 0%, - rgba(0, 0, 0, 0.9), - rgba(0, 0, 0, 0.7), - rgba(0, 0, 0, 0.85) - ); - - .onboarding-nav { - display: flex; - justify-content: flex-end; - padding: 0.5% 1%; - } - - .box-container { - display: flex; - margin: 7% auto; - } - - .box-left { - width: 40%; - margin: auto; - .logo { - width: 100%; - max-width: 926px; - height: auto; - } - } - - .box-right { - display: flex; - flex-direction: column; - justify-content: center; - margin: auto; - padding: 3%; - border-radius: 4px; - background: white; - width: 100%; - max-width: 518px; - height: auto; - - h2 { - color: black; - margin-bottom: 30px; - font-style: normal; - font-size: 20px; - } - .form { - margin: auto; - padding: 3%; - max-width: 393px; - width: 100%; - } - - .form-control { - border-radius: 4px; - border: 1px solid black; - max-width: 370px; - width: 100%; - height: auto; - padding: 2.7%; - margin: 2.6% auto; - } - input::placeholder { - font-size: 1.1rem; - } - - .bottom-form { - width: 100%; - display: flex; - justify-content: space-between; - margin: 3% 0; - .check-box-container { - display: flex; - p { - color: black; - } - } - - .btn-container { - width: 100%; - display: flex; - justify-content: flex-end; - .signup-btn, - button.login-btn { - align-self: end; - border: none; - width: 100%; - max-width: 115px; - height: 36px; - border-radius: 4px; - background: #21242c; - color: white; - font-size: 14px; - &:hover { - background: gray; - color: #21242c; - } - } - } - } - .callingError { - color: red; - display: flex; - justify-content: center; - } - } -} diff --git a/src/components/auth/login.js b/src/components/auth/login.js index a2df318..ade1bab 100644 --- a/src/components/auth/login.js +++ b/src/components/auth/login.js @@ -4,7 +4,6 @@ import { loginAction } from "../../store/actions/loginAction"; import GroaLogo from "../auth/Groa-logo-B2AA.png"; import { ifDev } from "../../utils/removeAttribute.js"; import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; -import "./_Register.scss"; class LoginPage extends React.Component { constructor(props) { diff --git a/src/index.js b/src/index.js index c1684e8..158914b 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,9 @@ import ReactDOM from "react-dom"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; +// styling +import "./scss/index.scss"; + ReactDOM.render(, document.getElementById("root")); // If you want your app to work offline and load faster, you can change From 3624e5582cbc14d2932bd988b446f058e066cba8 Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 16 Mar 2020 17:11:35 -0500 Subject: [PATCH 303/822] updated onboarding --- src/components/auth/Register.js | 5 ++++- src/scss/components/_onboarding.scss | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1cde727..8df2e26 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -57,7 +57,10 @@ class Register extends React.Component { render() { const { user, submitted } = this.state; return ( -
+
diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index bef6144..3d8c500 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -1,4 +1,5 @@ -.container { +.container.register-component, +.container.login-component { font-family: $fivoRegular; min-height: 100vh; color: white; From 1cb21b8a2554896b20450f9a491df9bac89fb55e Mon Sep 17 00:00:00 2001 From: Brianna Keune Date: Mon, 16 Mar 2020 17:29:30 -0500 Subject: [PATCH 304/822] moved font folder --- src/fonts/FivoSans/FivoSans-Black-Oblique.otf | Bin 0 -> 60160 bytes src/fonts/FivoSans/FivoSans-Black.otf | Bin 0 -> 46144 bytes src/fonts/FivoSans/FivoSans-Bold-Oblique.otf | Bin 0 -> 60216 bytes src/fonts/FivoSans/FivoSans-Bold.otf | Bin 0 -> 45496 bytes src/fonts/FivoSans/FivoSans-Heavy-Oblique.otf | Bin 0 -> 55392 bytes src/fonts/FivoSans/FivoSans-Heavy.otf | Bin 0 -> 44052 bytes src/fonts/FivoSans/FivoSans-Light-Oblique.otf | Bin 0 -> 60196 bytes src/fonts/FivoSans/FivoSans-Light.otf | Bin 0 -> 45684 bytes .../FivoSans/FivoSans-Medium-Oblique.otf | Bin 0 -> 61980 bytes src/fonts/FivoSans/FivoSans-Medium.otf | Bin 0 -> 47852 bytes src/fonts/FivoSans/FivoSans-Oblique.otf | Bin 0 -> 61200 bytes src/fonts/FivoSans/FivoSans-Regular.otf | Bin 0 -> 46400 bytes src/fonts/FivoSans/FivoSans-Thin-Oblique.otf | Bin 0 -> 60864 bytes src/fonts/FivoSans/FivoSans-Thin.otf | Bin 0 -> 45756 bytes src/fonts/FivoSans/OFL.txt | 92 ++++++++++++++++++ src/index.js | 1 + src/scss/components/_onboarding.scss | 1 - 17 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/fonts/FivoSans/FivoSans-Black-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Black.otf create mode 100644 src/fonts/FivoSans/FivoSans-Bold-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Bold.otf create mode 100644 src/fonts/FivoSans/FivoSans-Heavy-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Heavy.otf create mode 100644 src/fonts/FivoSans/FivoSans-Light-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Light.otf create mode 100644 src/fonts/FivoSans/FivoSans-Medium-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Medium.otf create mode 100644 src/fonts/FivoSans/FivoSans-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Regular.otf create mode 100644 src/fonts/FivoSans/FivoSans-Thin-Oblique.otf create mode 100644 src/fonts/FivoSans/FivoSans-Thin.otf create mode 100644 src/fonts/FivoSans/OFL.txt diff --git a/src/fonts/FivoSans/FivoSans-Black-Oblique.otf b/src/fonts/FivoSans/FivoSans-Black-Oblique.otf new file mode 100644 index 0000000000000000000000000000000000000000..5a3efbb60a1d0ed6a0967171218a0ca293b0176a GIT binary patch literal 60160 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 literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Black.otf b/src/fonts/FivoSans/FivoSans-Black.otf new file mode 100644 index 0000000000000000000000000000000000000000..973efb2541f458d547dc5fda1abbf7ceb3da8fee GIT binary patch literal 46144 zcmb@u2V7Lg_cuIuFZb>;7uP5(Dmc3KiNhM_P@j+psBWF<|myo3m3Gq!HG;(zR9*YCc5K=jx5OOMX zWV;UUmH96vM6lxhl-RWB%zdZoR1%`c^e&?kB@rJOT1g8q{tI5s z64P?0g=92)7xNbpBCSh{o|Y*jgyAaz^AkBeIxYTj=;xSzR5L=l-_Oj*$rWFd4upK5 z;(IF*w4{X8mFcR#*~{89@)ozdXenu;2o9~k6j(F$-h=-uVE4wz_f#rOK@82g>HwN=A#%n&N%g3-7uVB2k zIOC2ww7kdh{o>lNKh{%*?{8r_$4O7IKE{6|J#{g7jl=uKc>fFOiFNnX4aGV*h6C~W zUc4w?0r>u-+VCrUhi%s_!}6bz4!UzlMkD6Ak7ZZmwFui8j%8t+F(f(>(-|-xgkfL2 zvN6vn;*OyQh91IU%&WztkT!kr>RVHxn}cCn(m~9_w3G2lbmVJ~>D;kj9dt&__o*X~ zpRO|wegT%z4(rlrT!Zh{VH+&ihPC*t2=BG$eQWF8jBQ_!*L}>R(NRL$jKDAk%R{G|x@xrj=cV(*HfZ$LX#3AgqwP_ArqS?!xWoncT%#+}^q-f|rRJf~8tK`y=6j(B z()Le!YBc@lg?)G2M-e|9i@z_VokmwjKec+b{{9`hJNkSUGrd z!QXxPt8KMy5td+Ew5u2||tF({TQ1{P<@(0chElMy78gpqI(K}M2MWHcE=#*%Sl zJefcyl1U_zM3Kp43W>(9%pfz#Y*IwtCrii*vWBcCYsq@Dj%*+$WHZ@Bwver4JK08d zkW#Xf>?XU&95Jp&g|RwFkDb`V{p27yOpcS2MrUYnv1aPpRMlJ zhStW8vb+Dcvg4k2z_Nv!Uu(W{)PO%VRd}7KIaYJD=19%q8kFY#{;Szhv+eJ@7aRVJ zKWEQz#ys2ctmIjXr`?{4Uw-d+Bh=lNaPGT*mfD z_~58D6MTi{LJOpDOXPyqP9DJV4?r&HfFs&T=!}%_inQo2IcuW`@i^~pvo2l-8p9N~d$LKB?-{y5JAaZV4zxf+eM$ii7L%fZDT z;=J61Gq8+Qk}7hZTtk{X!2W-QeFWqjy--JR7rd~qe%Pn(*n?i!>fypjVZ0D6BncTp zo-jiw78VN2g|)≈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 literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Bold.otf b/src/fonts/FivoSans/FivoSans-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..4187db8b944a4c4ac59ac407b3500f2edee880d2 GIT binary patch literal 45496 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 Sp6^lCmLu+H^q~*d>wf`(2MF5$ literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Heavy.otf b/src/fonts/FivoSans/FivoSans-Heavy.otf new file mode 100644 index 0000000000000000000000000000000000000000..400ddfd72b18dd1d7b394c4374f26eb53f413813 GIT binary patch literal 44052 zcmd4433wD$);C_&JGVm1)(s?7cZ+BsLLd+Y352ynf`NpDouG!KvtT-DvJy5yQ4u2J z21FKvfIu`X5QGfsv}nkg6P8aeHq?#-%H0k)(V2ThaecH=6KRGpSr8W zjAzI3yE6wjEH@d;Q2rUeJ~`gvg+rFyItcGC7X)LaH+`W`%u2>15$_A8{B*BpXvc2r z1mW&Wf^gS2zJj9St5w2a!1ErSy9AM{3c~p4nmg~kX~f?Jy&m-hVdf7#U#0U$i@U#g zb^ld^k?Bw3QZMM}F8<*i-H%tt3YkU+p6@p@wI%JDRv}9ek_8b*!JtdfuM~`U&_yyqjwcRViRzVopNf0Im@A=9Li-ePc@bwU_FWryAuP#A&nx2b4>j)#b6y8D0 ze-=hiTVj9pH&{F(ICO90_l)2`-`(_1!GU_+@Z6!+nJRSCjmN#8aPN`8`3bc1A)Xfs zOg95!d-#*)d_f?(*U)*>W34b(} z;F)-h_=e8JGiz164_0{?d<1%__pdweRe4GPox2eoRGi#!R(T%yxbB=MbTbSCefHoz z$bq;QJV|Hp4?pnH(rZoxipJgfW|goFAC!FxZo{Ro!e zPd`WKW^~|ss`k^p3|hqs%Z(lyCTf-raOj|9qe71;;^W z;UKR6TZ4z*QDLF`WG~d8u5Z9P^uiso9DN0oj^PP=S3l^b+ zz+j0(gpPt$xJl?FbQZb@T>*(runXOV9zstcR0tD#2{JT|6Sm`Kp|^00&_}pcxJ?Kb z`U?Go2;p|2zc4_E6b1@|geYkFAwslphj6DbR2U}QB@7p0U};7QvBD@}v@k{(D~uDy z3vMA!m>|Rp39wyv3yH!cVX}|}^EX9E5mJSz!ZcyJFhiIr%o1h`bA&Wuu5gcVuW+A` zj`1xPmI%w>Jv=H@2u}&?g>}LP;aQ&E z94Ow7=LQ|DHZU_9bPPqQBk=J8Mpz@f4Bk2-91}hez7U#)D`J>wx{0s@b? zOuVWK)79&~a6IgI&hg)_Zmv+5!*!c$kZZVWhpXo1-o3l@j_-Y6Z_n35u3kmU)V2%w z+=Y?sMcaqb_6eauxFGzOa8-1OeZ@%ePVp{`Hc`wGf7SKSy{$X%SdO+YySlo1xO%B= z-*sKvnO_e^+v3%~U;Rey0f(z~_#M6a%GJYH4_!TY72aIizpLA?KHqkAabvLjwfr?C z=Bw>rZT>3!!mtbaFTYoxh=J!*!7=kdXF;WN@Ff8}G+*$6R!e|y`u7C*hWMohWg6cR z)o;|iN40`_IDlsY+RIQmCkwohBjlo``@sobAs-y&11}W`#lZZBz|WtAv%)#yBjID= z6XCq@sqmT5D0~i@d|cu#t1Io*o%zbyC@@VIpUU&S|Mc9mXz;9-7L^tS!n<4*^kn0+)}AeM-W#TDXX z;*;VAaf`S^d`Wy+d__DZHi(~yUx-cO58{7|E#PLOt`j)=7TxW-A-Wjd7~KTjBwea* zwk}j^xco zt547;>8I)E=+pJ{^+ozc`sMmZ^sDu2_0Q^`*T1Mgtgq9b(x29Ur2n(NS%1~g!O-2% z+Yo6OZWwP!GR!h$7zzzb4XX{6hHZvgL!IFbgJK+IoNSz7Oq)C{F>zcNbMF{$ zdPZRZ<{9c~%)CNRsV7}Mjw#44$oJfzuARoEXOt9sGSuU^jNHPE5^q+XXJJNLaa?9W zae79EC%-u3T4`KHIvUSVkK@&2W}sYHkY1dLp3{rnTGt-!I9aWcuO24{p63V7lhqpe>M=OK8hX^dMfrhC*=Qc+%dQI1+HXe*{> z6nMROg}Aw>UAZJbchKOdG1_VDjO@bnQcszBoS`;RrXFWx=6VV}MY%;~!2({0a^K~i zrB*Fhk9oO;>FyE;fX`Q0u+X!hBt0*`pjbWUd5VhELUy4iy%yqwYqm%lQ)<4~E&m8I_tv7lU6**|oAhI4VG9ND0e7JIpT@45fvD)Z>ttAw2;H5!kvg|-nr=R9 zM~QBWZaZQxr*x-vzv{c_ZTj2v1N0;G6JRH1=)JHIYxNuS$Mjr(#h^1t29IIBq0F${ z@Tg&};Yq`G!!E;q!y&_Q!|R6AhBJmwjFRytV^?DjV=v<^#<9i;#$@9(<1AyY@nPdy z<5R{B#?8j(jYo}tF@9(Khe>DZWa?>>P2r~gra`8mrdU(FX{KqeX}+nzw9xc`X_aZM z=_%6&(=O8+rh3yKO@B6BGW}rsFEcY+&0Wl4=3CAE%#r57<~z-a=4A6!bGF%ME-{yz zmztk2Z#Tbae%XB3e9U~p{FeE&`2%yK`GWZy^Ck0-=F8?^%)grdVd-G8S$bL=mRl@+ zE&VNnEO%J$vcy`(TP9j2TT(33E%#V5EIF1u%K}S@mPajXEPt@9vuv_dS$0^e zEqg5oEQc*eEw5SL(EEFzXVGk1hLO8UnM=7eM3(gaK5xk5SQ%T)oUIoPLz(mpyIGcI zmzJmJY*}*1S+L}R97mG*+XMS9oG#rt+iBJFlgC(=%x7LW$A*5Y%yfpwG0E-CPnaOT z@7?WoO8R9~_g{G5sR9Cu0?p^O+eM=@+>ho0N=>XE9_+38H$ z#`?(8gN!foZ?@gRo|3;}j%Q`*D68%*OWS0g;y2ocF~x9Z4v*raKYEQz4xXl*bbl5q ziPbH$zh{4whsnwYu2=MYLj^NQ%h}CLS})i3l_lFiwuaUAW>TK)-#nF>r6jhmp78?H z9>s2yZ1d!K%qel#hjM`&^_VP)Tjkprp@i4i4#~ae+@lzV%YQ!NOWfq(DJDK5_tvw@ zeUHlgv7eu2&U)ptVmC|um^F4u`ut&G!{tn-Y)}A(vO&`GJ-pBch+e#3=JQ(@Kf25q zS5m&(8|GGYJjB$rXE(p&%^#S5+5PfhxtUa3y`s#Uw_>)_ZRYmIgC90TRjmP28IC0=kxJy81jQgJ zYyEv16<6r&`K7T#vv;0$EWk(t94m=c{`=km#27ZOF*dg*Dj|H4Sy`#n7{mSd@epOL zSvta$gKW%($>$cU~!^#*>PUbqL`>W3CuZ?S2Nuu%b(&CDuuVg3B zvcJM|WQVjut{ost{%Vg5HaPI@w>uAY`Kv)}e$z^u6vxpD)qtUAM-G>os*{^*r+Z(>(ky*{=`X<2e1&&I2EYa{JJF zWv0V=KlnqkomE~iD*a67`3pvAv#dAE``nO7V+isiC1-DrbCz zSyzFmpVhV9jFIvUMN&lK=N@0xqgJEgzKpm(47 zvgCRQL#_8P=?TW8B~@w6vPCKOLvnL{eY4ZQS&465W%ibpc^#5i-!fRwD=TCr?U>AW zoA@GSw~?5Q95k{$Xl%i|? z2=WWGr?5v^MMcG$HK9^VvJJ?7lU+%EAL`TXJ@Bohgczl;+G>@PU9Fq1Bt!C=5}*^Z znj|H9zg(rPTq0NTmFHzMNuv*sKOV)$@rj>)@`5Zq$3Pc7xAQM;4?u%>`6VypWm{_> zH`hUH^SL};;&zi%!@g$HNg&m{rgX)^na{p;=#T^WHT(N0(MBF^R!W+9NfVV?>5i4h z^KH_amSm}6Yc*uk>)y{9ln54K&lFhqfT~*b(b=B4DR+N>kSmAYATfbK#cv|aG2=+x;ih)_-(Wp2r zJ9p;HeYvl{zHiTKuVwF<=9FS)Wh5olWi&R{)znqG?D$RuB4A|wFfP`1Xus)696$P zSrRvb4I;R`K?x^9mNO{V#*Q_^gxUe0U^X95sE`}5&=lW zBM}ZkR0yFV#P<;DL+lccsqm6WVaPoK!jTm3dsz?;Axx+fu!4A4Cma=o*9761h(H@+ zCkS2&j|&K)2(Rmew**8x5lj)@5ry{!;j|#UM-eRHjDU!f08jX1K{%^Jqy^z7;k<~D z6CzIth|&t+*Mjh+PPizFtNS9jDAsmB_!RL|u}-3x=QD!%t|Xik5Tg-4>MFb~h=0`! z^#X!a;tw4VUPMe%SRo=#iLfi;l?a}R+=8$dB9;gMA(AYV2#AOw0EGCcP%aAhi{zI- zDb`gBO_Fr~xN4v%y=(&4oZ=R17c zfp_=^v#AH6nmF_$bOPUX{a<>njmeG_J`;~x`uQMnHcg|$Xgw!cidpT z**eg=*t*L4y!8ib>rHpvlzCJBO`C4ob<>HPKIwEzr-)8bo$l)7?v&aov(ti3&v&Zs z^m3;oo$5P%(&^hympcocJ9h5YIjr+7og+KPc3#lAyz`3Ak9B^s^R~_}cCP7sxbthB z-|GBv=cdko@BC|*h%QlGhIJX$C8^8YF1cMwx~%N-M3>4gTf0(CpJ<HTdmin1q33r!uZBvY-9w$Bw}%c5oe-KD zniZNKx+3(g(DR`eLVpPTIZPMUDJ(3kcUWZDh_Lvu~&YKxL&EfGI|yCTH0%Sui9QGdcEE2T(8f1ebwv7URQcul}&P2*(Kj0kCBt)De`^t ze7RVzkYAK*ueBg1jPanSLu)94Iw_H+($PIb<4W;q{sZgIZoJm`GO`JwZ3=M~pY zF4={Nt1HHp;JU|kzpK>snCscrZ0os$m^<(qeSL*|CAmdtNxmYOd8`s)<25iFHU2&( zYwI0W7>`Cc6KQ%Lv7hzFR6|KI*D7ntiLK>0rQq7Cl<{-^P9jgK*YlJL`DvN^>`%+q z!~Ad)<{A!tHIKFNPN(Ij(=xveu9?kL3G<|u-epnmGUaAi+)k!tFcvqjW&8@fx+tpB zM7OLf`~KP;^PDgJ7j5Tje2MTjd06}zWxz(qmx^ncSsAb--mTo6CM&%f;(7E^$1v{t z(#)ebHZ<_wn)MVzk5_MPa9H`$!| zr6@hqcBSpT&vDn>xWqo8{@d=gEz0veG&juc-Ff=u=d1U;;5@-c+I+i9ckd28v~>&2 zFlLIG3#R)V*4AtldsRGI|30$;Z`G`tZ`1Q=CC&B#^VUW2XudX-uWjP4>N>}M**hy- zaVcvaU^tF4V8CYYx;7=PobRuAbEts2!z5duKTwfSqiFK|TqabW+b3 zwsf%h7Cf`xSRa#QekRNJ!i?&SxD(!eE3%i*@YcqisNVU)gW1NU#(MLE`*tok;jR5} zdUekFed|tCXM8xrYqUnc#$bu`{-gXHScAu-uXrUzu@hs!&rIPdC)sLwD{CFKf~Sxf z+$~#`s*l)@jIV@aw(?4{@emB=+w3BZA#n3PPEFZx~96I~M4~NFljWfW*uZz{)?DG00HM(Lyd5JE`iU$ynxN^k5tmk z%FxzG8^4>E8kJJzZnHIwr#0~uNR$7Rp0A|=9_IGeVJ3HLq!GUJq4m4B)Q6p~$sRg% zes*la{GF$lJ1;UNa{Z?Xd{h{`&yV3`jvM{4GVZ?Yhad1dpW}kjngx$a%bhT?HfSmB=vV-e|?7Jm=(x z*V!7X(XTh#?e^}waG`o%gVP#u5M1%p_YBk5r@#y6;BvQ~fwD01lm3g)9cJrFuESI+ zR)lZ7Qt<%*|M$lj4ieMz zoMPM1?CSSE*thcnXfk19ws)x0Uuf{!IFS5bm zwfn!{1mqjE;z`u<4@0$9a+mkYRu}1BGzHe(vY(A^w1Lu)skB)8;=W;8Z)AJ^giXbN&fb61nzU*jKYtI54*OInyVw^G7SCGsBc z9I4#(qBDKhYYRUPu_if3B&1_xg2C1PN9=I5Q(W zOc^)&BDf{1sR^jP_hOWiHE2m@PQe3Pk30FcaC6Z-Hb^aS8TVwrWx&4Hk2MX}Rc?djSknd({#b;!_zZk-~7M!_Oojji8KIP<22FbK4 z%?DXMPkT_dMwGQ=BGQ&+SSMRgqy0y43#Zl0%AbUBUF#o4vN{)JYn{79<`Mq6#@4w! z1(BOdvl7-iRtfWuH7eWGxXxUY^%CAqgh}cNHP~CWR(>G^A8GoQzW({P=b3U2bJ&%b zJM*+g2yO^QZ>K;Fhz`wx&=LYSV9B2DmKTq(x$=ou|FEvsapG>{26ij&WNfH^={xQU zUCgF2haVv%+Z=hg?6jWz0&azMB|7XUTYcz%84!R`4Pe%7AF-A=7)v`%?$eIS%B`($ zE4TXJ-UW0)Xw#{~aOU^~5vaf8NqNIJwjY38h`FwRo!FEi8&pv?c2Em?l|(E1nlI+ZdQZI`*&W89OQwsBNg z#cJa*rQ6F)sX#yZ@EoGhkphmo9cAxw$nXmPQ?~Y_rAu~wS24ho9yEec0nktD_*#W0rP&gMx`H_CMcdt=!TWwGPh!La~ocd zKsYg4sidckydQX`s}kQbA`X4WJjd?AshV81R!Di74bhgj7w^x0&av;gP5a*tj@D2|t}bbtZJbd+PqvHrJ*~s`aJ))vsn`tbVw=8vB=(x(%UGp3>W;6{x zbH=!Q|0@rl2s`o06YKXo&%`(VdFBb@u7j0to((;_?9GCMj@Mor+%zFxYe|p-EkCLC zBnWI|&#PBAE*IjU3c0UQT-P!}-{NS72dbpinxC&V!j%e9j3z#S*C0AS1o3GFaYCMC z!h%u;^koRo3g;=!9Hzy$wX_CG9!fJB>MVk+$4(m&_s#9TL_$hh~FJFpl82Wf6) z&htLUlmg%E(aInA<)0LLXnIk3YHASzF(S5; ze$qARi{#6QEuY-9eec_$7v}5(hc93iN~@8JJmi?^tP-+Bj;?3QfR9-Nxc(i6B{-+M z5wea5V6zAZR}Xgg$Mt4_vBeIE;{CnA>P5y1yaXZi3-Ut5f1bm7brb@QGlCuh=d|i&?2f zTMl7>JbD(-3WaA$f_=uj3xbUmFIBL|z+QTf$YYqBdk5kK3*jBkYFd(O?~s)tylgD1 z`77gJ)Za$Y@|Gd=q`CpUpKZL2t@Gb8lJR{(U#o~&FJmD5zqpT<9%1Pfoo%-K)Qf!F zGk^JPACK+%7Oh3D{F`Fr1&f_UnDfWVN)11q&v3rPQwGYhauiP)&Whz~Xo~tM8OG+z zAxvq)+K9M<*Q{WTJT{*x&2(MQYaW!V>ITY6BQDp$PSp)(N+Y0k)vsV)o-%}8!Z0%G z6J_OO{a6+uFKk(uk5f#GFi?(=d2EX?oE>FVy=5h~g^fjV-7`!{slQoP>@5{Tn2YAT ztMvY{_U2~H-PFHul<1E~gond!sDI5U(cfd_)Wx*?bgyh3A@e={U-B8wi~P$5$|Gcd zv47cchULrZXJo}yf1AwXTi6hmjlQWuhKz-%EavtXXR!M~QvPKW&ei_niA?GGkX${0 z?zP%t85n(qT(_LX)ZWaLc>m4_wnDCIXk5<18*gSw{+%P)yYeJvjaDW!@Q$T?4iBl7 z`RWI4zHsAgdEG&N^D}4OspQ>yE?}dXGVH?`9<|iD+H4&puiz&$*dRC(5m7ib@sks= zI9&HEgA48=+Fy=ft=)IZvv`eH4k!1i^=7ys+q|+8zf^ARj+KE*ctVD8Y8eV7q!y2| zX0cfRsz!Hp3`=SpE5}F5P5$W_3}-|oqUcO(ofBF7dbzrx%4N@d1jxx(M+uxyQYw{&Zr&MR}^GELH8!&%8%D&thv zl01=Ms6Q)**Y;t`%2{ltJf43Z1-#&4S~Ey(Z;vEd~#! ziQ&ypu;mDBweGWR_HL2u!)3*AY7X!D!Er1vJIi?D1ZJHG58eONK*SL-nARvZ5j^zN zaF!&m^FK9_(aLjGe_6S?rLS$MOsmHAk!-mCRIWTxu4-YUP_N1V)D&XVx<#0z@zbN& zS^ufpKZ9F0{U=`U5SerT#aq~A=mfZ$Kgj;!T+p{He1R#IQA$XYa;_Xr@g6Xh_<@(R z{7=(@qf0j zoB9vlr`*OnTwtpoH!8#Y%kBf?$>D^oLC`AvTb5WMF4C~a{UPAHv%?pe3DhE+Qi;)H|BzdTksImy|@% z%QvPwcWvCT*HLdCl$kv=ajWk*f@08twdvxSU0U?ds~t}XCGnw;mz92;*med0W*@qLmrg*;nrm~EO#cT%boAP0P&nvx09x{b|?{@I%{csm^AKITQcLP z?WyeadiIFiG@qrcXAiRm<>6ac1o&??Yn|@@ejqv`>8s;4kAtP5?IYH+)evJPZx0pvcmsn?Kg7W<51)e)vtMY&8XHoInlC*lssBouDRg zm)~jrgV_pOQwK|v1rTGw)G@5OE{a`R&v4H^pT(|cF^r3?`)?tmgo=ojkAhyJiddsg zn*zI}jA{{lq$9`klRg<4KCnhSx$_%^PSKZ)Ll)8B4pZ+m>eIJrdlmt`5 z&gwrpC?LUIbyMUOeiQ8Xia*JI(>+X?z*C~w$@Pq)70s=~K*WmmEMHcpwD!4$X|Etu zg4~v`DYqqD&21UZw;C_Mboit19%1K9V-fkao9nBP+fs(^_EFZ~cp1e9b6wbZ#o;gLxK0Lo*+;`EFJ1>v{Q^cTR92kb*Ugg}*+VcY4tAn8}K+ zD*5G6)YT$>VG8r1g*ur(Z_ihBcy&Xa@hwEx(|E)I`8Yc8;&FZ5U*smnv!Ar(DHg2` zXVvmTcGtnF4T~IBA2?|l#W}!AO8#HK=~eYmGc^b1%Rl;$-a={|?#}>rMjlHhu=#e% z!}xwIybe<-w8U&-iB}GNPLZ}(qil$!tTsRP zX!%2n!e(uF<4~=Wcc?jWfrp3Q$+VQX4I9=}Y;g1+xnJqUjZXl~3bQpfy!k8z>g@G> z*`|UmGSELu=KJ96&1C*$|4|!U7Gu0@&6XR<#hNMek^J-E%}Tg~=jtcJDw4NF2%E#a z{$B>lkHJ|Q8%1|&=dib1DxlJ6w$DQv?vbBsVY#wam-|}sN3q8k+?4ZEROh$8o?L<3 zn)Uu=cAjNQVtbJ?x4=|`l(`Bx;(+I@a@eR0Fn!Js8$b9?uCJ%*b?z+VxK;OhQ$myK zyhv%NuCFcG>8W%e-_7PNLyklhawMvdBT+^<66Dd|5v zrdMP*82xU083lPcuR>H3I zgHVxXjCvB$jA#n3)VB_}h56PqFwx2RO!2N~%jFEkhdQ;0lU>463VBb#i`JIpDY)<- z{T{;G3{6hF(K^b1hQ}XgEf40({_~g^=o+zx*pfezwI(TR`8H_KL_NPxGp0$^jkWcT zD4275wGz+m7ZB2^g?@=etxK5bfH#%!SHXoSAHA2&l0P7KeZN z+)G?4^S}R<`Sa`VVvESz=l8;)6aD>a6Os2ai)F~!&@ao5$TQ{7zz~7gU4O!&40)1Y z+8SVPan-U=-%^3gD+}TFFFZ*j+T09)(l*GLrTK@cDM2l>5#3)67V&TXR<7RwS++kw z@ge`PZ&=Ihg?OOozJYVNQ07yy0(M-+Y&DJRcFX)-J5~%%-z~RvKa9K|L|ZFQrab|rUA^oQ6CV14R5jtrB>TRuwren|T z-u3KZ3t!Zv_^P=N$9mKAa#BoGqc)w(d3VG-0ks+IZAXHc;roGG{a@AJv2;msSN7WeFCi(h2* zrN~@3B;wo7D14!L7rw(xM9%zu$mn?jnM<4T71~cC!?#&I#a^Nl-=9T_6U3?FJ>tXS zKJj(2QT#?{K$iTSy0N+h-Tlbec}BNMw^esQcMMrO=XDo!-|2Ia7r#VbfiI?Z=y&P& z>tE5orhh~Kp8iAqIlY2!raBu28SXNSHr#EPYM5ilGn5(@Bgd!S@SfpA!>5Kn8-6hS zY`9|VXzXkZH)a~W#tP#z#!beTkr)4-@gw7>#?OsE8ZR4LkRjgz8S*_$V@!9OW|{6W z<*0e_51O7aRhp_yJ4`Q{_L^!*;<4Os@mWeNi;$1B z(y|H}Nl#cdST^mUr~4m~E8IBR@vY`Bq07CID&oG3jqu zOi}Zlowp($PSaB-bk8EBJwMA_NK(B8JlhAszrL(0*C=hxJ}-w;Qmbl92g?;-%jvST z5y>z}HGGMgVoT@Go?TjV{sZhm8Jpt5R-5Y-+w06TXpk=>G0|6xbl{gyJEdpj+hi#a{6^G7&DZ54KE;CTvrgnH z4`Nm*xey+5zZ~@kr1uVH(a4;pl-Z&39<=KoDNB@?LRl@yL*S9o?<@CWVf}qMO_t`e zLGv?XW9J|EwhURQYVz+Z$hzOXWdqh{umW&M{yE`@ntSp`SbMW;)VSuo-$CQ(@B4&bZ7v<~gmuFIfyY8#wx(+aecv7(mR$#6TZ)3DGf zz311x*Q#rTGrNS1Qof(Yzc*qra*}d+B)_~wTLO~Ab-ymT3;Dg3@c_QeoQQaCdijQz zU)}la2QpCbZS{eM8OZ3gr7tPZ$ytKX=vvnMwR_Zr_ai^!!fG2Q)4csoN`AfFjxQm` zvkDXNF_$~HGvoop>wh)yxwbkppBRJB4MtBZ&&YPv-al}b!2cEIWkw>-cRIeUx~c)^l9%-LNq+gBzIB+d76!n z5vuXE!Wh|_j0v3!agK;QAO#;^tfUVXT1HHkrIESF1ip8tjMcJ4Cbc{m!EF7IIa}>N zkB9(V41URuoM;BdzCeVs zkw?Us=Hx8Sn(r(+Osj`$FUcQb$|Tt`G4Ziy%GTGJmz{PEBDLA8A$2IR})WzuvvH=%gOMK;uSkBGAoPB(tLccu&qkVNMEUMnf(GX+RKrN z(ul7Gz#B-qLUJHp&_Rl0W5Gaf-AOF zvgFtc9Wn-Qh9L2pBjI1E{uAa+U&2wMc!*v35`BIN-#P^AY)TrE>sQg21;`8+@xpib z3`!AxR-SMuhcO}~ z6ynnctf@8o`!q}0Y>tfY*7Vii!Kz~NRwePCEtwM5mYCF9XS^R&MA%03cW!lF}D^{$KT9UzN_&)4`f&$63o2S9g%~#UsdxH1Rv4l^R zNU7j~4ZEZtsGoQY9L65sq-~RUrAeaD{YfxCw~Nv-B(6yi(uvYRwg!ppHl)>0l>GPE zq?XxWqIkU@I8QTz3`Q&iqlnKejF@rbI}=d?tGLY4hx`s{B;;4YCj^+5=|SvzJU|}) zk9dndoNC>y*d^lwP;trCB8ZEWdpk1z{re>+kCps=^b&2H&`X>SZ&Uj>7ALJNVy}_0 zfwB%e3QP%<_1I5jW}s|9ofUzy5xbx~5h$AkE3(XK$!_EyEO*NA;K`*y@7Ja-k;ev z1j?O+F2fcC%AEx^?4hW;Z4-F>b;D z)QOC`_WiB)Eimp~U;l>Z|M|DVzx@gEZ{PjD#{xn^k@Gw`>DUt>GT&1?u&CW<%WbWz z-z)z%2(G^Ws)>Fb+0-0-CLM>b_g$$4S;b}Pg&x91UM{|I$Cucy67_58;vA1FH6hWJ zNg+;jq`L3wQsK`KTftRVBi~?USTAAm`D=6#l!l&0NqVtLhT$?nOnxTMKbU5N?f+>=w??FZo+;2M0VD-K&tl%yAy<5TcKL;o+k?8uT+ z++!w`4}Jg)45^t>Ya8lABEPZ)Le#X$SHhz`XCuA<^xFZjL~SSl#Y%Ph;y^mJsI z*o-5uz~{v-1k_AM0k*H0S5TNvU&mXn*2qry|<@}`%A30&Axp%Cn#@`0CH!3Api(hH08!ACi{ zzK%>~hXUZHum}vLp$sT-rRRZ%iquhD<4zh5ZWU15C1BV7Kv)U(5I`w1P5lQlSbk zjT4N+^#O#?9u&ES9+eZpNr9d~58O)!VT0PEO{2In z3jjCuh8-^Q$~!VtRqVRFLMgrv!- z9a-w@v#>1)jkF_!;tgzRQB(}|L8!%ev<{N6cSUY~ zdR|cNwQru#L<$AkgS0v*ejP?h9r&>S4~boR5mZq-sk#x5u4`!2x}6l1$biXc-|Y>8 zGGJ_hooujOp*Nj$VoGzM40-gFxjgx$x!4DXaIKAa zOi6K0LE%4-vnV$k>JEy5dh$>SqKG=*=)%HWq9{Pnq|gUu235*( z3P6bbYx*p}-q*pULXhlEnUs*43faIGXXBD4j}OX8vZv6STcjFpa4dAK2V(>T`B0Dj zHLXsT1?oE6qZ$#yWT5wgdBu=zAfqEo2N*u62o1&8^{>7Ky`-t+awr+pgj)8fEvhOp zprp$|()MamGc!=UdDkg%$l^7fj<#Tr+V=~~9#EU;uw))tzo67-ft?G=hnX;Y#c)7!J$ac$st*ZL zs69{{^Pu10y=j{MIy+wgcmpp5>@*BsE_8WmuBQxmfgDip;M_u$NJGFR1^-0X-zN=T zR2#TXi+5zC#x;XN+c>#A3w^+0Zn29bycnJnWUHM(1|%^EOh!Q=EI;%vX~T|e+%?^< zY1n|>K^16(fZon0{{|M8#3Y~|fJ@jbAcagMnGjWj`|uhR7IB1TBx&TD=M~+L+#a6)z|}xML1)s79j-_lW)>6zdn9<7@JotwaRI&4 zk=-a&sJk%3<5ML(J>&lTf-?A7*&5!j=|zZn8zldXGC)|>k%9*CmK3S3S9? z?S?7hJP))fIfNx(3?fHqK`y2QS!yQ%h6^gApzbEG7X}wDB(#9q{`iE{afxFRCb?74 ze7swm+odMOO`S0&#qCN+btR`HO-~r_9`EWsCKcDc`@3c&OpQ;PHr0h1DPty2o#jf3 zbB&oi%XN3c=sj04{6j#EeS2IjZc_7!8H~yPEMlfJ!UF=G=F6Q<7U?}|&9I++@cL#tz4$zxKcCXAbwI3~rF zJS_z~%Dd6Xc(gk?VRBpwx^Yi(Po4@dB@UK5c~(log!rlb@zzw_?eChJGG@Gc(wLOH z`xA^w7SNs)z!*$RHGnX96^Z>_ zq0!1BJ zTuRa;G!KH{6{7t#;1Run-87JiICPJmsdN5oe1Tf@HZZLAKi)ki5lwV~YP*q&6YpNDf>+ePY?2itOZaJLl4Ow^3STcv1)TBEk9Ry>}i<8HZ- zf>JhixX8nGA>fGwRP+}UfV&8#U<<+b2ef-X=Gr)@ULt-Iuw}B=P9)C%>RqkYzp4>@ z_S>+#FftlVI)24~K3&C|R~^ayxL1J9IR2-2{hv_be^U4V51dejJxt0#;d!8W4zQFD zPW0e9AID;Ba$WR0-1b|rw{h?P1PjFd|63^fVS8SN4YX-{VxoE+=$j9?i8qMS#b}v$ z*n>M-jXa!bgv9eC3oh_^n`{-UGDUAEfNx#cy2Yo~ZQpX@buIKqt?8&k+ac$wy}MLS zCqBL&w(ENi!jpk_e0WoXg{VN%U54!)iH8ZYV9j(qDZ(?lUy5I@DxdRkq|ue(nxNM> zKMtB>idrtlmgEFS4xSdHr{SO}Q8fb)=i<5;xBxln);raAJ>d01P@VXKbS!c0An07` z>;L@-smCCWlc9Otpxh)Z7bT)Z_ldWOzS*FS#sNVc7Ub1`&!Z$^8b!&*1m&Sv<)tEU zKrS}**0gVG z4vm~JLAWYYp(G1L5Rkl*&dN|FHaJGoU}UL?D@hZ$00rq}8aL^IHhthl4}?k0o(J3X zsdbCdzNU|;2cHU2n|3I`_=uxOUuhbuJ(p=*LOl^JNe>ZBL0Vj|!3d)EkZU;7;4Z;? z1T*1~@LYnjrsL?27cJ9uR^VQ6WCV#eR*gEOq2}RT;!3SIdP*Ef7)n=RBPfZY!D|gx z?K#zU;VF%o;2;jAb~N8gtLarC%~LT+7;yz8j$mmU9YIZWqyH6xHkM$Y`6?{L4+Jgg zW#S)=?}Iegc!_wDD6e6N#zp)>+FQeu2Y8`pnfMFd`*#@8IAS11MxJ5Y2;1mQH3%E@ z?0S0`Q1Y`KUu2t$A73<2Xq7AddeXUfS?|Jud}0{kPsH zY!Vzf7*QGEAY2!!oTgzoNN)|#1Rvp;xJBcl_VzxAoi?c;ER?JA8`LJ(bA21cLE0<; zC396wwdq7nCtW`#O+E-7l5tH7w1mA^*EVXq_(~y4?go!BDW?@KM5GASJKU1~6OuK$#jz!dp2WChE&{+DS9kPc183ls; zNb*m-MAnhyBRH?n@TzH~BD6_*J;*5uG&UPI)}6bjhdwM zdY>(*Gd1pLPwzGh*{0unt8=>clHA^-og9$p-=jy6v)W63kt!n@fUdn3C)xzZPY{yE zA#4X}O5@i&-s|VTWFrV}k`2wT(CE{C1W9OzX3T^?vQIa9d%p*Lkeh-YispL+eRa)y zi34Z+-n>Ec4#+bhyGpfaltgP94cRe*{zhB%@A#4C+c$D!`_WFq)9Y>IbQP1qS;p^; zHb|@Al30yj=}AyOlb1xj1a(1ysz<2?@i|#CdZOvupp7X3S8Bc!+4W!@^0CRwrZ-&R z4U!Q}c8U7hUGjNo%+$YDI|!{th4z#p59fM}x35E(|9AYL$qz{>Nh9^7@ecV4ntmpk z)TpVAO`}=R2W`WO=7Ik!9tmn-f{VDM41Ex#$Xp$?*}6g!8&9Y+gcAk)yAsLkA82w1Vt)1q`kMPjgT})aPAkx zKoDCbk-<4fQ1UcBqtTF-Axakoq8Zdjlxn{xW4v1AL*wCKd%w?pnioY{DJWYSH&832 z*{OHxQ=8{eoPaPzu-vGVG>lVyiWJ>woiu6scY0i#8))7^aBk4%$7`IdK}IyoYBy&a ztd9SG-|z3y@3&%S*TZ+?+~r^K9r2sSQ~#S;3h~Xqnx~L2MpE1+g#?SnH$iD7ng+Q- zi%w{>GmV$8_d_)QnlvQYsGuy++nR>?y}1B+Rs;jRp;3|GAkGNR7&Q;^dR`6siv%h0 z+yI=l`7E_YdTSw$H~NG*uo^^> z*w`FkV@xn!FUuRBoP_%)IXNdEGEZ}lzsQ~CBoJepY+|2eZwPUmHRk0BCWQ2H2%(9C zxTqE7bh_4^BcYMw5HdoM!`$av)wR>J%<^!i^quOiuKLxley^(T+MQPJxRY&eu>JWv zPv4&(gXiN5mbO+0iqVzTuB0t~Yu(R(g)8FDtu%d4X=!V=RePdPTis0U@BFKuulaF0U)FprD^S#wE$B&r zqJYMyBS~yS^1MVEaaR;c+;fEM*}kK@*+xh09QfW9gTD+FJ&%#4Zm=t=iX41AuB;cG zHPn*HjaZs*=b~n%pW5=)xP4Ueb=^~q>-mziEv+l6y{WQ(y{F2Cyf&|%K_xk9NB&f~ zUv@gFwbD|37eTLgC*{^4dVa4Jq+da(pIUdNvI=Ql{^BC#jXeJlH(u72p3)X6Ne$I! zx(8=#vPKtkq?@7URChmgGf&sVg+`{R;iQ-DTRqmA#jpK*tzzT;N$<6vu89ZfLjCJb z(~UFzv}LfLSFEXL;BIJ{nLqFxO%xTSYV)pmApg?5toh*?dUp}SYfSt6dd4e@(%yGP z2Rifo4PF_!HL#D{qO3^lc7nX--CCf+zwXwSGfymq`^T6`b#LdmU(9iO-)=eUbtmaO1ka0M^^{Qy?Ig8pF%fTXhyv(*!OYM4!*ZH7} z?`~>p_j3iUbf(f3DpQ=y`jfqHkGOy>H^gq|X$B(Rhu%4#cquI5DZ z?Gw~ezoNc?+-X3P({5>6LQeA)OBCM^(~mgT*ejY(b1dl()`PgIWeeWAL`^!9OqNR0)cOPzHt_cNKR3a{ibC zli`C-ioxaN`!XX7;VT(iI!D7Z%J-q$@#UhK10E7?A7sn&nXuuZ7JtD z%5$W1Uo&r()21$I9h>KDT}Lanbw#xZ6@Ay44rK6aT#b1OF6LXB4H zjsqR#l9^Htp&pufT$|6e$0%Pz{uLsVEBBc%()u~t zy$Zjt!{-}>^8MufoF6C`f>j&`v@Y;p*`sMASvoEx&luVvSM!V@hHeZ^X|3Pxq8UNUe8QPp$B8!7x?pMh*3VH-auoj>srrzHr3uL~GNYl@ml|cSm4~aUqrQh?o!pzKyN2I{S50%uc5qs>&_)Ha4&xx4tKs2TkE zTRZLMa{VDQk1GpEcQWZN;`(BiJ2U8S8IPa4SjNm^Ir-N-l>Q=VKDXA}sk?*p7;lh! z!7SljbGw-oUox*V3BF-|!Zh+z(m(LVxl`sJ&1up<@m{+#=AU`B-C16%S1{*z>)bC$ zU*&an|HJ$8{*Ux^^J~&K%mvae^O3m()l!f%dxQF*-t6bia$|VQ-q@hs91c2y4&J7B zTX35>#&23pGVces2c714Ff+Keh3^fE!U(t(u^!W zZAJmv*HCsMT}qGWFql_V}(ncdJ!B5NxWo0EsSYm`FMp$BmB}Q0+A6Y{Q3MD9% z;3sB;5hIKkVay0)Mi?`~h^R7^xU>23x>ZunlYn?}9_%2)M)KkXQqdl9lQzpz<0qu@I9~}yaj#$-UdGe{ooyN z0K7{-2gwhSA0|ISev~{9j)CLg1ULyoa0;9TXTVud03U#J;8)-RD1wi`$KWEk1WMpC z_yhO^TtSisWIz@)fJV>+n!#w$0$Ra1&;f1(lfdm@8n^?@0`~x{Be);TD{sVhH)6XR z@$DkMUBtJG_;xYCVuICR4Ok19J%jb|G7b&)5BS`Jlx*UBGuQ&Qf^A?saGuV8u5mpfqjjFBU9m)=XgOnczN5Oj_PuY*ikCDGmew_Trx@xCGy{sm&pGJoYu9nkk+-jkk+-r zkk&)A9uBGXR_cudw}YwFpGH0%IBkbSsfZ{Q5v3xcR1~mcNBa@lj)+hZ5h@}=MMS8G z2o({bA|g~ogo=nz=$P5Bmk5<-7Vbk!c_L9CF+7jd@_?xUJj=CwXSHK4!6A zB2k`5lqVA9i9~($p0_iw=JMLJj%EbS21h`<$f?19==BYb?^lcqh333JQd)n08a&Y>KzzeWP4CVhN_>T2B?ok7NVlrph78vQUs+) zlr#hIyr_{?i{h+e>|b%rDkkk`b}iQ@30i4MQb>k-)O)FqcHlztm0a`4H4p#lSu)MT ze;%2pd(E5s=q;kR2nzkQ_N##s{#L@*O6GaWv_=|wMlaz%CH$v^|CI2b68=-de@ggI z3I8eKKPCL9g#VQ6jD47~9tC;MkAdUh1ULmwgEQbPD1eW_MQ{m}Sij_$yXrw3BWVXy z!0nVz1D%x5;hg(XB2z?UB5p9UK1LSST<0*y+V#y!^4-)KdX%--Eq%1BwPra;d1aJ0 zzaAO9{usRG$f5aqYXu=v2&>i=oz^PC8(u@mdZNU7oNeWh9Wgqwo<4ezM`}Hsww^xg zjRm~1z>1^5ile}aqri%zz=}gFSlwUg-m1Wc)EJ}-r^I@#7D8fuNURTu^&$Q5GR{+F zgF9@@SG*^_urlZ;#)riCd=leBVth!94~g+1F+L>5hs5}>hKKL?6!AS|)(@HW^)x8N zmtA~+k7F0p!z8AMNlXuIOs^fwL*jTy3=fkS9wsq7Ok#Mb7>-TvB2LS$cM+@m14W|- zw5o{INUo^VM6SrxOs?oOnp_d8g?ub+TJi3-@(vrz+sR!#4{bc}gzlZxnF(f5?{4yY z$Y+xiIq;bsitRjcyBA$43gGc@Re&SKKj&$k9OGTKR!A*H&;qqWYK7Et_adDf>mCDI zJU5xk^P1geEl)7Icz)3pv~k=HIys)hHQ%GB<$LtB)MJ4s6<8=eIjh7HX}1J>SczOe zAU_AL(60d*kOg;eO?SR79{L!lXRm>M5;T_QLT#*{$D0n$r}5lp7Eh8M;5m@CEFR&x zP8XXQ+M-)$w_Tqzukvi?4YS|$n*-*Z|-9y5+yb=pv~*kup_f}ef_%W z8i_#hW;^gB>Y3{4q$v%te64&pwzKOMpyw)m-W_jOQ9MYfSi>?!2 zEKgNlp}O>UReV;v>OK?i%jr{p#-+Qa$%p?cA$OVBh5y{)MBHyOz61 zBkhh#Gdn6XsdYE^7Ca3mwX+I%ka_lD(ggNa7Ma^vl`p3C682aovBR>=e1_S!n|XKz zJ1x`LX<5w^)U~8ev)(+#-26QICVyskTK>}Rw9K|UEpyGA%*Bh%LDEWdn6%0qW!Gi3 z`FD0#Hn7j}Up(vlZ+2HUvbXYU{y0$kDqGD*tVg!l9hKd7N9CLBs7x}i1yfj;?6>PqB`6esPIqt=nX5GBvr_03@(Z9;Yn(sLSrh)a(wb_#ivg#9LcVfI!J2m5pb;Ly8{5STCkg4?STxJYNlIZ9H1* zu$t2zq=Q%zW%VR#qA>WQmLAf4hjxHjv9@Ac?proi`J`8TbykMbyEN}*s@z$vBKy{WYBnbx2ivvGR?2>kY0SPOWA}F&0VOS*c3p zIW4wqH2GMh*-DwS`ZjxAeBSs+p61i|0e;i%y&XHA74MX!i{@04FZtwKi%*}%aU^{x zHIQzltw)AyX&6TBps`oOTe9z?lBYFWDRoD>=8*13$G%*79r8>gi*$t?JlDc74HcuB534NG*U!~h=t6C6EgqrGrNR{-ut`v_x|74kJ)q1oHem9y6P7p@cnK`|Zhe{VF}^d$B{PetXP^nF%vA zQ7QhzH>NwHIUC`3Kx`Ky{r1Y1yzjgfQW)#W6#OzjQ-o5Nsrce!(_%a?^=k;i{9z)9;E|nT%pAx@P+RDSF%Rpb zRAiIQL2QKS1vbRoj!icevw`eYHd(2}hT%_9W}<97>kX(zD%q?LuFaIeth(s~HbLpe z)|dve)}|L(f75ioey zo2cAk)fEqGsa$4Z$_O@!6=Dn{n1Z$F?Sp-H+3&lo6JVH#@s2XBU}G@OOw4nVvXJ!y zO#8_D9JWaL4s#n1*i~ZBnG@L}tV3TVl-ZR`^ij+rBrFM@kNuem4g_CloVclpQBupN=N}LCL9>4l6$9m;p{GbD+2il=)KNc;o z3BW7R2I1$wyn=3kLlcO8Bo5OW6TJVEYb0a$g zMQi+UjJ`1_PqXLnw@O*VmIKc-mF8?A@UlT{AwD?29}OvJZL9g@~aHA z@jU(_mCh_f>56%F#{EyMnco369sI8!{#u$qhvpa9V888n4?YJv?QELk<5$G9)&cfm zEXC9TuzBncV|(sTW&Ix2!I+mRquFx&J;y#^ZY7y5!&ox#&2nW0=D7xA16%g~nZkV1 z;YpN`5uwv6=Znwpds>=FiGA4U*W#0+^jSSOr#*RbrJ{ zAak-H_5`cKsSiN&#a))}&^E9=I(gTp3(yY^y< zkTHE&Ur#n!R) z><#uN#Nyj*1KY?pv3J-OwwY~Z+u1gj&E8}01NMwfg6tc~NS~O(RuA~4`3M)H0U@O=f#WS5l) zr6FWUU8SBaJAs-!J)wogIfk~3Vt`FMvY1};%hup zV`P4m5NMg&4hB58U?$mUdk@+^#LlsA*{@6})s--%zS2x-f!TIbMl1JCRZO3nzNtPB zZT}WrIk-yjld|m=e`;XUGApZ7?y<(5pEp`cLbC3QL8^wl4Pv2)f zywBJ30~z~n<9F-6tMhI1Z_QT=4cMRVOIgU?^r(jo?Thd=)0pX#dM8gztJiJJsL@jshK(PSI&CDqsqguac|KA+J8jIf%jDT@_5}IeA8s=@ zH8P*{+k3x{`ec<}jwh?WQgO$V6V6p)ucJAjT{$2|AXq~P*g$=ddn=H3H;`;HK#~e# zm?M!n6Xf{@2yq+R3FYrN`y8Oj0~oGhsvHPZP6<#dE7dUNFifolCK8RocUO8V1C(TC zj50}?rlc$Lm6wzi%4+2eWs|Z)`B2%b99PaMdCC>#hVrxWyHW(CR!tRv*fmX&rYKV@ zQ+rdKsk^DSX`m_DG|Du=G{rQ-^nz)HX^rVk({|Ht(_z!+rgNq|Q@-i8>7GfLE#?4o z6?08<19K~LjJdNp!Q9t8$ee5*YfdxIHqSG^XkKhyW?pOFVBT)tV?Jm;Za!`P%6#4Y zi&^-U_j|&xhF^WZmVO=m68r}E4fmVkH^*d+p2yLIc3 zm^L|i_{gE{CnOJ_G6}|pytE%SW#sgc$?~`Tq*0S5jvSZly>v((K5gpA;qte`@G(<{ zPn(c3e&o#Ik8V4Rm^3wc`0$Yvrw%W@>o7bSjSrW<9p&!`-~E(H$x}z5=j5re-mXV_ zFR`-kk@7dTw4ITqcd_2#jPzb&WosA~dWn)(%IYi81JQXX$zgZj2YY2_w_j6wVQ;zZ{I0nCXSj$KYhy%d0N?rzFt62^IrNt8qSPIw*wyC&U$n^P|jtx{2f@jPP0qz z+RHc8dvfVr`&fCKJW^f~(#9vJjh45Q9^LjHK54=Pd_vfqR_1=%#4!yUH)`*_#PlCE zC3*VD8S=NkY+{D|?LT77$SEV!#-z=7c!Lib#kPnYAgj)jzvIVDNsgTc0+>8`%A}bi zQ>P`5pEzl%ypA84mL_jTO&OUy6;07gG!fe zz~y@eA=e+CoCXJlZ=Bw8IV|t3cOAX=-c|A5KWbktyDaqfMD0nmkS&+#QoeWu&C)KZ zymX!9N8bLayex9aSKi*}RipY18#W{n5==5ASjv##F=@fc!BeLsj{p;yGA?*hN^pDd zrsRnuMotOtJ$}-#*`r5J95Zp!^!gnpO`bJ{#7=Nh*zlzA;KmIbJrz7`*1xKb^6|m4 zep)aVbmWxjBS+MKymOxfD=lVkkYGBkR8@v63r$T-W5D3=fVI~#PxITaHdE)Ti`C<5 zo_bZiWzj7?EYDchTQ*vDSaK}q%QY`ItK9r@m;L+rKkfgFf2#jg{~!Esm!DjIe)){@ z%gWy_|66%Odq#U(+pO)eR2@CpLVmooV|km344gWqrHcHpnaBoj(wqhh5c3g8}|3?AKDMw zPub7dFW4{H^X>QSC5}ptDvn4;14opjm7}AhpJS9`f+NlGoFmh*%8})G)3L?zp5uVy zxZ||r3&$15b;n&taRpNatwN;=)hg7k5MdU|`khfC<#R{Y{;(7OYlEiV*Lw&EjTbI-2o#5(hYW55d~q z39R2&cW>2=9)MECf?IrsVD6hK?k$?Nwk}xf6$PiVaE&&m(~ZhPoWGd$ zjBZs#Ns=wsv(zlu*}!zqIw!}SV=X|{x_;nZUd_c_SQmn11tIRNC~zN|4#*sd%g#00 zxQsR!6B=GXpuc=M+*l@*(-+ctH6ilnF=K+iVZxFv#!?>14jf|Ca2Yj)_(!?ygS;Y^ z7>)I}%+~~KpOe^`$GUi|V7+%A`)mQNNUd`PJWG@`O^Y(B2=?T{Y(CWA3Y1CC4)m;a zHq`l3f+gHLc9C}xtm>+Cx9=*%2^1Pn0Yr7C9W&NU)~x+Be0FYTB5&nvAjEeS3xqhG z96!9i%cvy8mk&}u=aGUrn3Y3>P@Bq551=LvDUPx{Q%-T*t`(B3svh>P>sxLBZeSfSg_KjyVR z-}CxjUKdza%aK&{fw7byHVgB(mic^yQ!q0qO67e7t9CzMh*KHvD@FrXT_Fx_%p2cP zh&plq-qJ`F_l>+eye1R88H!iCuP z!KVI(KZtE-l-mFS+&x!NN}=3eunzsT4?(H!mig|cnD(tg!J22dNBpr47N zHo2+GP%*H`j8FFJZ)l>VTWHD&=T1#E@cx%^8CWw6J;Vj$^33m1Z~Z7(K+|LHhYX}? z^TcgDz{P_sLdiJH(w)XF3&*lMPi70&5-rh78yL;f+xDEpK16u95 zyODqITUFy|N8Re&QHl;hD17G-=5sbF6zDKp&+*~HILjd5LOTHT z$J-ebQ~L|?TfY(q`Uj!vNRV&G9W9p zHt5Iz{8YmC*!4L(eO(Bq0lln7Gtj>l9fqm30#fp3F6(xTHYwcN6h%E#QVg@z*+Pgv zW&>Zo1#52UY6&s`j$H-vZ!L5Wwba;*nsvY(ICF8fR-db(&~6r{x02(Z#}aNinEJq9 zl$?mkEb>=7w$YA)te&O^p|qq|>bW?ruf=MZjnzPkwOMZ8m3YO1o1^$%r%=LY=X>g@ zJuCu@B;4Ra48NAgx!Mg)v!4>nWW*K|cBPa;FnZoy~)(%=%%^K8K>!po%**j~P zmHk3`du@njMJo$y<{36Au#y*KUKcDLYmP^B$v(R;e#{m=r$i&0K(g*ym`;p!#aoSU6*e5-W+!F4`C?`7#E#I4&I*^pJ` zAghRBcLKv+gU()B7rx&qOyyS;c#6?aRMZD*@e61Qd>~2nL|epz!ij;!#pvWrZi?zz z1MbwzV&xIQ@4$4cvpoO?1nCSc%t>^6FM_#H^p)!?3<3C+3+@8x>AeVX9YyV3`!%Dn z6IgX;c-}flGRw4MZtq2~AQT;PSziVDhY_{8KyNjGN3DPZM>E|AEOW7>U-T--F)FzX z@YCbbsly_HpCBu=zFIT-3nfu?b4&uHW;F4~81F$Ci3`L-NEBbj5Hf%=QX+_wcVjZ4 z7SMcngum6@NVg8wkH=|=kjlhJ!C!F!26xx2^PQ00ZSnbO4DMnUIy7eIw@~-)#gM)^ z9c}DTPYLnEiUJ`%1Lulz5r^92MeZhq+~FYH3e%45bCOQ+)y1sSuV5JA5MA>%w}Fw} zCXRHR#H`gtSW*O}R;`w%nst}%S#S0n2|9(+WlfK9(A%W5NpA|)A~WeM8qG=M)~Y;2 zu*zV7;zUZyR}f&vo;KQXAWi6y9R7~VGjTg{PO7n46(#FF*u=jClKIr7bPKNx0Z%fz zJWwk$$^A%!Ar1>rr-MT3LilgY6XIxSN;ji2hS*uhME32^FJ7ctorVH-{~$Gyl&zn^ zo_tsIe=(~US6tjASTkaXfI=ltqT6>B;-99>6+;I|p*AGku0)#?;xZ=9B zOtUuCij&%CRw!G)NAb5+VxV?gZqcWZJBLoV-_eS@SVT#PWJaH2n$KPi=iOAk641H{ zO6#V2A|OxiL9XWFnu{7pK8QNQ*h!T-zlJTC-Z8qQ9s)r($R`pv_dxvbv*b9jD#SFd|ed zu${CA>p`bfKn4xSDyps~w$VIIChJyS7nB0#?Cz#RUlFE|h8v4UI1P~3yp$B;*v}Bh z=2Y9`u=?Wg4ziPP;e&Km;(8ekmPBpS|@<2Pi9-4Lv%@V|F=z4z56RpYGENzPJ#+pJ{La2aS+&lJ+ ziYt0-OzXKPFnuOn=X%$bV{PjR7V;pK2c8#fM)jQP0Bu;W0xOW;GrF*^P~xE~KP^h; z$&0Tn`(!quBdmOWJEg@7AwQ)q2C6h6|5wr#;lH;D& z1_BlZy$XzAaFza=QAgbgFjd`J$m?L%*?~M*wHmd-_}1spx7%&G))alAX7wsp?g18` z!6sN^SZ}_RHPw19wBnmd@ zTAq=l9>!ocKN-%G1Y5o{iYG#j+Dmn3>txUgnL0esg%7W+){byU(TWdJu|OsWCAAMe ze*hZ{j3HAeEd}y?O@?M2hH{vp12pSIZM$^~G~m0N+}3EFtbx{K4Om^=YF(42S#0q?JAA(aw z-N&pTTDniYiqrfBnI%;SqkfG}wHitHt0>mK;60mQFB&}nB&Ne=KJNlDg+d9o?x2;M zq5+~-PtR6RgTE!^-zUr8A&S|F}5?jZ|5!Sv~u?O+gj$q9cjV zemj@CRbixvDXa5ya&X zmO`Ws!8pX`5EDRz1Yr`yx)An491kHSwnL$i+r`z} zwV;|>?O?SZs};Cfxqf^SXrW(sH*qHiHwjJ+UJ^1YWNwY18Y61Vsd2W(&6>SxuBhd% z)wEXkS`%u$P%Ep}u3GzQPp`eOc2@1(wNKanA=EFlZfN(=l+d)$1)*z0H`fWRv#`#x zI`7o^q)vXAGpue{$FPB6bHY}Ky%%;g>{8g(@Qmb_hrpq^2`V*T3nJJj!Ae|-Jt z>aVMRr2fVF#SNZs7}zkhVY7xWHyYMxN}~mhZZ$sD_*&zVsESc_qFO}_iMrS1=_b>g zWHs5_@rFs44 z3C+hgpV|DS=Bu0UXnwx=^%g5z4rw{1`2XSL2~y}tF%=w)q^+stZ{ z+2;GUsckp3-QV_n+na4gy9(_>+qG(UrrquKruGfn=f(7knGy3=%#oPO9U?lk>d>u2 za);CoFLl_|ab;{+Z1dQTu}{a2j-3^|Bz9fwp4j8Dd7UoBS>qz(M#McEw<>N&+^2Eh z#u@Ro;#1=1#=jc>UVKh`Ui|N!?VZCqckVo<^PotWU23PXWaG zA9mxY-6*`oTPQGIY`NF)`NHVQmtwpezlcGi-jI?acsc z#co{jG~zqaK&b7^*YkB=A*hV7yjvQ!FCxvqu z*a^>SMrS-WAWxO=@eSQ*gTL;UsXC9tY`$2SZM0G!Js;heXN*_NG|~o@yoG|zBs~~& z@qL6>58G~IvG1+}fdJPZd)GclPLj7V4wveBU!AS^*lqP`HjCU1%}-0Pty|1X_~56v#tGC#fpZwjsS zkM%h%RXd+Op=jw&9aCy_x=qo*7)>Z&l*{%s@1omzvl&G*u>|{JfYdVr_!@K3lprC} zGu%8B&L_A7A(b#>CyG^=o)=gou4Y z-7PJ74Hs--HW-d@Smd2jQm_=sRkK3WbI^Pf;6ipb0vPw_AN>h_paHOH$@P{GT*n83 zCBZ)+*r~0BMp_k^L5Fh^VSB)*-2|)A;%t%!jtX%FJ~oUOMjX^c7`6Uiz~tW|6o+O4x)u6;?+03&SW22u)gFAz}!&7 z-`BxhTdwS&0V#*Dg{c|A7L+zGw#epXx757+7_OtgXrIb&YQggc2z8166e=P-I`{?np}N4@60G{I!f7BcXjCYHivd&zrAmma3$x#V z4*kKV)v$1&aKZ$p64qS4{X^C~NneRe)Pndywq{0X0^T0ki$9cFbsWIMCH@t|T?9pW zPU;ls-PEASe?r^vu)Evv-8>vd$jro9zTt^mP{7~_rV=5$V^&#H4ujRE7QDj~#cm8u*-suI>!rf^+LKa zPbEeY5}Cp0seD0#ZZB?Z*m#oB`XT^(%aKG}cT_ueDOtBarxiDze}js>%y^7s#&%=H zThmc!#UktmB~OxSZAmt{34oNB!xzI6Jmqt0uvAArrLAQND$7fcMK07F%Bi1_=$6o{pOF&Qmf2DnQ0v}5hw(-EOq z0D@`*ro)3={0WFF3YWoNxC1}eevo6}&M4wVf#WhL{$M19kFDYvpP(04vDo)|!RGTR zDkC<;@jFiHs|B@T23G>tDRn3vf@{&J<08iUIl4orW`N~AU9cDogm-rF&hThF4B1Gv{xr}^qYGh?U(GpYG;xuG{X;Nv1Ag&a!}H)RB>n(H z6Rvo$IPP?DfCiFySS?sJ8E$tN3|K@O#9`RZh!dtlOm4E+w~$^C1HE7+(A7qEtSIS{ zlUNMC#o^0RJyoy(*KE1QFqQ1NC*hMCrk+dCWAV_oYL=(3+7--o#?6%CzVIC{y}QX% z1FkVgQgIE{_|am2k0<@XJMa#mi4o}J1)v&~5L(!OB_$ zj->aw*@dVWYp|jq0l~5bSdxRdHG*9RcyKO)7qre61d;|>NHX3_3ddk5EY`%uI||ls zarD=`!-u+?eq>I<90I7%pPM^^M~XkB$nc<1Z;6|~4A;wpR5Xdm0grI~3ZVsYg-8q2s^_>5 z(#i;ql@Z5D(p7O8kS}lF&o?Z_dbkAF=eUL97?AaolUE0=dM9m!f@M)4;1KwV;dU9A zNG@=N*94oYn&sxTaE(Tv9mtN?UG|~0kgEXWE?CHfgQ-Ogu>5|AyQ;-qI_e$=R%y1R zqhs*;y+rR-`&ToIW<2Q1zuLn;!UDAhFL)OVWU86xDF;BWmwXeQf@%DUu!+9`OuBtE z6R|vSSKiab!CIcC?!99HOzi*wI2!SN@s8xn-Q;f_DPgU@M}7AQj}H?bw}M{}cpMVn z+js)5R0=PPKWw?ppgfYOXR#OqVq1Nrx0KfU6nx6OoQw{Tvc7TxM{1A;4?j`!>+UGzHAB*vXe*;ddW{Jj##fsxi!E#6aA8xeU>H8=~{JE}jBU z;ylKID#pt|FjFQx$pEMk;X>aRC~~XK7PI);t(Nq zQF3>4N?oT>9h}_DQ%DsH%m5hL1Mb}IqS#p@@~qdyav`?;aM{E`ESmvTDQ-01lLcY% zgDv+uxF|`GKKQ0}Xo{y@AIP3YhONlI_!h~Y9~?BQs;&o<-?; zy-Pdn^;t#}#LP$4aRmx@awu0>^wTe~kmdoS)c~vmS4>p0#l7GFX zjGXU-Drq!@>t%=}K~O`b5O|iG0`2a(?jei@5(SX~vw?HB9Z3|y=!VddFSO!s=d+sd zN}d>A35H8KNTqj;?YulM;S_Isb#sd68RsY<*j?})^%JxZnE}mkNY2I>7s--CC^jO& zB2FSY;Jpe~AHf7((e*V1VaxotKampO-330k%V1ztp=2C%eFNTsJdd|E4s{993?bgd z4E>FTE(7hqK#?$GGqjUAscvH}5RXu$C$SPfgW7G1IMQ2SUlcv2Skpdr62kV5Brp#| zx?^3&Kq2-MmwFDJBX9wSJR3{TV_keK7#LyYOF+>Tkk6olpJ`IpAO{A!Mo4pE=MT^g z?*yW88J$3yu#{2s3ly#pnNeKX`I2QR;PS=^RAPP7!44=y*9fAARa^k(@$9N}e_ja> zARN{RjNy*!4#L(Hd#T_}n!xWI=vB{?v^z&4>&zYS&ev&u#nwXqr51ZWnB4>L3D0+R zH2e7+eq;|{51g5elBH(PLXX7>%6#sA{>puN_0j~HQ|QYGcNtj-JglR5GV4hp8sKH+ zb_|29k`@JaFNR|-OEC9YP<}5u4bp}qumnd`KG;G+xG^|P2=E3>7;GJh0}#n1QmeUy zSh_#oQ|RP_EX10^wib>=n#~*_FQrfzelBAWib2GDJ*=*}P$g<>_Ipc;diK)oYxnbm zaP~c~dy?wt_Dm0=3UuFEMztCa$l?X+UlS!@pLra2>%va66ZcQS^xpzT5l-wKcfxS!j^j+v6M$rf` zfe|oIK1Sh4n0+Z90A7ue_(R54O<>IZ{4d|ecO79r&sBS)%>xK7%~jvUvgN`Qtl_Ew zb>^=gW^(gN53_we4gGZteO!uWA43lp@X!SF2q>350CW2YWe?!yF6wChC5R&0{dYzc z`3bhWTkZot^0F%l3y!D9E8!s3O%!&e+e#b@&y-R$Zk~mIE!>7Bk<_cxZJ&iN>#oSgvXU##u$v# z7jYc(mx!aiW6=&+)qhG{a$Q7v5^NMW)tkVn4&hO;pn;0@67Nsm#LElTMOsslw+cZm zfxw~KRZCUz4-TesKbh&o5!Wo6=_Cn?=;}(tO;5qSfYB@rWBDiyn_5JI3< z@i}s^y8cZvhW!SCsgrKs4XD-9?X!Tgy*2x<5<6r<)LS(*`?s`Ah2Yv(fhxI#g4Dz7 zGEjLDi}Xx#{D)Y8y;}<()D~iLf32vtYWGCot70&y`?k88{Rpj4AXexwnz%|$K)GZ& zu$OL$l1rltjbimPv{W8q<&t2Vv}og!`Z*vJw_4-HLa6`~>z3Lb1={Xo#wj5Nb&2Mu zRQr3>Y#2uNZZqBf9tPhUhW8g_cz+GH-tZlrH-s{3LRYDITG1yeH{r1%C;~QBQNj#R zfYmXW%qli7I<+VPl4PmZu4+uoPfYRIRWP#PFgr`_W}@9jRNqU9GPuprfmjw+_}~-O zFv0d~g#PBtNxff1m3>v`7x-^LMM8cCxi=!Lu&A*!0pBz`n`Hb34Oy_A4^nw9JQb!) zBbN%qT8gTw_7-IOl~^#tb!N}HpyG89xa(j=8kar$c?8D4(&u2nvJ~|kr}=_f_+|%s z3lG-qljau<#N*qx+;?@MG(&!ibBTty#ZknBdjL+*wIMMn8n5PS%*C5@LU-lC&LGWMIS4*h9oq9*mwi&7oPHWbc4}!-%NFCX zx}TV@Ai&j4p9FT;1S$phb3s!K4v8P89Uch`I8RwhPFHgwK7|U~2NFBh4G>DHxkrNt zE3S@d_+c8qksZ&U2m&vSbuZHT#p?*(u{grCG$>N>nqr2;SCMVtOzx;3vp^O% zNk|&5#X__Fwdt{quFoEW9oJKJCneu8*!-&6_g=88yxf)?P z&85R3Mc$h)<3{$UI7WJ<)ip%-23=dh2}uJnHh7nG8kTep7|)iPd3>33Ah4k}be!K@ z{R!m^8{pa&Y~h(D9&(%pgMfCm((Qxhdsa@+YH0RWUafuzkY*T=!g_T1F4%#~7i4;d zl4xh?GX3Q%uwZ{eRg(4Pvh?N?@^vXf_1g!77tQSW5^cokmg}X96Dat&ejvG=($5tbv#3B!mdOw7bD8{rPeji-sbsY;S&+$7RC~A) zU(^~rZ!((h8412p30<|qbun@9K7h?Cbhx+au^++kEn4&*@Vx%ouTYv0AqVBjU-;X8 z0Y1Yvgo)QYkw;efOePS(VU4`KuUrQc^h689-9KP#z#RLP3^;L}k`7e3mpPmUq5#QS zBf&c*i~11iHTXp@>3u=fYcms#p{n;w*aJ{Ke|H^D&<9xB;~jeN_68gef(6zD;>Ux* zvyQgheedWbG3H7EGZ=uBvmzfY&FZ9_l{afl?YQ>1 z&=n>Hn}|#zN*sZHf-nkHC3t44f=l26-o3RDAfp@)fBVmT#%icaaCUkMF!0`x^v{pN zc*la$@qu$yx&ikD@;3)n@kXlnE4(obHeaafd7r~uhN2L~k49ih9SL0cl7dyf(3MPO zYz*tSXqiqaLC7GQtGCo9YLGjvc}w8P3xp%+o?bDbmua z_9qeazsi~xKv>fAL@qTaUY1QGhyHREViFXoL5hd!2FmZcnbLZ{UKO57)&#eLtw8Zk zt&081e!e@0Ti@4(X*_}%2T-9d_@~T)E(Bt2PPtKq=Rmii-2*a@ZjNRIx@ax-n=-o^ z4Y4$V=~y7_0WhqpVTG1rMd#r4V5x8(!i9JN@&TlaELT9E!$+ZdcE!ReyMZ*27Xc

U79p8&ssaX#Io>INJdI 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 literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Light.otf b/src/fonts/FivoSans/FivoSans-Light.otf new file mode 100644 index 0000000000000000000000000000000000000000..1aca573ae3d6f5a9021277c100d417aa8ccd8c23 GIT binary patch literal 45684 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 literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Medium-Oblique.otf b/src/fonts/FivoSans/FivoSans-Medium-Oblique.otf new file mode 100644 index 0000000000000000000000000000000000000000..d78d88748fd846c8d53715351526b469ad9f7e44 GIT binary patch literal 61980 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 bSG$Svj$52t>3Q9bCwkP`7x=q(m+Suk?JYTj literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Medium.otf b/src/fonts/FivoSans/FivoSans-Medium.otf new file mode 100644 index 0000000000000000000000000000000000000000..cd3fa7d6443a95c545988c6fd67e50aa20d4552e GIT binary patch literal 47852 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 WxyQMeG2ae+%M;F?z@NRpQvV4%nx-HC literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Regular.otf b/src/fonts/FivoSans/FivoSans-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..6a3c8c2b6571a154c8153a3a3744cd9934dd8f2d GIT binary patch literal 46400 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 literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Thin-Oblique.otf b/src/fonts/FivoSans/FivoSans-Thin-Oblique.otf new file mode 100644 index 0000000000000000000000000000000000000000..fc589b3b39ae638d60a893b6086c5ff1c869d10b GIT binary patch literal 60864 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 Hz2*8pF4t7J literal 0 HcmV?d00001 diff --git a/src/fonts/FivoSans/FivoSans-Thin.otf b/src/fonts/FivoSans/FivoSans-Thin.otf new file mode 100644 index 0000000000000000000000000000000000000000..0de4219a5d8770c9fda6827633c49f0ff34edb7d GIT binary patch literal 45756 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, document.getElementById("root")); diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 3d8c500..f1c4292 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -10,7 +10,6 @@ rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.85) ); - .onboarding-nav { display: flex; justify-content: flex-end; From b3564f9063a3c7783cad3111170f72f4636865b6 Mon Sep 17 00:00:00 2001 From: robomantis19 Date: Mon, 16 Mar 2020 18:44:07 -0400 Subject: [PATCH 305/822] added search functionality --- src/components/dashboard/Recommendations.js | 37 +++++++++- src/components/dashboard/_Navigation.scss | 9 +++ src/components/dashboard/navigation.js | 81 +++++++++++++-------- src/store/actions/filterActions.js | 6 ++ src/store/actions/index.js | 4 +- src/store/reducers/filterReducer.js | 21 ++++++ src/store/reducers/index.js | 4 +- 7 files changed, 126 insertions(+), 36 deletions(-) create mode 100644 src/store/actions/filterActions.js create mode 100644 src/store/reducers/filterReducer.js diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 575330d..46dc607 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -13,12 +13,13 @@ function Recommendations({ recommendations, userid, recommendationAction, - isUploading + isUploading, + searchTerm }) { useEffect(() => { recommendationAction(userid); }, [userid, recommendationAction, isUploading]); - + if (isFetching) return ; else return ( @@ -27,8 +28,10 @@ function Recommendations({ data-test={ifDev("recommendations-component")} >

Your recommendations

+ {console.log('searchTerm: ', searchTerm)}
- {recommendations.map((x, index) => { + {recommendations.filter(post => + searchTerm !== '' ? post.Title.toString().toLowerCase().includes(searchTerm.toLowerCase()) : true).map((x, index) =>{ let posterURI = x["Poster URL"]; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; @@ -52,6 +55,31 @@ function Recommendations({ ); })}
+ {/*
+ {recommendations.map((x, index) => { + let posterURI = x["Poster URL"]; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + + return ( + + ); + })} +
*/}
); } @@ -62,7 +90,8 @@ const mapStateToProps = state => { isFetching: state.recommendations.isFetching, recommendations: state.recommendations.movies, recommendationsError: state.recommendations.error, - isUploading: state.upload.isUploading + isUploading: state.upload.isUploading, + searchTerm: state.filter.searchTerm }; }; export default connect(mapStateToProps, { recommendationAction })( diff --git a/src/components/dashboard/_Navigation.scss b/src/components/dashboard/_Navigation.scss index f394727..f54ee1a 100644 --- a/src/components/dashboard/_Navigation.scss +++ b/src/components/dashboard/_Navigation.scss @@ -125,6 +125,15 @@ cursor: default; } + .dropdown{ + color: white; + } + .dropdown{ + display:none; + } + .Year:hover .dropdown{ + display: block; + } //menuchanges end .Links { diff --git a/src/components/dashboard/navigation.js b/src/components/dashboard/navigation.js index da4acb0..2e802dc 100644 --- a/src/components/dashboard/navigation.js +++ b/src/components/dashboard/navigation.js @@ -7,6 +7,7 @@ import { faBell, faQuestionCircle } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import "../dashboard/_Navigation.scss"; import { ifDev } from "../../utils/removeAttribute.js"; +import { setFilter } from "../../store/actions/filterActions"; class Navigation extends Component { constructor(props) { @@ -18,12 +19,20 @@ class Navigation extends Component { handleChange = e => { this.setState({ search: e.target.value }); + this.props.setFilter(this.state.search); + console.log(this.props.searchTerm); }; + submit2 = e => { + e.preventDefault(); + this.props.setFilter(this.state.search); + + }; + logout = () => { localStorage.removeItem("token"); }; - + render() { return (
@@ -31,32 +40,42 @@ class Navigation extends Component {
{/* hidden */} - - - - Open main menu - - - - - + + + Open main menu + + + + +
diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 36fa57a..318b2ae 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -34,11 +34,11 @@ function Explore({ isFetching, movies, userid, getMoviesAction, searchTerm, rati ) .slice(0, cardAmount) .map((movie, index) => { - {/* Checks if the film is in ratings */} + /* Checks if the film is in ratings */ const isRated = film => { return film.name === movie.name && film.year === movie.year } - {/* Returns the movie object if in ratings */} + /* Returns the movie object if in ratings */ let rated = ratings.find(isRated) let posterURI = movie.poster_url; let unsplashUrl = diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 7711f4a..e1de971 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -7,7 +7,8 @@ function LoadingScreen({ isUploading, isFetchingRecommendations, isFetchingWatchlist, - isFetchingRatings + isFetchingRatings, + isFetchingExplore, }) { return (
Loading recommendations... ) : isFetchingRatings ? (

Loading ratings...

- ) : null} + ) : isFetchingExplore ? ( +

Loading search results...

+ ) : null} Based on the connection to our server,
- this process could take up to a minute. + this process could take a few seconds.

); @@ -44,7 +47,8 @@ const mapStateToProps = state => { isUploading: state.upload.isUploading, isFetchingWatchlist: state.watchlist.isFetching, isFetchingRecommendations: state.recommendations.isFetching, - isFetchingRatings: state.rating.isFetching + isFetchingRatings: state.rating.isFetching, + isFetchingExplore: state.movie.isFetching }; }; diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 7fb0a84..ec51373 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { connect } from "react-redux"; -import { ratingAction, addToWatchlistAction, removeFromWatchlistAction } from "../../store/actions"; +import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from '@material-ui/icons/StarBorder'; diff --git a/src/utils/debounce.js b/src/utils/debounce.js index 5fa9269..819427d 100644 --- a/src/utils/debounce.js +++ b/src/utils/debounce.js @@ -1,8 +1,3 @@ -{/* - * Used for handleChange, the search action runs each time a key is pressed - * This function waits until you're done typing to act on the search - */} - export default function (callback, delay) { let timeoutId return (...args) => { From c13a4234cbfbc1b7f479060b7202dd100c2393e4 Mon Sep 17 00:00:00 2001 From: cmruss Date: Sat, 4 Apr 2020 23:14:51 -0400 Subject: [PATCH 458/822] maintain aspect ratio of movie card on responsive sizing --- src/scss/components/_explore.scss | 7 ++++--- src/scss/components/_ratings.scss | 10 +++++----- src/scss/components/_recommendations.scss | 7 ++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/scss/components/_explore.scss b/src/scss/components/_explore.scss index d88e41b..cc2c224 100644 --- a/src/scss/components/_explore.scss +++ b/src/scss/components/_explore.scss @@ -14,7 +14,8 @@ .box { border-radius: 5px; overflow: hidden; - width: 100%; + width: 30vw; + height: 30vw; max-width: 33%; margin: 2.5%; display: flex; @@ -50,12 +51,12 @@ align-items: flex-end; height: auto; width: 100%; - padding: 1rem 0; + padding: 1vw 0; background-color: $gray2; >* { width: 50%; text-align: left; - margin: 1rem; + margin: 1vw; } p{ color: $turqoise2; diff --git a/src/scss/components/_ratings.scss b/src/scss/components/_ratings.scss index 6f961f7..90288cf 100644 --- a/src/scss/components/_ratings.scss +++ b/src/scss/components/_ratings.scss @@ -14,7 +14,8 @@ .box { border-radius: 5px; overflow: hidden; - width: 100%; + width: 30vw; + height: 30vw; max-width: 33%; margin: 2.5% ; display: flex; @@ -44,19 +45,18 @@ } } } - .action-panel { + .action-panel { display: flex; flex-direction: column; align-items: flex-end; height: auto; width: 100%; - padding: 1rem 0; + padding: 1vw 0; background-color: $gray2; >* { width: 50%; text-align: left; - margin: 1rem; - font-size: 1.5vw; + margin: 1vw; } p{ color: $turqoise2; diff --git a/src/scss/components/_recommendations.scss b/src/scss/components/_recommendations.scss index d241b1d..08a0a80 100644 --- a/src/scss/components/_recommendations.scss +++ b/src/scss/components/_recommendations.scss @@ -14,7 +14,8 @@ .box { border-radius: 5px; overflow: hidden; - width: 100%; + width: 30vw; + height: 30vw; max-width: 33%; margin: 2.5%; display: flex; @@ -50,12 +51,12 @@ align-items: flex-end; height: auto; width: 100%; - padding: 1rem 0; + padding: 1vw 0; background-color: $gray2; >* { width: 50%; text-align: left; - margin: 1rem; + margin: 1vw; } .stars{ font-size: 2.5vw; From e163f0b55f2c4ba377b785059f848c2ac47a389d Mon Sep 17 00:00:00 2001 From: cmruss Date: Sat, 4 Apr 2020 23:21:50 -0400 Subject: [PATCH 459/822] object-fit cover and height 100% to movie posters to make up for inconsistent sizing --- src/scss/components/_explore.scss | 3 ++- src/scss/components/_ratings.scss | 3 ++- src/scss/components/_recommendations.scss | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/scss/components/_explore.scss b/src/scss/components/_explore.scss index cc2c224..a8b4f26 100644 --- a/src/scss/components/_explore.scss +++ b/src/scss/components/_explore.scss @@ -29,9 +29,10 @@ width: 60%; overflow: hidden; img { - width: 100%; + height: 100%; position: absolute; right: 0; + object-fit: cover; } } .text-container { diff --git a/src/scss/components/_ratings.scss b/src/scss/components/_ratings.scss index 90288cf..4b2eed0 100644 --- a/src/scss/components/_ratings.scss +++ b/src/scss/components/_ratings.scss @@ -29,9 +29,10 @@ width: 60%; overflow: hidden; img { - width: 100%; + height: 100%; position: absolute; right: 0; + object-fit: cover; } } .text-container { diff --git a/src/scss/components/_recommendations.scss b/src/scss/components/_recommendations.scss index 08a0a80..e8354cf 100644 --- a/src/scss/components/_recommendations.scss +++ b/src/scss/components/_recommendations.scss @@ -29,9 +29,10 @@ width: 60%; overflow: hidden; img { - width: 100%; + height: 100%; position: absolute; right: 0; + object-fit: cover; } } .text-container { From 72662600adcc1bda1e34db092009ae2efc131cda Mon Sep 17 00:00:00 2001 From: cmruss Date: Sun, 5 Apr 2020 00:00:44 -0400 Subject: [PATCH 460/822] aligned navigation items --- src/components/dashboard/Navigation.js | 4 ++-- src/scss/components/_navigation.scss | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 37890b4..b08438a 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -94,9 +94,9 @@ class Navigation extends Component { className={`recommendations-button ${window.location.pathname === `/${this.props.userid}/recommended` ? null : ` hidden` }`} onClick={() => this.getNewRecommendations(this.props.userid)} > - + - Update your recs + Update your recs diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index 652b11b..248e1f2 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -116,11 +116,10 @@ } } .fa-icons { - padding-top: 5px; width: 14%; display: flex; justify-content: space-between; - font-size: 1.4rem; + font-size: 1.6rem; color: white; } @@ -141,8 +140,10 @@ position: relative; white-space: nowrap; cursor: pointer; + display: flex; + align-items: center; .angle-down-icon { - padding: .5rem .5rem 0 .5rem; + padding-left: .5rem; } .dropdown-content { display: none; From 312376bfd2e9fdf9d6f6ab170cf95b2894906538 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Sun, 5 Apr 2020 00:34:27 -0400 Subject: [PATCH 461/822] Updating README formatting a few of the headers didn't have spaces after the hashes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c628f7b..b4eaeaa 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Gróa will use our Discovery Engine to present movies suited to your taste based --- -#####Libraries and Packages +##### Libraries and Packages [axios](https://www.npmjs.com/package/axios) @@ -107,7 +107,7 @@ Gróa will use our Discovery Engine to present movies suited to your taste based --- -######Libraries and Packages +###### Libraries and Packages [apidoc](https://www.npmjs.com/package/apidoc) From 74fd6bbe0a647662bfb300241c28c9f7496259bd Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Sun, 5 Apr 2020 00:37:38 -0400 Subject: [PATCH 462/822] Updating README forgot one space --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b4eaeaa..8269e37 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ In order for the app to function correctly, the user must set up their own envir [redux-mock-store](https://www.npmjs.com/package/redux-mock-store) -####API Testing Libraries +#### API Testing Libraries [Jest](https://jestjs.io/) From a2ca522241c21792e5f98b8c760af8e7a4f44a2f Mon Sep 17 00:00:00 2001 From: cmruss Date: Mon, 6 Apr 2020 00:05:20 -0400 Subject: [PATCH 463/822] clears input when new componet mounts, hides rated movies in explore --- src/components/auth/DataUpload.js | 12 ++++--- src/components/dashboard/Explore.js | 17 +++++++-- src/components/dashboard/Navigation.js | 40 ++++++++++++++------- src/components/dashboard/Ratings.js | 8 +++-- src/components/dashboard/Recommendations.js | 6 +++- src/components/dashboard/Watchlist.js | 12 +++++-- src/scss/components/_navigation.scss | 19 +++++++--- 7 files changed, 84 insertions(+), 30 deletions(-) diff --git a/src/components/auth/DataUpload.js b/src/components/auth/DataUpload.js index b25b727..8e5adff 100644 --- a/src/components/auth/DataUpload.js +++ b/src/components/auth/DataUpload.js @@ -1,7 +1,7 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; // tools import { connect } from "react-redux"; -import { uploadAction } from "../../store/actions/index.js"; +import { uploadAction, setFilter } from "../../store/actions/index.js"; import { ifDev } from "../../utils/removeAttribute.js"; import letterboxdLogo from "../../img/letterboxd-logo.svg"; // import imdbLogo from "../../img/imdb-logo.svg"; @@ -10,9 +10,13 @@ import fileAlt from "../../img/file-alt.svg"; import Congratulations from "./Congratulations.js"; import LoadingScreen from "../layout/LoadingScreen.js"; -const DataUpload = ({ userid, uploadAction, isUploading }) => { +const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { const [uploadSuccess, setUploadSuccess] = useState(false); + useEffect(() => { + setFilter("") + }) + const toggleInstructions = (window.onclick = function(event) { const dropdowns = document.getElementsByClassName("dropdown-content"); const dropdowns2 = document.getElementsByClassName( @@ -198,4 +202,4 @@ const mapStateToProps = state => { }; }; -export default connect(mapStateToProps, { uploadAction })(DataUpload); +export default connect(mapStateToProps, { uploadAction, setFilter })(DataUpload); diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 318b2ae..169afaf 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -2,13 +2,22 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; -import { getMoviesAction } from "../../store/actions/index.js"; +import { getMoviesAction, setFilter } from "../../store/actions/index.js"; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; -function Explore({ isFetching, movies, userid, getMoviesAction, searchTerm, ratings }) { +function Explore({ + isFetching, + movies, + userid, + getMoviesAction, + searchTerm, + setFilter, + ratings +}) { useEffect(() => { + setFilter("") // Returns the ratings getMoviesAction(userid); }, [getMoviesAction, userid]); @@ -45,6 +54,8 @@ function Explore({ isFetching, movies, userid, getMoviesAction, searchTerm, rati "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + if (rated) return null; + else return ( { ratings: state.rating.movies }; }; -export default connect(mapStateToProps, { getMoviesAction })(Explore); +export default connect(mapStateToProps, { getMoviesAction, setFilter })(Explore); diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index b08438a..5aec5b7 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -8,7 +8,8 @@ import { faUserCircle, faAngleDown, faBars, - faSync + faSync, + faBackspace } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ifDev } from "../../utils/removeAttribute.js"; @@ -17,20 +18,28 @@ import GroaLogo from "../../img/groa-logo-nav.png"; class Navigation extends Component { constructor(props) { super(props); - this.state ={ + this.state = { query: "" } - this.sendChange = debounce(this.sendChange, 750); this.handleChange = this.handleChange.bind(this); + this.sendChange = debounce(this.sendChange, 500); + this.clearInput = this.clearInput.bind(this) this.logout = this.logout.bind(this); this.getNewRecommendations = this.getNewRecommendations.bind(this); - } + }; + handleChange = e => { this.setState({query: e.target.value}) this.sendChange(e.target.value.trim()) }; + sendChange = query => { this.props.setFilter(query) + }; + + clearInput = e => { + this.setState({ query: "" }); + this.props.setFilter("") } logout = () => { @@ -78,14 +87,21 @@ class Navigation extends Component { {/* If the path is upload hide the search container */}
- - + + +
+ diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index f15d7d0..0399ef1 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -2,7 +2,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; -import { getRatingAction } from "../../store/actions/index.js"; +import { getRatingAction, setFilter } from "../../store/actions/index.js"; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; @@ -12,10 +12,12 @@ function Ratings({ isFetching, getRatingAction, ratings, - searchTerm + searchTerm, + setFilter }) { useEffect(() => { + setFilter("") // Returns the ratings getRatingAction(userid); }, [getRatingAction, userid]); @@ -71,4 +73,4 @@ const mapStateToProps = state => { searchTerm: state.filter.searchTerm }; }; -export default connect(mapStateToProps, { getRatingAction })(Ratings); +export default connect(mapStateToProps, { getRatingAction, setFilter })(Ratings); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index f4b2469..fc3351b 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -6,6 +6,7 @@ import { recommendedAction, recommendationAction, toggleIsUploaded, + setFilter } from "../../store/actions/index.js"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; @@ -18,9 +19,11 @@ function Recommendations({ recommendedAction, recommendationAction, searchTerm, - isUploaded + isUploaded, + setFilter }) { useEffect(() => { + setFilter("") // returns initial recommendations after uploading a file if (isUploaded === true) { recommendationAction(userid); @@ -97,4 +100,5 @@ export default connect(mapStateToProps, { recommendedAction, recommendationAction, toggleIsUploaded, + setFilter })(Recommendations); diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 910e829..411d259 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react"; // tools import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; -import { removeFromWatchlistAction, getWatchlistAction } from "../../store/actions/index.js"; +import { removeFromWatchlistAction, getWatchlistAction, setFilter } from "../../store/actions/index.js"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; @@ -15,11 +15,13 @@ function Watchlist({ watchlistError, getWatchlistAction, searchTerm, - removeFromWatchlistAction + removeFromWatchlistAction, + setFilter }) { const [deleteMode, setDeleteMode] = useState(false) useEffect(() => { + setFilter("") // Returns the users watchlist from the database getWatchlistAction(userid); }, [getWatchlistAction, userid,isDeleting]); @@ -95,6 +97,10 @@ const mapStateToProps = state => { searchTerm: state.filter.searchTerm }; }; -export default connect(mapStateToProps, { getWatchlistAction, removeFromWatchlistAction })( +export default connect(mapStateToProps, { + getWatchlistAction, + removeFromWatchlistAction, + setFilter +})( Watchlist ); diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index 248e1f2..626a7f9 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -60,16 +60,25 @@ border-radius: 5px; display: flex; flex: 1; + justify-content: space-between; overflow: hidden; transition: all 500ms linear; - min-width: 28vw; - - .search-icon { + min-width: 20vw; + .search-wrapper { + display: flex; + align-items: center; + width: 75%; + } + .search-icon, + .backspace-icon { color: white; opacity: .4; font-size: 1.2rem; padding: .2rem; } + .backspace-icon { + cursor: pointer; + } .searchBox { font-size: 1rem; background-color: $gray2; @@ -114,6 +123,9 @@ font-size: initial; color: $white; } + .searchContainer { + min-width: 35vw; + } } .fa-icons { width: 14%; @@ -122,7 +134,6 @@ font-size: 1.6rem; color: white; } - } button.hidden, .searchContainer.hidden, From 05964cf9736c4dbc5be870e1a619f74c1e2e17c3 Mon Sep 17 00:00:00 2001 From: cmruss Date: Mon, 6 Apr 2020 01:35:23 -0400 Subject: [PATCH 464/822] can press enter and update the state based on the last search --- src/components/dashboard/Navigation.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 5aec5b7..32c2cc0 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -22,6 +22,7 @@ class Navigation extends Component { query: "" } this.handleChange = this.handleChange.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); this.sendChange = debounce(this.sendChange, 500); this.clearInput = this.clearInput.bind(this) this.logout = this.logout.bind(this); @@ -37,6 +38,11 @@ class Navigation extends Component { this.props.setFilter(query) }; + handleSubmit = e => { + if (e.keyCode == 13) + this.props.setFilter(e.target.value) + } + clearInput = e => { this.setState({ query: "" }); this.props.setFilter("") @@ -86,7 +92,9 @@ class Navigation extends Component {
{/* If the path is upload hide the search container */} -
+
- +
{/* If the path is recommended show update recommendations button */} -
+ + + + + + + + + + + + + + +
+ {/* todo: add Remember functionality */} +
+ +

Remember me

+
+
+ +
- - Already have an account? + to="/login" + > + Already have an account?
- + +
@@ -205,11 +168,11 @@ class Register extends React.Component { } } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { registerSuccess: state.register.success, userid: state.login.userid, - errorStatus: state.register.error + errorStatus: state.register.error, }; }; export default connect(mapStateToProps, { registerAction, loginAction })( From 7b7910982e60e22a824f47bb3f5e89847c61112c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 15 Apr 2020 15:57:44 -0400 Subject: [PATCH 472/822] fixed bug on confirm password --- src/components/auth/Register.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 39f9445..238d57b 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -118,16 +118,18 @@ class Register extends React.Component { value={user.password} onChange={this.handleChange} required + type="password" label="Password" variant="outlined" /> From b3e54a5f41e96acddca6081ad3624b6b17d26c8c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 15 Apr 2020 18:48:25 -0400 Subject: [PATCH 473/822] Refactor Class Component to Funtional Component --- package-lock.json | 54 ++++++ package.json | 3 +- src/components/auth/Register.js | 308 ++++++++++++++++---------------- 3 files changed, 211 insertions(+), 154 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46d1919..da6c8e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5821,6 +5821,11 @@ "readable-stream": "^2.3.6" } }, + "fn-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-3.0.0.tgz", + "integrity": "sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA==" + }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -8766,6 +8771,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -11192,6 +11202,11 @@ "react-is": "^16.8.1" } }, + "property-expr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.2.tgz", + "integrity": "sha512-bc/5ggaYZxNkFKj374aLbEDqVADdYaLcFo8XBkishUWbaAdjlphaBFns9TvRA2pUseVL/wMFmui9X3IdNDU37g==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -13313,6 +13328,11 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "synchronous-promise": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.10.tgz", + "integrity": "sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -13671,6 +13691,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -15940,6 +15965,35 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "yup": { + "version": "0.28.3", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.28.3.tgz", + "integrity": "sha512-amVkCgFWe5bGjrrUiODkbIzrSwtB8JpZrQYSrfj2YsbRdrV+tn9LquWdZDlfOx2HXyfEA8FGnlwidE/bFDxO7Q==", + "requires": { + "@babel/runtime": "^7.8.7", + "fn-name": "~3.0.0", + "lodash": "^4.17.15", + "lodash-es": "^4.17.11", + "property-expr": "^2.0.0", + "synchronous-promise": "^2.0.10", + "toposort": "^2.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } } } } diff --git a/package.json b/package.json index ddcbf0e..73b9bbe 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "react-scripts": "3.4.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", - "redux-thunk": "^2.3.0" + "redux-thunk": "^2.3.0", + "yup": "^0.28.3" }, "scripts": { "start": "react-scripts start", diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 238d57b..da0a6dc 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,175 +1,177 @@ -import React from "react"; +import React, { useState } from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; import { Link } from "react-router-dom"; - +//For validation +import { useForm } from "react-hook-form"; +import * as Yup from "yup"; // styling imports import Picture3 from "../../img/couch-popcorn.png"; import { TextField, Checkbox, Grid } from "@material-ui/core"; - // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; - -class Register extends React.Component { - constructor(props) { - super(props); - this.state = { - user: { - email: "", - user_name: "", - password: "", - confirmpassword: "", - }, - submitted: false, - }; - - this.handleChange = this.handleChange.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleChange(event) { - const { name, value } = event.target; - const { user } = this.state; - this.setState({ +const RegisterSchema = Yup.object().shape({ + username: Yup.string().required("Username is required"), + email: Yup.string().email().required("email is required"), + password: Yup.string().min(6).required("password is required"), + confirmpassword: Yup.string().oneOf( + [Yup.ref("password"), null], + "Passwords must match" + ), +}); +const initialUser = { + user: { + email: "", + user_name: "", + password: "", + }, +}; +const Register = (props) => { + const [users, setUsers] = useState(initialUser.user); + const { register, handleSubmit, errors } = useForm({ + validationSchema: RegisterSchema, + }); + const handleChange = (event) => { + setUsers({ user: { - ...user, - [name]: value, + ...users, + [event.target.name]: event.target.value, }, }); - } - - handleSubmit(event) { + }; + const onSubmit = (event) => { event.preventDefault(); - let user = { - user_name: this.state.user.user_name, - password: this.state.user.password, - email: this.state.user.email, - }; - this.setState({ submitted: true }); - if ( - this.state.user.email && - this.state.user.user_name.length >= 6 && - this.state.user.password.length >= 6 && - this.state.user.confirmpassword === this.state.user.password - ) { - this.props.registerAction(user, this.props.history); - } - } - - render() { - const { user, submitted } = this.state; - return ( -
-
- -
-
-
-
-

- Your movies,
your way. -

-
- {" "} - Groa helps you pick the perfect film... so you
can save - your popcorn for the good stuff. -
-
-
- Graphic -
+ props.registerAction(users); + }; + return ( +
+
+ +
+
+
+
+

+ Your movies,
your way. +

+
+ {" "} + Groa helps you pick the perfect film... so you
can save + your popcorn for the good stuff. +
- -
- -
- - - - - - - - - - - - - +
+ Graphic +
+
+
+ + + + + + {errors.email && errors.email.type === "required" && ( +

An email is required

+ )} +
+ + + {errors.user_name && errors.user_name.type === "required" && ( +

Username is required

+ )} +
+ + + {errors.password && errors.password.type === "required" && ( +

Password required

+ )} + {errors.password && errors.password.type === "min" && ( +

Password must be at least 6 characters long

+ )}
-
- {/* todo: add Remember functionality */} -
- -

Remember me

-
-
- -
+ + + {errors.confirmpassword && + errors.confirmpassword.type === "required" && ( +

Password does not match

+ )} +
+ +
+ {/* todo: add Remember functionality */} +
+ +

Remember me

-
- - Already have an account? - +
+
- - -
- {/* end box right */} +
+
+ + Already have an account? + +
+ +
- {/* END boxHolder */} + {/* end box right */}
- //END CONTAINER - ); - } -} - + {/* END boxHolder */} +
+ //END CONTAINER + ); +}; const mapStateToProps = (state) => { return { registerSuccess: state.register.success, From b3ee87fe0752817f60ca5c2d08ee9b55a229da74 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 15:57:58 -0400 Subject: [PATCH 474/822] added password confirmation error message --- src/components/auth/Register.js | 44 ++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index da0a6dc..fb12e4d 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -3,35 +3,42 @@ import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; import { Link } from "react-router-dom"; + //For validation import { useForm } from "react-hook-form"; import * as Yup from "yup"; + // styling imports import Picture3 from "../../img/couch-popcorn.png"; import { TextField, Checkbox, Grid } from "@material-ui/core"; + // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; -const RegisterSchema = Yup.object().shape({ - username: Yup.string().required("Username is required"), - email: Yup.string().email().required("email is required"), - password: Yup.string().min(6).required("password is required"), - confirmpassword: Yup.string().oneOf( - [Yup.ref("password"), null], - "Passwords must match" - ), -}); + const initialUser = { user: { email: "", user_name: "", password: "", + confirmpassword: "", }, }; + +const RegisterSchema = Yup.object().shape({ + user_name: Yup.string().required("Username is required"), + email: Yup.string().email().required("email is required"), + password: Yup.string().min(6).required("password is required"), + confirmpassword: Yup.string() + .oneOf([Yup.ref("password"), null], "Passwords must match") + .required(), +}); + const Register = (props) => { const [users, setUsers] = useState(initialUser.user); const { register, handleSubmit, errors } = useForm({ validationSchema: RegisterSchema, }); + const handleChange = (event) => { setUsers({ user: { @@ -40,10 +47,17 @@ const Register = (props) => { }, }); }; + const onSubmit = (event) => { event.preventDefault(); - props.registerAction(users); + let user = { + user_name: users.user_name, + email: users.email, + password: users.password, + }; + props.registerAction(user); }; + return (
{ name="email" value={users.email} onChange={handleChange} - required label="Email" variant="outlined" inputRef={register} @@ -95,7 +108,6 @@ const Register = (props) => { name="user_name" value={users.user_name} onChange={handleChange} - required label="Username" variant="outlined" inputRef={register} @@ -110,7 +122,6 @@ const Register = (props) => { type="password" value={users.password} onChange={handleChange} - required label="Password" variant="outlined" inputRef={register} @@ -128,13 +139,16 @@ const Register = (props) => { type="password" value={users.confirmpassword} onChange={handleChange} - required label="Confirm Password" variant="outlined" inputRef={register} /> {errors.confirmpassword && errors.confirmpassword.type === "required" && ( +

Password Confirmation Required

+ )} + {errors.confirmpassword && + errors.confirmpassword.type === "oneOf" && (

Password does not match

)} @@ -172,6 +186,7 @@ const Register = (props) => { //END CONTAINER ); }; + const mapStateToProps = (state) => { return { registerSuccess: state.register.success, @@ -179,6 +194,7 @@ const mapStateToProps = (state) => { errorStatus: state.register.error, }; }; + export default connect(mapStateToProps, { registerAction, loginAction })( Register ); From 89355c2b13d327c3a7f44948f5ecfeea46cb5a5d Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 16:34:47 -0400 Subject: [PATCH 475/822] Refactor Login to Functional component --- src/components/auth/Login.js | 238 +++++++++++++---------------------- 1 file changed, 87 insertions(+), 151 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 18229b4..364998c 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -1,179 +1,115 @@ -import React from "react"; +import React, { useState } from "react"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; + // styling imports import Picture1 from "../../img/watching-tv.png"; +import { TextField, Checkbox } from "@material-ui/core"; + // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; -class LoginPage extends React.Component { - constructor(props) { - super(props); - - this.state = { - user: { - user_name: "", - password: "" - }, - errors: { - user_name: "", - password: "" - }, - submitted: false - }; - } +const initialUser = { + user_name: "", + password: "", +}; - handleChange = e => { - const { name, value } = e.target; - let errors = this.state.errors; +const LoginPage = (props) => { + const [user, setUser] = useState(initialUser); - this.setState({ - user: { - ...this.state.user, - [e.target.name]: e.target.value - } + const handleChange = (e) => { + setUser({ + ...user, + [e.target.name]: e.target.value, }); - switch (name) { - case "user_name": - errors.user_name = - value.length < 6 ? "User name must be 6 or more characters long" : ""; - break; - case "password": - errors.password = - value.length < 6 ? "Password must be 6 or more characters long" : ""; - break; - default: - break; - } - this.setState({ errors, [name]: value }, () => {}); }; - loginUser = e => { + const loginUser = (e) => { e.preventDefault(); - this.setState({ submitted: true }); - if (this.state.user.user_name && this.state.user.password) { - this.props.loginAction(this.state.user, this.props.history); - } + props.loginAction(user); }; - render() { - const { errors, submitted, user } = this.state; - return ( -
-
- -
-
-
+ return ( +
+
+ +
+
+
-

Welcome
back.

-
Groa makes it easy to find a film you’ll love.
What new favorite will you discover today?
-
-
- Graphic -
+

+ Welcome
back. +

+
+ {" "} + Groa makes it easy to find a film you’ll love.
What new + favorite will you discover today? +
- {/* END BOX LEFT */} -
-
-

Username

- - {/* ERROR MESSAGES */} - {/* Submit Error */} - - {this.props.errorStatus && user.user_name && ( -
Invalid Credentials
- )} - - {submitted && !user.user_name && ( -
Username is required
- )} - {/* Length of username */} - {errors.user_name && ( - - {errors.user_name} - - )} -

Password

- - {/* ERROR MESSAGES */} - {/* Submit Error */} - {submitted && !user.password && ( -
Password is required
- )} - {/* Length of password */} - {errors.password && ( - - {errors.password} - - )} +
+ Graphic +
+
+ {/* END BOX LEFT */} +
+ + + -
-
-
- -

Remember me

-
-
-
- -
-
-
-

- Forgot password? -

+
+
+
+ +

Remember me

- -
- {/* END BOX RIGHT */} +
+
+ +
+
+
+

Forgot password?

+
+
- {/* END MIDDLE */} + {/* END BOX RIGHT */}
- // END LOGIN PAGE - ); - } -} + {/* END MIDDLE */} +
+ // END LOGIN PAGE + ); +}; -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, - errorStatus: state.login.error + errorStatus: state.login.error, }; }; export default connect(mapStateToProps, { loginAction })(LoginPage); From b081bf91b83ec154f0d1cf80fda5b32e1f3de23b Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 16:35:56 -0400 Subject: [PATCH 476/822] consitancy with event --- src/components/auth/Register.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index fb12e4d..8ba2a44 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -39,17 +39,17 @@ const Register = (props) => { validationSchema: RegisterSchema, }); - const handleChange = (event) => { + const handleChange = (e) => { setUsers({ user: { ...users, - [event.target.name]: event.target.value, + [e.target.name]: e.target.value, }, }); }; - const onSubmit = (event) => { - event.preventDefault(); + const onSubmit = (e) => { + e.preventDefault(); let user = { user_name: users.user_name, email: users.email, From b34e2fac1f5b825acb9dbc3c646ec0195df37982 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 16:50:09 -0400 Subject: [PATCH 477/822] Added comments to Register --- src/components/auth/Register.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 8ba2a44..5167fad 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -24,10 +24,11 @@ const initialUser = { }, }; +// Validation Schema const RegisterSchema = Yup.object().shape({ user_name: Yup.string().required("Username is required"), - email: Yup.string().email().required("email is required"), - password: Yup.string().min(6).required("password is required"), + email: Yup.string().email().required("Email is required"), + password: Yup.string().min(6).required("Password is required"), confirmpassword: Yup.string() .oneOf([Yup.ref("password"), null], "Passwords must match") .required(), @@ -63,9 +64,11 @@ const Register = (props) => { className="container register-component" data-test={ifDev("register-component")} > + {/* NAVIGATION */}
+ {/* MAIN PAGE CONTENT */}
@@ -82,6 +85,7 @@ const Register = (props) => { Graphic
+ {/* FORM STARTS */}
{
+ {/* FORM ENDS */}
- {/* end box right */} -
- {/* END boxHolder */} +
{" "} + {/* PAGE CONTAINER */}
- //END CONTAINER ); }; From 6d0fdee06c28d5026cf75f5c73c1d0a14a9c68c5 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 16:51:35 -0400 Subject: [PATCH 478/822] added material UI documentation. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8269e37..e18f66e 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Gróa will use our Discovery Engine to present movies suited to your taste based [@material-ui/icons](https://www.npmjs.com/package/@material-ui/icons) | [@material-ui/lab](https://www.npmjs.com/package/@material-ui/lab) | -- for the stars on movie cards +- for the stars on movie cards and form inputs [@node-sass](https://www.npmjs.com/package/node-sass) From 46148507171dde74e9315c50c3633826aded0220 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 16 Apr 2020 16:59:30 -0400 Subject: [PATCH 479/822] fixed bug on username input --- src/components/auth/Login.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 364998c..14e6604 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -35,6 +35,7 @@ const LoginPage = (props) => { className="container login-component" data-test={ifDev("login-component")} > + {/* NAVIGATION */}
@@ -54,7 +55,7 @@ const LoginPage = (props) => { Graphic
- {/* END BOX LEFT */} + {/* FORM START */}
{ data-test={ifDev("loginForm")} > {
- {/* END BOX RIGHT */} + {/* FORM ENDS */}
- {/* END MIDDLE */} + {/* END OF MAIN CONTENT */}
// END LOGIN PAGE ); From 3c5bea35d8be0b4994ddc2e3b06c6206a9fd1e1a Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 16 Apr 2020 14:17:53 -0700 Subject: [PATCH 480/822] add validation --- src/components/auth/Login.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 14e6604..706bfb3 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -10,13 +10,26 @@ import { TextField, Checkbox } from "@material-ui/core"; // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; +//For validation +import { useForm } from "react-hook-form"; +import * as Yup from "yup"; + const initialUser = { user_name: "", password: "", }; +const RegisterSchema = Yup.object().shape({ + user_name: Yup.string().required("Username is required"), + password: Yup.string().required("Password is required") +}) + + const LoginPage = (props) => { const [user, setUser] = useState(initialUser); + const { handleSubmit, errors} = useForm({ + validationSchema: RegisterSchema + }) const handleChange = (e) => { setUser({ @@ -59,7 +72,7 @@ const LoginPage = (props) => {
{ label="Username" variant="outlined" /> + {errors.user_name && errors.user_name.type === "required" && ( +

A username is required

+ )} { label="Password" variant="outlined" /> - + {errors.password && errors.password.type === "required" && ( +

A password is required

+ )}
From d6a96a2de984f7c4d0ccdb262c7e461fd9a8b347 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 17 Apr 2020 11:40:50 -0700 Subject: [PATCH 481/822] update component to a functional component --- src/components/dashboard/Navigation.js | 318 ++++++++++++------------- 1 file changed, 157 insertions(+), 161 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 51fcbf6..3b6a15f 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -1,8 +1,12 @@ -import React, { Component } from "react"; +import React, { useState } from "react"; import { NavLink } from "react-router-dom"; import { connect } from "react-redux"; -import { loginAction, setFilter, recommendationAction } from "../../store/actions"; -import debounce from "../../utils/debounce"; +import { + loginAction, + setFilter, + recommendationAction +} from "../../store/actions"; +// import debounce from "../../utils/debounce"; import { faSearch, faUserCircle, @@ -15,185 +19,175 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ifDev } from "../../utils/removeAttribute.js"; import GroaLogo from "../../img/groa-logo-nav.png"; -class Navigation extends Component { - constructor(props) { - super(props); - this.state = { - query: "" - } - this.handleChange = this.handleChange.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - this.sendChange = debounce(this.sendChange, 500); - this.clearInput = this.clearInput.bind(this) - this.logout = this.logout.bind(this); - this.getNewRecommendations = this.getNewRecommendations.bind(this); - }; +const Navigation = props => { + const [query, setQuery] = useState({ + query: "" + }); - handleChange = e => { - this.setState({query: e.target.value}) - this.sendChange(e.target.value.trim()) + const handleChange = e => { + setQuery({ query: e.target.value }); + sendChange(e.target.value.trim()); }; - sendChange = query => { - this.props.setFilter(query) + const sendChange = query => { + props.setFilter(query); }; - handleSubmit = e => { - if (e.keyCode === 13 && this.state.query !== "") - this.props.setFilter(e.target.value) - } + const handleSubmit = e => { + if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + }; - clearInput = e => { - this.setState({ query: "" }); - this.props.setFilter("") - } + const clearInput = e => { + setQuery({ query: "" }); + props.setFilter(""); + }; - logout = () => { + const logout = () => { localStorage.removeItem("token"); localStorage.removeItem("state"); }; - getNewRecommendations = id => { + const getNewRecommendations = id => { // Gets new recommendations for account, if applicible - this.props.recommendationAction(id); + props.recommendationAction(id); }; - render() { - return ( -
-
-
- - -
+ return ( +
+
+
+ + +
-
- Groa Logo - - - Recommended - - - - - Watchlist - - - - Explore - -
+
+ Groa Logo - {/* If the path is upload hide the search container */} -
-
- - -
- + + + Watchlist + + + + Explore + +
+ + {/* If the path is upload hide the search container */} +
+
+ +
+ +
- {/* If the path is recommended show update recommendations button */} - - - -
- {/* This is the container for the user-icon and the arrow */} -
- - - - - - -
+ {/* If the path is recommended show update recommendations button */} + + +
+ {/* This is the container for the user-icon and the arrow */} +
+ + + + + + +
{/* This is the dropdown menu, links display based on media query */} - - Recommended - - - - Explore - - - - Ratings - - - - Upload data - - - - Watchlist - - - - Log out - -
- {/* END dropdown-content */} -
- {/* END dropdown-hover */} + + Recommended + + + + Explore + + + + Ratings + + + + Upload data + + + + Watchlist + + + + Log out + +
+ {/* END dropdown-content */}
- {/* END fa-icons */} + {/* END dropdown-hover */}
- {/* END navContainer */} + {/* END fa-icons */}
- ); - } -} + {/* END navContainer */} +
+ ); +}; const mapStateToProps = state => { return { @@ -201,6 +195,8 @@ const mapStateToProps = state => { searchTerm: state.filter.searchTerm }; }; -export default connect(mapStateToProps, { loginAction, recommendationAction, setFilter })( - Navigation -); +export default connect(mapStateToProps, { + loginAction, + recommendationAction, + setFilter +})(Navigation); From af9e34021f4a20c0bd7544abc20b39243d07523f Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 21 Apr 2020 15:53:12 -0700 Subject: [PATCH 482/822] install @material-ui/core/styles, style login and signup forms --- package-lock.json | 45 +- package.json | 1 + src/App.js | 25 +- src/components/auth/Login.js | 31 +- .../layout/nav-layouts/LoginNavLinks.js | 4 +- src/css/main.css | 1065 +++++++++++++++++ src/index.js | 2 +- src/scss/abstracts/_variables.scss | 2 +- src/scss/components/_navigation.scss | 7 +- src/scss/components/_onboarding.scss | 90 +- src/scss/components/_onboardingNavLinks.scss | 66 +- src/styles/LoginNavStyles.js | 31 + src/styles/LoginStyles.js | 263 ++++ 13 files changed, 1561 insertions(+), 71 deletions(-) create mode 100644 src/css/main.css create mode 100644 src/styles/LoginNavStyles.js create mode 100644 src/styles/LoginStyles.js diff --git a/package-lock.json b/package-lock.json index da6c8e5..4ca15c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1061,9 +1061,9 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@emotion/hash": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", - "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@fortawesome/fontawesome-common-types": { "version": "0.2.27", @@ -1368,17 +1368,17 @@ } }, "@material-ui/styles": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz", - "integrity": "sha512-nJHum4RqYBPWsjL/9JET8Z02FZ9gSizlg/7LWVFpIthNzpK6OQ5OSRR4T4x9/p+wK3t1qNn3b1uI4XpnZaPxOA==", + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.10.tgz", + "integrity": "sha512-EXIXlqVyFDnjXF6tj72y6ZxiSy+mHtrsCo3Srkm3XUeu3Z01aftDBy7ZSr3TQ02gXHTvDSBvegp3Le6p/tl7eA==", "requires": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.7.4", - "@material-ui/types": "^5.0.0", - "@material-ui/utils": "^4.7.1", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.0.1", + "@material-ui/utils": "^4.9.6", "clsx": "^1.0.2", "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.2.1", + "hoist-non-react-statics": "^3.3.2", "jss": "^10.0.3", "jss-plugin-camel-case": "^10.0.3", "jss-plugin-default-unit": "^10.0.3", @@ -1388,6 +1388,23 @@ "jss-plugin-rule-value-function": "^10.0.3", "jss-plugin-vendor-prefixer": "^10.0.3", "prop-types": "^15.7.2" + }, + "dependencies": { + "@material-ui/types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.1.tgz", + "integrity": "sha512-wURPSY7/3+MAtng3i26g+WKwwNE3HEeqa/trDBR5+zWKmcjO+u9t7Npu/J1r+3dmIa/OeziN9D/18IrBKvKffw==" + }, + "@material-ui/utils": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.9.6.tgz", + "integrity": "sha512-gqlBn0JPPTUZeAktn1rgMcy9Iczrr74ecx31tyZLVGdBGGzsxzM6PP6zeS7FuoLS6vG4hoZP7hWnOoHtkR0Kvw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + } } }, "@material-ui/system": { @@ -4057,11 +4074,11 @@ } }, "css-vendor": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", - "integrity": "sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", "requires": { - "@babel/runtime": "^7.6.2", + "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" } }, diff --git a/package.json b/package.json index 73b9bbe..dee0ce6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@material-ui/core": "^4.9.5", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.46", + "@material-ui/styles": "^4.9.10", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.1.2", diff --git a/src/App.js b/src/App.js index 87e2f90..ff3d623 100644 --- a/src/App.js +++ b/src/App.js @@ -27,6 +27,10 @@ import { reducer } from "./store/reducers"; import { BrowserRouter as Router } from "react-router-dom"; import { loadState, saveState } from "./store/localStorage.js"; +//for theme color change +import { createMuiTheme } from "@material-ui/core/styles"; +import { ThemeProvider } from "@material-ui/core/styles"; + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const store = createStore( reducer, @@ -45,8 +49,26 @@ store.subscribe(() => { function App() { useEffect(() => reactGAinitialization(), []); - + const theme = React.useMemo( + () => + createMuiTheme({ + palette: { + type: "dark", + primary: { + main: "#DBE0DF" + }, + secondary: { + main: "#6E8B3D" + } + }, + typography: { + fontFamily: "Mallanna, sans-serif" + } + }), + [] + ); return ( +
@@ -85,6 +107,7 @@ function App() {
+
); } diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 706bfb3..70b2d5d 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -6,6 +6,7 @@ import { ifDev } from "../../utils/removeAttribute.js"; // styling imports import Picture1 from "../../img/watching-tv.png"; import { TextField, Checkbox } from "@material-ui/core"; +import { makeStyles } from '@material-ui/core/styles'; // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; @@ -14,6 +15,20 @@ import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; import { useForm } from "react-hook-form"; import * as Yup from "yup"; + + +const useStyles = makeStyles((theme) => ({ +root:{ + margin: theme.spacing(1), +}, +textField:{ +margin: '2%', +width: '90%', +padding:'0', + +} +})); + const initialUser = { user_name: "", password: "", @@ -30,7 +45,7 @@ const LoginPage = (props) => { const { handleSubmit, errors} = useForm({ validationSchema: RegisterSchema }) - + const classes = useStyles(); const handleChange = (e) => { setUser({ ...user, @@ -43,6 +58,8 @@ const LoginPage = (props) => { props.loginAction(user); }; + + return (
{
-
+

@@ -71,27 +88,29 @@ const LoginPage = (props) => { {/* FORM START */}
- {errors.user_name && errors.user_name.type === "required" && (

A username is required

)} - {errors.password && errors.password.type === "required" && (

A password is required

@@ -100,7 +119,7 @@ const LoginPage = (props) => {

Remember me

diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js index 49e8345..69957c3 100644 --- a/src/components/layout/nav-layouts/LoginNavLinks.js +++ b/src/components/layout/nav-layouts/LoginNavLinks.js @@ -4,13 +4,15 @@ import { Link } from "react-router-dom"; // styling imports import GroaLogo from "../../../img/groa-logo-nav.png"; + export default function LoginNavLinks() { return (
Groa Logo - Sign up + Don't have an account? Sign up
); } +// \ No newline at end of file diff --git a/src/css/main.css b/src/css/main.css new file mode 100644 index 0000000..d02e6f6 --- /dev/null +++ b/src/css/main.css @@ -0,0 +1,1065 @@ +@import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); +#root { + /* + sources that helped me style the input + https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/ + + haven't added the functionality for drap and drop yet https://css-tricks.com/drag-and-drop-file-uploading/ +*/ } + #root html, + #root body { + margin: 0; + padding: 0; + box-sizing: border-box; } + #root html *, + #root body * { + box-sizing: inherit; } + +@-webkit-keyframes flexGrow { + to { + flex: 1; } } + +@-o-keyframes flexGrow { + to { + flex: 1; } } + +@keyframes flexGrow { + to { + flex: 1; } } + +@-webkit-keyframes flexShrink { + to { + flex: .01; + flex: .00001; } } + +@-o-keyframes flexShrink { + to { + flex: .01; + flex: .00001; } } + +@keyframes flexShrink { + to { + flex: .01; + flex: .00001; } } + #root html { + font-family: "Work Sans", sans-serif; + font-weight: normal; + color: #505050; + font-size: 14px; } + #root h1, + #root h2, + #root h3, + #root h4, + #root h5, + #root h6 { + font-weight: bold; + margin: 0; } + #root h1 a, + #root h2 a, + #root h3 a, + #root h4 a, + #root h5 a, + #root h6 a { + font-weight: inherit; } + #root em { + font-style: italic; } + #root strong { + font-weight: bold; } + #root .uppercase { + text-transform: uppercase; } + #root .lowercase { + text-transform: lowercase; } + #root .App { + min-height: 100vh; } + #root .container.register-component, + #root .container.login-component { + font-family: "Work Sans", sans-serif; + color: white; + background: #505050; + margin: 0 auto; + width: 100%; + min-height: 100vh; } + #root .container.register-component .onboarding-nav, + #root .container.login-component .onboarding-nav { + color: white; + display: flex; + width: 95%; + margin: 0 auto; + justify-content: flex-end; + padding: 1.1% 1%; } + #root .container.register-component .box-container, + #root .container.login-component .box-container { + display: flex; + justify-content: space-between; + margin: 0 auto; + width: 85%; } + #root .container.register-component .box-left, + #root .container.login-component .box-left { + width: 45%; + margin: 0 1%; + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + align-items: center; + text-align: left; + max-width: 100%; + box-sizing: border-box; } + #root .container.register-component .box-left .text-container, + #root .container.login-component .box-left .text-container { + white-space: nowrap; } + #root .container.register-component .box-left .text-container h1, + #root .container.login-component .box-left .text-container h1 { + font-size: 5vw; } + #root .container.register-component .box-left .text-container h5, + #root .container.login-component .box-left .text-container h5 { + font-size: 1.5vw; + font-weight: normal; + padding-top: 2rem; } + #root .container.register-component .box-left .image-wrapper, + #root .container.login-component .box-left .image-wrapper { + width: 75%; + padding: 5% 0; } + #root .container.register-component .box-left .image-wrapper .logo, + #root .container.login-component .box-left .image-wrapper .logo { + width: 100%; } + #root .container.register-component .box-right, + #root .container.login-component .box-right { + display: flex; + flex-direction: column; + justify-content: center; + margin: auto; + padding: 3%; + border-radius: 4px; + background: #505050; + width: 100%; + max-width: 518px; + height: 550px; } + #root .container.register-component .box-right .form, + #root .container.login-component .box-right .form { + margin: auto; + padding: 3% 0; + max-width: 320px; + width: 100%; + color: #505050; } + #root .container.register-component .box-right .form-control, + #root .container.login-component .box-right .form-control { + border-radius: 4px; + border: 1px solid #d8d8d8; + max-width: 320px; + width: 100%; + height: auto; + padding: 2.7% 1.7%; + margin: 2.6% auto; + margin-bottom: 1rem; } + #root .container.register-component .box-right input::placeholder, + #root .container.login-component .box-right input::placeholder { + font-size: 1.1rem; + color: #d8d8d8; } + #root .container.register-component .box-right .bottom-form, + #root .container.login-component .box-right .bottom-form { + width: 100%; + display: flex; + justify-content: space-between; + margin: 3% 0; } + #root .container.register-component .box-right .bottom-form .check-box-container, + #root .container.login-component .box-right .bottom-form .check-box-container { + display: flex; + flex-direction: row; + padding-top: 13px; + align-items: center; } + #root .container.register-component .box-right .bottom-form .check-box-container p, + #root .container.login-component .box-right .bottom-form .check-box-container p { + color: black; + white-space: nowrap; } + #root .container.register-component .box-right .bottom-form .btn-container, + #root .container.login-component .box-right .bottom-form .btn-container { + width: 60%; + display: flex; + justify-content: flex-end; + padding-bottom: 15px; } + #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, + #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, + #root .container.login-component .box-right .bottom-form .btn-container .signup-btn, + #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { + align-self: end; + border: none; + width: 100%; + max-width: 115px; + height: 36px; + border-radius: 4px; + background: #00e6bc; + color: black; + font-size: 14px; } + #root .container.register-component .box-right .bottomAccount, + #root .container.login-component .box-right .bottomAccount { + display: flex; + flex-direction: column; + padding: 30px; } + #root .container.register-component .box-right .bottomAccount .loginAccount, + #root .container.login-component .box-right .bottomAccount .loginAccount { + text-align: center; + color: #2477e5; + font-size: 18px; } + #root .container.register-component .box-right .callingError, + #root .container.login-component .box-right .callingError { + color: red; + display: flex; + justify-content: center; } + @media (max-width: 1068px) { + #root .container.register-component .box-container, + #root .container.login-component .box-container { + flex-direction: column; + align-items: center; } + #root .container.register-component .box-container .box-left, + #root .container.login-component .box-container .box-left { + width: 80%; + margin: 0; + padding: 0; } + #root .container.register-component .box-container .box-left .text-container, + #root .container.login-component .box-container .box-left .text-container { + margin: 0 auto; + width: 100%; } + #root .container.register-component .box-container .box-left .text-container h1, + #root .container.login-component .box-container .box-left .text-container h1 { + font-size: 10vw; } + #root .container.register-component .box-container .box-left .text-container h5, + #root .container.login-component .box-container .box-left .text-container h5 { + font-size: 3vw; + font-weight: normal; + padding-top: 2rem; } + #root .container.register-component .box-container .box-left .image-wrapper, + #root .container.login-component .box-container .box-left .image-wrapper { + width: 100%; } + #root .container.register-component .box-container .box-right, + #root .container.login-component .box-container .box-right { + width: 100%; + margin: 0; + padding: 0; } + #root .container.register-component .box-container .box-right .form, + #root .container.login-component .box-container .box-right .form { + margin: 0 auto; + padding: 0; + max-width: 50%; + width: 100%; + color: #505050; } } + @media (max-width: 600px) { + #root .container.register-component .box-container, + #root .container.login-component .box-container { + flex-direction: column; + align-items: center; } + #root .container.register-component .box-container .box-left, + #root .container.login-component .box-container .box-left { + width: 80%; + margin: 0; + padding: 0; } + #root .container.register-component .box-container .box-left .text-container, + #root .container.login-component .box-container .box-left .text-container { + margin: 0 auto; + width: 100%; } + #root .container.register-component .box-container .box-left .text-container h1, + #root .container.login-component .box-container .box-left .text-container h1 { + display: none; } + #root .container.register-component .box-container .box-left .text-container h5, + #root .container.login-component .box-container .box-left .text-container h5 { + display: none; } + #root .container.register-component .box-container .box-left .image-wrapper, + #root .container.login-component .box-container .box-left .image-wrapper { + display: none; } + #root .container.register-component .box-container .box-left .image-wrapper .logo, + #root .container.login-component .box-container .box-left .image-wrapper .logo { + display: none; } + #root .container.register-component .box-container .box-right, + #root .container.login-component .box-container .box-right { + width: 100%; + margin: 2%; + padding: 0; + display: flex; + flex-direction: column; + justify-content: center; + border-radius: 0; + background: #505050; + height: 100%; } + #root .container.register-component .box-container .box-right .form, + #root .container.login-component .box-container .box-right .form { + max-width: 90%; + justify-content: center; } } + #root .register.nav, + #root .login.nav { + font-family: "Work Sans", sans-serif; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + text-align: center; } + @media (max-width: 600px) { + #root .register.nav, + #root .login.nav { + flex-direction: column; } } + #root .register.nav img, + #root .login.nav img { + height: 2.5rem; + width: auto; } + #root .register.nav .link, + #root .login.nav .link { + display: flex; + width: 100%; + height: auto; + font-size: 1rem; + text-decoration: none; + justify-content: flex-end; + align-items: center; + color: white; } + #root .register.nav .link:hover, + #root .login.nav .link:hover { + color: #00b392; + font-weight: bold; } + @media (max-width: 600px) { + #root .register.nav img, + #root .login.nav img { + width: 136px; + height: 38px; + left: 130px; + top: 102px; } + #root .register.nav .link, + #root .login.nav .link { + justify-content: flex-start; + height: 30px; + left: 16px; + top: 141px; } } + #root .mainContainer { + background: #000A12; + padding: 1.1% 1%; + font-family: "Work Sans", sans-serif; } + #root .mainContainer .navContainer { + display: flex; + justify-content: space-evenly; + align-items: center; + padding-right: 1rem; } + #root .mainContainer .navContainer .Bars { + padding-top: 5px; } + #root .mainContainer .navContainer .Bars .bars-icon { + color: white; + font-size: 1.4rem; } + #root .mainContainer .navContainer .Links { + width: 60%; + display: flex; + justify-content: space-evenly; + align-items: center; + margin: 0 .4rem; } + #root .mainContainer .navContainer .Links a.active { + border-bottom: 3px solid #00E6BC; } + #root .mainContainer .navContainer .Links img { + height: 2rem; + width: auto; } + #root .mainContainer .navContainer .Links .Groa-NavLink:hover { + color: white; } + #root .mainContainer .navContainer .Links .NavLink { + color: white; + text-decoration: none; + margin: 0 1%; + transition: all 500ms linear; } + #root .mainContainer .navContainer .Links .NavLink:hover { + color: white; } + @media only screen and (max-width: 750px) { + #root .mainContainer .navContainer .watchlist, #root .mainContainer .navContainer .recommended, #root .mainContainer .navContainer .explore, + #root .mainContainer .navContainer .dropdown-hover .angle-down-icon { + flex: .000000001; + white-space: pre; + padding: 0; + font-size: 0; + margin: 0; + opacity: 0; } } + #root .mainContainer .navContainer .searchContainer { + background-color: #21242C; + padding: .4rem; + border-radius: 5px; + display: flex; + flex: 1; + justify-content: space-between; + overflow: hidden; + transition: all 500ms linear; + min-width: 20vw; } + #root .mainContainer .navContainer .searchContainer .search-wrapper { + display: flex; + align-items: center; + width: 75%; } + #root .mainContainer .navContainer .searchContainer .search-icon, + #root .mainContainer .navContainer .searchContainer .backspace-icon { + color: white; + opacity: .4; + font-size: 1.2rem; + padding: .2rem; } + #root .mainContainer .navContainer .searchContainer .backspace-icon { + cursor: pointer; } + #root .mainContainer .navContainer .searchContainer .searchBox { + font-size: 1rem; + background-color: #21242C; + border: none; + color: white; } + #root .mainContainer .navContainer .searchContainer input:focus { + outline: none; } + #root .mainContainer .navContainer .searchContainer input:-webkit-autofill, + #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:hover, + #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:focus, + #root .mainContainer .navContainer .searchContainer input:-webkit-autofill { + -webkit-text-fill-color: white !important; } + #root .mainContainer .navContainer button { + white-space: nowrap; + font-size: 1rem; + padding: .4rem; + margin: 0 .6rem; + border-radius: 5px; + background-color: white; + cursor: pointer; + transition: all 500ms linear; } + @media only screen and (max-width: 750px) { + #root .mainContainer .navContainer .Links { + justify-content: space-between; } + #root .mainContainer .navContainer button { + font-size: 0; + padding: .2rem; + background-color: rgba(28, 28, 28, 0); + border: none; } + #root .mainContainer .navContainer .sync-icon { + font-size: initial; + color: white; } + #root .mainContainer .navContainer .searchContainer { + min-width: 35vw; } } + #root .mainContainer .navContainer .fa-icons { + width: 14%; + display: flex; + justify-content: space-between; + font-size: 1.6rem; + color: white; } + #root .mainContainer button.hidden, + #root .mainContainer .searchContainer.hidden, + #root .mainContainer .hidden { + min-width: 0; + flex: .000000001; + white-space: pre; + padding: 0; + font-size: 0; + margin: 0; + opacity: 0; } + #root .mainContainer .dropdown-hover { + padding: .25rem .5rem; + position: relative; + white-space: nowrap; + cursor: pointer; + display: flex; + align-items: center; } + #root .mainContainer .dropdown-hover .angle-down-icon { + padding-left: .5rem; } + #root .mainContainer .dropdown-hover .dropdown-content { + display: none; } + #root .mainContainer .dropdown-hover:hover .dropdown-content { + display: flex; + flex-direction: column; + position: absolute; + top: 2rem; + right: .4rem; + border-radius: 5px; + overflow: hidden; + z-index: 5; + border: 1px solid #D8D8D8; } + #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink { + border-top: 1px solid #D8D8D8; + color: #505050; + text-decoration: none; + font-size: 1.1rem; + padding: 1rem 1.5rem; + background: white; + white-space: nowrap; + text-align: center; } + #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { + background-color: #D8D8D8; } + @media (hover: hover) and (pointer: fine) { + #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { + background-color: #D8D8D8; } } + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { + display: none; } + @media only screen and (max-width: 750px) { + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { + display: block; } } + #root .container.post-login { + background: white; + color: black; } + #root .container.post-login header { + margin: 0% auto; + text-align: center; } + #root .container.post-login header h1 { + font-size: 4rem; + margin-top: 2.75%; } + #root .container.post-login header p { + font-size: 1.75rem; + margin: 2.24% auto; + line-height: 2.15rem; + width: 100%; + max-width: 425px; + height: 68; + text-align: center; } + #root .container.post-login .choice-selection-container { + text-align: center; } + #root .container.post-login .choice-selection-container h2 { + font-size: 2.5rem; + margin: 2% 0% 4.25% 0%; } + #root .container.post-login .choice-selection-container .choice-selection { + margin: auto; + width: 71%; + display: flex; + justify-content: space-around; } + #root .container.post-login .choice-selection-container .choice-selection .choice-box { + width: 35%; + max-width: 287px; + height: 550px; + display: flex; + flex-direction: column; + justify-content: space-between; } + #root .container.post-login .choice-selection-container .choice-selection .choice-box h4 { + font-size: 1.75rem; + font-weight: bold; + margin-bottom: 27px; } + #root .container.post-login .choice-selection-container .choice-selection .choice-box .img-box { + width: 100%; + max-width: 285; + height: auto; } + #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn { + width: 100%; + max-width: 287px; + height: 51px; + margin-top: 32px; + justify-content: flex-end; + border: none; + font-size: 1.75rem; + color: white; + background: #21242c; } + #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn:hover { + color: #21242c; + background: white; + border: 1px solid grey; } + #root .container.post-login .hidden, + #root .container.post-login .setup-wizard.choice-box.hidden { + display: none; } + #root .DataUploadPage { + display: flex; + justify-content: center; + font-family: "Work Sans", sans-serif; } + #root .textholder1 h1 { + display: flex; + justify-content: center; + font-size: 4em; + margin-top: 4%; + margin-bottom: 2%; + font-weight: 700; + text-align: center; } + #root .textholder1 h2, + #root .textholder1 h3 { + width: 60%; + text-align: center; + margin: 3.5% auto; + display: flex; + justify-content: center; + font-weight: 400; + font-size: 1.7em; } + @media only screen and (max-width: 500px) { + #root .textholder1 { + text-align: center; + padding-top: 25px; } + #root .textholder1 h1 { + display: flex; + justify-content: center; + font-size: 180%; + margin-top: 4%; } + #root .textholder1 h2, + #root .textholder1 h3 { + margin-top: 15px; + display: flex; + justify-content: center; + padding: 0 35px 0 35px; } } + @media only screen and (max-width: 375px) { + #root .textholder1 h1 { + display: flex; + justify-content: center; + font-size: 180%; } + #root .textholder1 h2, + #root .textholder1 h3 { + margin-top: 25px; + display: flex; + justify-content: center; + padding: 0 13px 0 13px; } } + #root .ptext { + font-size: 14px; } + @media only screen and (max-width: 375px) { + #root .ptext { + padding-top: 25px; + font-size: 10px; } } + #root .DboxContainer { + display: flex; + justify-content: space-around; + margin-top: 6%; } + #root .DboxContainer .DboxLeft, + #root .DboxContainer .DboxRight { + width: 290px; + height: 250px; + padding-top: 15px; } + #root .DboxContainer .textContainer p { + font-size: 20px; } + #root .DboxContainer .textContainer p a#pLink { + color: #2477e5; + font-weight: 700; + text-decoration: none; } + @media only screen and (max-width: 500px) { + #root .DboxContainer .DboxLeft { + display: flex; } + #root .DboxContainer .DboxLeft img { + width: 100px; + height: auto; } + #root .DboxContainer .DboxRight { + margin-top: 72%; + display: flex; + width: 360px; } + #root .DboxContainer .DboxRight img { + width: 100px; + height: auto; } } + #root .dropdown { + display: flex; + position: relative; + flex-direction: column; + width: 290px; } + #root .dropdown .centerBtn { + margin: auto; } + #root .dropdown img { + width: 100%; + max-width: 164px; + height: auto; } + #root .dropdown .dropBtn { + width: 220px; + height: 102px; + background-color: #00b392; + color: #ffffff; + padding: 0 35px 0 35px; + font-size: 20px; + border: none; + border-radius: 6px; + cursor: pointer; + outline: inherit; } + #root .dropdown .dropdown-content { + display: none; + height: 310px; } + #root .dropdown .dropdown-content p { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; } + #root .dropdown .dropBtn:hover, + #root .dropdown .dropBtn:focus { + background-color: #00b392; } + #root .dropdown .dropdown a:hover { + background-color: #ddd; } + #root .dropdown .show { + display: block; } + @media only screen and (max-width: 500px) { + #root .dropdown .dropBtn { + width: 197px; + height: 80px; + background-color: #00b392; + color: #ffffff; + padding: 0 39px 0 39px; + font-size: 16px; + border: none; + border-radius: 6px; + cursor: pointer; + outline: inherit; } + #root .dropdown .dropdown-content { + height: 280px; } } + @media only screen and (max-width: 375px) { + #root .dropdown .dropdown-content { + height: 320px; } } + #root .dropdown-content-Empty { + display: block; + height: 310px; + position: relative; } + @media only screen and (max-width: 500px) { + #root .dropdown-content-Empty { + display: block; + height: 280px; + position: relative; } } + @media only screen and (max-width: 375px) { + #root .dropdown-content-Empty { + display: block; + height: 320px; + position: relative; } } + #root .show2 { + display: none; } + #root .UploadContainer { + display: flex; + justify-content: center; + align-content: center; + position: relative; } + #root .UploadContainer .inputholder input[type="file"] { + font-size: 100px; + position: absolute; + left: 0; + top: 0; + opacity: 0; + max-width: 100%; } + #root .UploadContainer label#uploadLabel { + width: 420px; + text-align: center; + margin: auto; + padding: 7% 0; + cursor: pointer; + font-size: 16px; + font-weight: 700; + display: inline-block; + border: 2px dashed #2477e5; + border-radius: 3px; + color: #2477e5; } + #root .UploadContainer label#uploadLabel img { + margin-top: 4.3%; } + @media only screen and (max-width: 500px) { + #root .UploadContainer .inputholder { + display: flex; + justify-content: center; + padding: 10px; + width: 232px; + height: 66px; } + #root .UploadContainer .inputholder .uploadData { + margin-top: 25px; + height: 50px; } } + #root .textholder2 { + width: 44%; + margin: 3.3% auto; + text-align: center; + font-size: 14px; + display: flex; + justify-content: center; } + @media only screen and (max-width: 500px) { + #root .textholder2 { + width: 80%; + margin: 6.6% auto; } } + #root .CongratsPage { + border: 2px solid #000A12; + background: #000A12; + height: 100vh; + font-family: "Work Sans", sans-serif; } + #root .CongratsPage .CenterBox { + display: flex; + margin-top: 10%; + justify-content: center; } + #root .CongratsPage .CenterBox .congratsForm { + display: flex; + justify-content: center; + background: white; + width: 600px; + height: 600px; } + #root .CongratsPage .CenterBox .congratsForm .textHolder { + text-align: center; + margin-top: 10%; + width: 550px; + height: 350px; } + #root .CongratsPage .CenterBox .congratsForm .textHolder h1 { + font-size: 35px; + padding-left: 80px; + padding-right: 50px; + margin-top: 10px; + font-weight: 400px; } + #root .CongratsPage .CenterBox .congratsForm .textHolder h2 { + font-size: 20px; + padding-top: 15px; + padding-bottom: 15px; + padding-left: 9px; } + #root .CongratsPage .CenterBox .congratsForm .textHolder .image { + display: flex; + justify-content: center; + margin: 16px; } + #root .CongratsPage .CenterBox .congratsForm .textHolder button { + font-size: 20px; + width: 220px; + height: 51px; + margin-top: 43px; + background: #00B392; + border-radius: 5px; + border: none; } + #root .container.recommendations { + font-family: "Work Sans", sans-serif; + background: #505050; + display: flex; + flex-direction: column; + min-height: 100vh; } + #root .container.recommendations .movie-cards { + width: 75%; + margin: 3% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; } + #root .container.recommendations .movie-cards .box { + border-radius: 5px; + overflow: hidden; + width: 30vw; + height: 30vw; + max-width: 33%; + margin: 2.5%; + display: flex; + flex-direction: column; } + #root .container.recommendations .movie-cards .box .top-content { + display: flex; + position: relative; } + #root .container.recommendations .movie-cards .box .top-content .aspect-ratio-wrapper { + padding-bottom: 80%; + position: relative; + width: 60%; + overflow: hidden; } + #root .container.recommendations .movie-cards .box .top-content .aspect-ratio-wrapper img { + height: 100%; + position: absolute; + right: 0; + object-fit: cover; } + #root .container.recommendations .movie-cards .box .top-content .text-container { + color: black; + background-color: white; + width: 45%; + padding: 2.5%; + font-size: 1.5vw; } + #root .container.recommendations .movie-cards .box .top-content .text-container p { + padding: .5rem 0; } + #root .container.recommendations .movie-cards .box .action-panel { + display: flex; + flex-direction: column; + align-items: flex-end; + height: auto; + width: 100%; + padding: 1vw 0; + background-color: #21242C; } + #root .container.recommendations .movie-cards .box .action-panel > * { + width: 50%; + text-align: left; + margin: 1vw; } + #root .container.recommendations .movie-cards .box .action-panel .stars { + font-size: 2.5vw; } + #root .container.recommendations .movie-cards .box .action-panel .watchlist-button { + background-color: inherit; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; + color: #00e6bb; + font-size: 1.5vw; } + #root .container.recommendations .movie-cards .box .action-panel .watchlist-button:hover { + text-decoration: underline; } + #root .watchlist-container { + font-family: "Work Sans", sans-serif; + background: #505050; + display: flex; + flex-direction: column; + min-height: 100vh; } + #root .watchlist-container .movie-cards { + width: 75%; + margin: 3% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; } + #root .watchlist-container .movie-cards .movie-card-container { + position: relative; + margin: 2% auto; } + #root .watchlist-container .movie-cards .movie-card-container .box { + border-radius: 5px; + overflow: hidden; + width: 100%; + display: flex; + flex-direction: column; } + #root .watchlist-container .movie-cards .movie-card-container .box .top-content { + display: flex; } + #root .watchlist-container .movie-cards .movie-card-container .box img { + width: 20vw; + height: 33.33vw; } + @media screen and (max-width: 500px) { + #root .watchlist-container .movie-cards .movie-card-container .box img { + width: 50vw; + height: 83.33vw; } } + #root .watchlist-container .movie-cards .movie-card-container .box .text-container { + display: none; } + #root .watchlist-container .movie-cards .movie-card-container .box .action-panel { + display: none; } + #root .watchlist-container .movie-cards .movie-card-container .delete-button { + position: absolute; + right: 1vw; + top: 2vw; + border-radius: 100%; + height: 2vw; + width: 2vw; + padding: 0; + cursor: pointer; + outline: inherit; + white-space: nowrap; + font-size: 1vw; + background-color: #21242C; + color: white; + font-weight: bold; } + #root .container.loading-screen { + background: #000A12; + display: flex; + flex-direction: column; + justify-content: center; + height: 100vh; + font-family: "Work Sans", sans-serif; } + #root .container.loading-screen h4, + #root .container.loading-screen p, + #root .container.loading-screen .loading-component { + margin: 4.5% auto; } + #root .container.loading-screen h4 { + font-size: 2.5rem; + color: #ffffff; + text-align: center; + font-weight: 700; } + #root .container.loading-screen p { + font-size: 1.4rem; + text-align: center; + line-height: 2rem; + color: #ffffff; } + #root .container.ratings { + font-family: "Work Sans", sans-serif; + background: #505050; + display: flex; + flex-direction: column; + min-height: 100vh; } + #root .container.ratings .movie-cards { + width: 75%; + margin: 3% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; } + #root .container.ratings .movie-cards .box { + border-radius: 5px; + overflow: hidden; + width: 30vw; + height: 30vw; + max-width: 33%; + margin: 2.5%; + display: flex; + flex-direction: column; } + #root .container.ratings .movie-cards .box .top-content { + display: flex; + position: relative; } + #root .container.ratings .movie-cards .box .top-content .aspect-ratio-wrapper { + padding-bottom: 80%; + position: relative; + width: 60%; + overflow: hidden; } + #root .container.ratings .movie-cards .box .top-content .aspect-ratio-wrapper img { + height: 100%; + position: absolute; + right: 0; + object-fit: cover; } + #root .container.ratings .movie-cards .box .top-content .text-container { + color: black; + background-color: white; + width: 45%; + padding: 2.5%; + font-size: 1.5vw; } + #root .container.ratings .movie-cards .box .top-content .text-container p { + padding: .5rem 0; } + #root .container.ratings .movie-cards .box .action-panel { + display: flex; + flex-direction: column; + align-items: flex-end; + height: auto; + width: 100%; + padding: 1vw 0; + background-color: #21242C; } + #root .container.ratings .movie-cards .box .action-panel > * { + width: 50%; + text-align: left; + margin: 1vw; } + #root .container.ratings .movie-cards .box .action-panel p { + color: #00e6bb; } + #root .container.ratings .movie-cards .box .action-panel .stars { + font-size: 2.5vw; } + #root .container.ratings .movie-cards .box .action-panel .watchlist-button { + background-color: inherit; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; + color: #00e6bb; + font-size: 1.5vw; } + #root .container.ratings .movie-cards .box .action-panel .watchlist-button:hover { + text-decoration: underline; } + #root .container.explore { + font-family: "Work Sans", sans-serif; + background: #505050; + display: flex; + flex-direction: column; + min-height: 100vh; } + #root .container.explore .movie-cards { + width: 75%; + margin: 3% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; } + #root .container.explore .movie-cards .box { + border-radius: 5px; + overflow: hidden; + width: 30vw; + height: 30vw; + max-width: 33%; + margin: 2.5%; + display: flex; + flex-direction: column; } + #root .container.explore .movie-cards .box .top-content { + display: flex; + position: relative; } + #root .container.explore .movie-cards .box .top-content .aspect-ratio-wrapper { + padding-bottom: 80%; + position: relative; + width: 60%; + overflow: hidden; } + #root .container.explore .movie-cards .box .top-content .aspect-ratio-wrapper img { + height: 100%; + position: absolute; + right: 0; + object-fit: cover; } + #root .container.explore .movie-cards .box .top-content .text-container { + color: black; + background-color: white; + width: 45%; + padding: 2.5%; + font-size: 1.5vw; } + #root .container.explore .movie-cards .box .top-content .text-container p { + padding: .5rem 0; } + #root .container.explore .movie-cards .box .action-panel { + display: flex; + flex-direction: column; + align-items: flex-end; + height: auto; + width: 100%; + padding: 1vw 0; + background-color: #21242C; } + #root .container.explore .movie-cards .box .action-panel > * { + width: 50%; + text-align: left; + margin: 1vw; } + #root .container.explore .movie-cards .box .action-panel p { + color: #00e6bb; } + #root .container.explore .movie-cards .box .action-panel .stars { + font-size: 2.5vw; } + #root .container.explore .movie-cards .box .action-panel .watchlist-button { + background-color: inherit; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; + color: #00e6bb; + font-size: 1.5vw; } + #root .container.explore .movie-cards .box .action-panel .watchlist-button:hover { + text-decoration: underline; } diff --git a/src/index.js b/src/index.js index f4ece18..55496ef 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ import App from "./App"; import * as serviceWorker from "./serviceWorker"; // styling -import "./scss/main.scss"; +import "./css/main.css"; ReactDOM.render(, document.getElementById("root")); diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss index c1241dc..ea922b0 100644 --- a/src/scss/abstracts/_variables.scss +++ b/src/scss/abstracts/_variables.scss @@ -9,7 +9,7 @@ $gray1: #D8D8D8; $gray2: #21242C; $gray3: hsl(207, 100%, 4%); -$black: #000A12; +$black: #505050; $white: hsl(0, 0%, 100%); // color purposes here (will have to ask Martin or dig into Figma more for this) diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index 626a7f9..6176e50 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -14,6 +14,7 @@ font-size: 1.4rem; } } + .Links { width: 60%; display: flex; @@ -91,9 +92,9 @@ input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, - input:-webkit-autofill:active { - -webkit-box-shadow: 0 0 0 30px $gray2 inset !important; - } + // input:-webkit-autofill:active { + // -webkit-box-shadow: 0 0 0 30px $gray2 inset !important; + // } input:-webkit-autofill { -webkit-text-fill-color: $white !important; } diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 1964284..a99c086 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -42,9 +42,9 @@ padding-top: 2rem; } } - .image-wrapper { - width: 75%; - padding: 5% 0; + .image-wrapper { + width: 75%; + padding: 5% 0; .logo { width: 100%; } @@ -58,7 +58,7 @@ margin: auto; padding: 3%; border-radius: 4px; - background: white; + background: $black; width: 100%; max-width: 518px; height: 550px; @@ -73,7 +73,7 @@ .form-control { border-radius: 4px; - border: 1px solid #D8D8D8; + border: 1px solid #d8d8d8; max-width: 320px; width: 100%; height: auto; @@ -83,7 +83,7 @@ } input::placeholder { font-size: 1.1rem; - color:#D8D8D8; + color: #d8d8d8; } .bottom-form { @@ -91,14 +91,14 @@ display: flex; justify-content: space-between; margin: 3% 0; - + .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; + display: flex; + flex-direction: row; + padding-top: 13px; + align-items: center; p { - color:black; + color: black; white-space: nowrap; } } @@ -108,7 +108,7 @@ display: flex; justify-content: flex-end; padding-bottom: 15px; - + .signup-btn, button.login-btn { align-self: end; @@ -117,20 +117,20 @@ max-width: 115px; height: 36px; border-radius: 4px; - background: #00E6BC; + background: #00e6bc; color: black; font-size: 14px; } } } - .bottomAccount{ + .bottomAccount { display: flex; flex-direction: column; padding: 30px; - + .loginAccount { text-align: center; - color: #2477E5; + color: #2477e5; font-size: 18px; } } @@ -141,7 +141,7 @@ } } - @media (max-width: 1068px) { + @media (max-width: 1068px) { .box-container { flex-direction: column; align-items: center; @@ -149,7 +149,7 @@ width: 80%; margin: 0; padding: 0; - .text-container{ + .text-container { margin: 0 auto; width: 100%; h1 { @@ -170,10 +170,58 @@ margin: 0; padding: 0; .form { - width: 80%; + margin: 0 auto; + padding: 0; + max-width: 50%; + width: 100%; + color: $black; } } } - + } + @media (max-width: 600px) { + .box-container { + flex-direction: column; + align-items: center; + .box-left { + width: 80%; + margin: 0; + padding: 0; + .text-container { + margin: 0 auto; + width: 100%; + h1 { + display: none; + } + h5 { + display: none; + } + } + .image-wrapper { + display: none; + .logo { + display: none; + } + } + } + .box-right { + width: 100%; + margin: 2%; + padding: 0; + display: flex; + flex-direction: column; + justify-content: center; + border-radius: 0; + background: #505050; + + // max-width: 100%; + height: 100%; + .form { + max-width: 90%; + justify-content: center; + } + + } + } } } diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index d2a5a24..14ca91b 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -1,29 +1,49 @@ - .register.nav, - .login.nav { - font-family: $workSans; +.register.nav, +.login.nav { + font-family: $workSans; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + text-align: center; + @media (max-width: 600px) { + flex-direction: column; + } + img { + height: 2.5rem; + width: auto; + } + .link { display: flex; - justify-content: space-between; - align-items: center; width: 100%; - text-align: center; + height: auto; + font-size: 1rem; + text-decoration: none; + justify-content: flex-end; + align-items: center; + color: $white; - img{ - height: 2.5rem; - width: auto; + &:hover { + color: $turqoise3; + font-weight: bold; + } + } + @media (max-width: 600px) { + img { + // position: absolute; + width: 136px; + height: 38px; + left: 130px; + top: 102px; } .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - justify-content: flex-end; - align-items: center; - color: $white; - - &:hover { - color: $turqoise3; - font-weight: bold; - } + // flex-direction: column; + justify-content: flex-start; + // position: absolute; +// width: 63px; +height: 30px; +left: 16px; +top: 141px; } - } \ No newline at end of file + } +} diff --git a/src/styles/LoginNavStyles.js b/src/styles/LoginNavStyles.js new file mode 100644 index 0000000..773d1f3 --- /dev/null +++ b/src/styles/LoginNavStyles.js @@ -0,0 +1,31 @@ +import { makeStyles } from "@material-ui/core/styles"; + +const LoginNavStyles = makeStyles(theme => ({ + loginNav: { + fontFamily: 'workSans', + display: 'flex', + justifyContent: 'spaceBetween', + alignItems: 'center', + width: '100%', + textAlign: 'center', + logoImg: { + height: '1rem', + width: 'auto', + } + }, + [theme.breakpoints.down("xs")]: { + loginNav:{ + backgroundColor:'#505050', + logoImg: { + position:'absolute', + height: '38px', + width: '136px', + left: '130px', + top: '102px', + + } + } + } +})); + +export default LoginNavStyles; \ No newline at end of file diff --git a/src/styles/LoginStyles.js b/src/styles/LoginStyles.js new file mode 100644 index 0000000..ca53e74 --- /dev/null +++ b/src/styles/LoginStyles.js @@ -0,0 +1,263 @@ +import { makeStyles } from "@material-ui/core/styles"; + +const LoginStyles = makeStyles(theme => ({ + root: { + // margin: theme.spacing(1), + fontFamily: "workSans", + color: "white", + backgroundColor: "#505050", + position:'relative', + // margin: "0 auto", + width: "100%", + // height:'812px', + // minHeight: "100vh" + }, + onboardingNav: { + color: 'white', + display: 'flex', + width: '95%', + margin: '0 auto', + justifyContent: 'flex-end', + padding: '1.1% 1%', + }, + boxContainer: { + display: "flex", + justifyContent: "spaceBetween", + margin: "0 auto", + width: "85%" + }, + boxLeft: { + width: "45%", + margin: "0 1%", + display: "flex", + flexDirection: "column", + alignItems: "center", + textAlign: "left", + maxWidth: "100%", + boxSizing: "border-box", + textContainer: { + whiteSpace: "nowrap", + h1: { + fontSize: "5vw" + }, + h5: { + fontSize: "1.5vw", + fontWeight: "normal", + paddingTop: "2rem" + } + }, + imageWrapper: { + width: "75%", + padding: "5% 0", + logo: { + width: "100%" + } + }, + BoxRight: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + margin: 'auto', + padding: '3%', + borderRadius: '4px', + background: 'white', + width: '100%', + maxWidth: '518px', + height: '550px', + + form:{ + margin: 'auto', + padding: '3% 0', + maxWidth: '320px', + width: '100%', + color: '$black', + }, + +// formControl: { +// border-radius: 4px; +// border: 1px solid #D8D8D8; +// max-width: 320px; +// width: 100%; +// height: auto; +// padding: 2.7% 1.7%; +// margin: 2.6% auto; +// margin-bottom: 1rem; +// } +// input::placeholder { +// font-size: 1.1rem; +// color:#D8D8D8; +// } + +// bottom-form: { +// width: 100%; +// display: flex; +// justify-content: space-between; +// margin: 3% 0; + +// checkboxContainer { +// display: flex; +// flex-direction: row; +// padding-top: 13px; +// align-items: center; +// p { +// color:black; +// white-space: nowrap; +// } +// }.box-right { +// display: flex; +// flex-direction: column; +// justify-content: center; +// margin: auto; +// padding: 3%; +// border-radius: 4px; +// background: white; +// width: 100%; +// max-width: 518px; +// height: 550px; + +// .form { +// margin: auto; +// padding: 3% 0; +// max-width: 320px; +// width: 100%; +// color: $black; +// } + +// .form-control { +// border-radius: 4px; +// border: 1px solid #D8D8D8; +// max-width: 320px; +// width: 100%; +// height: auto; +// padding: 2.7% 1.7%; +// margin: 2.6% auto; +// margin-bottom: 1rem; +// } +// input::placeholder { +// font-size: 1.1rem; +// color:#D8D8D8; +// } + +// .bottom-form { +// width: 100%; +// display: flex; +// justify-content: space-between; +// margin: 3% 0; + +// .check-box-container { +// display: flex; +// flex-direction: row; +// padding-top: 13px; +// align-items: center; +// p { +// color:black; +// white-space: nowrap; +// } +// } + +// .btn-container { +// width: 60%; +// display: flex; +// justify-content: flex-end; +// padding-bottom: 15px; + +// .signup-btn, +// button.login-btn { +// align-self: end; +// border: none; +// width: 100%; +// max-width: 115px; +// height: 36px; +// border-radius: 4px; +// background: #00E6BC; +// color: black; +// font-size: 14px; +// } +// } +// } +// .bottomAccount{ +// display: flex; +// flex-direction: column; +// padding: 30px; + +// .loginAccount { +// text-align: center; +// color: #2477E5; +// font-size: 18px; +// } +// } +// .callingError { +// color: red; +// display: flex; +// justify-content: center; +// } +// } + +// btnContainer { +// width: 60%; +// display: flex; +// justify-content: flex-end; +// padding-bottom: 15px; + +// .signup-btn, +// button.login-btn { +// align-self: end; +// border: none; +// width: 100%; +// max-width: 115px; +// height: 36px; +// border-radius: 4px; +// background: #00E6BC; +// color: black; +// font-size: 14px; +// } +// } +// } +// .bottomAccount{ +// display: flex; +// flex-direction: column; +// padding: 30px; + +// .loginAccount { +// text-align: center; +// color: #2477E5; +// font-size: 18px; +// } +// } +// .callingError { +// color: red; +// display: flex; +// justify-content: center; +// } + } + }, + [theme.breakpoints.down("xs")]: { + boxContainer: { + flexDirection: "column", + alignItems: "center" + }, + boxLeft: { + width: "80%", + margin: 0, + padding: 0, + + textContainer: { + margin: "0 auto", + width: "100%", + h1: { + fontSize: "10vw" + }, + h5: { + fontSize: "3vw", + fontWeight: "normal", + paddingTop: "2rem" + } + }, + imageWrapper: { + width: "100%", + } + } + } +})); + +export default LoginStyles; From 0404c37a1a331b82f41fb92df11b06ebe32ff321 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 21 Apr 2020 23:01:20 -0700 Subject: [PATCH 483/822] update login and signup page --- src/components/auth/Login.js | 79 ++++++----- .../layout/nav-layouts/LoginNavLinks.js | 5 +- src/css/main.css | 123 ++++++++++++------ src/scss/components/_onboarding.scss | 106 ++++++++++++--- src/scss/components/_onboardingNavLinks.scss | 28 +--- 5 files changed, 224 insertions(+), 117 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 70b2d5d..b0a23ca 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -6,7 +6,7 @@ import { ifDev } from "../../utils/removeAttribute.js"; // styling imports import Picture1 from "../../img/watching-tv.png"; import { TextField, Checkbox } from "@material-ui/core"; -import { makeStyles } from '@material-ui/core/styles'; +import { makeStyles } from "@material-ui/core/styles"; // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; @@ -15,51 +15,52 @@ import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; import { useForm } from "react-hook-form"; import * as Yup from "yup"; - - -const useStyles = makeStyles((theme) => ({ -root:{ - margin: theme.spacing(1), -}, -textField:{ -margin: '2%', -width: '90%', -padding:'0', - -} +//link to register +import { Link } from "react-router-dom"; + +const useStyles = makeStyles(theme => ({ + root: { + margin: theme.spacing(1) + }, + textField: { + display: "flex", + justifyContent: "center", + marginBottom: "2%", + width: "100%", + padding: "0" + // display:'flex', + // justifyContent:'center' + } })); const initialUser = { user_name: "", - password: "", + password: "" }; const RegisterSchema = Yup.object().shape({ user_name: Yup.string().required("Username is required"), password: Yup.string().required("Password is required") -}) - +}); -const LoginPage = (props) => { +const LoginPage = props => { const [user, setUser] = useState(initialUser); - const { handleSubmit, errors} = useForm({ + const { handleSubmit, errors } = useForm({ validationSchema: RegisterSchema - }) + }); const classes = useStyles(); - const handleChange = (e) => { + const handleChange = e => { setUser({ ...user, - [e.target.name]: e.target.value, + [e.target.name]: e.target.value }); }; - const loginUser = (e) => { + const loginUser = e => { e.preventDefault(); props.loginAction(user); }; - - return (
{ onSubmit={handleSubmit(loginUser)} data-test={ifDev("loginForm")} > - {errors.user_name && errors.user_name.type === "required" && (

A username is required

)} - {errors.password && errors.password.type === "required" && (

A password is required

)}
-
+ {/*

Remember me

-
+
*/}
-

Forgot password?

+

+ + Don't have an account? Sign up + +

@@ -144,10 +153,10 @@ const LoginPage = (props) => { ); }; -const mapStateToProps = (state) => { +const mapStateToProps = state => { return { userid: state.login.userid, - errorStatus: state.login.error, + errorStatus: state.login.error }; }; export default connect(mapStateToProps, { loginAction })(LoginPage); diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js index 69957c3..e2ad669 100644 --- a/src/components/layout/nav-layouts/LoginNavLinks.js +++ b/src/components/layout/nav-layouts/LoginNavLinks.js @@ -1,6 +1,5 @@ import React from "react"; import { ifDev } from "../../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; // styling imports import GroaLogo from "../../../img/groa-logo-nav.png"; @@ -9,9 +8,7 @@ export default function LoginNavLinks() { return (
Groa Logo - - Don't have an account? Sign up - +

Sign In

); } diff --git a/src/css/main.css b/src/css/main.css index d02e6f6..d72f65b 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -160,8 +160,8 @@ #root .container.login-component .box-right .bottom-form { width: 100%; display: flex; - justify-content: space-between; - margin: 3% 0; } + flex-direction: column-reverse; + margin: 0; } #root .container.register-component .box-right .bottom-form .check-box-container, #root .container.login-component .box-right .bottom-form .check-box-container { display: flex; @@ -174,18 +174,17 @@ white-space: nowrap; } #root .container.register-component .box-right .bottom-form .btn-container, #root .container.login-component .box-right .bottom-form .btn-container { - width: 60%; + width: 100%; display: flex; - justify-content: flex-end; + justify-content: center; padding-bottom: 15px; } #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, #root .container.login-component .box-right .bottom-form .btn-container .signup-btn, #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { - align-self: end; border: none; width: 100%; - max-width: 115px; + max-width: 100%; height: 36px; border-radius: 4px; background: #00e6bc; @@ -195,12 +194,26 @@ #root .container.login-component .box-right .bottomAccount { display: flex; flex-direction: column; - padding: 30px; } + padding: 5%; } #root .container.register-component .box-right .bottomAccount .loginAccount, #root .container.login-component .box-right .bottomAccount .loginAccount { text-align: center; color: #2477e5; font-size: 18px; } + #root .container.register-component .box-right .bottomAccount .link, + #root .container.login-component .box-right .bottomAccount .link { + display: flex; + width: 100%; + height: auto; + font-size: 1rem; + text-decoration: none; + flex-direction: column-reverse; + align-items: center; + color: white; } + #root .container.register-component .box-right .bottomAccount .link:hover, + #root .container.login-component .box-right .bottomAccount .link:hover { + color: #00b392; + font-weight: bold; } #root .container.register-component .box-right .callingError, #root .container.login-component .box-right .callingError { color: red; @@ -271,18 +284,69 @@ display: none; } #root .container.register-component .box-container .box-right, #root .container.login-component .box-container .box-right { - width: 100%; - margin: 2%; - padding: 0; display: flex; flex-direction: column; justify-content: center; - border-radius: 0; + margin: 2%; + padding: 0%; + border-radius: 4px; background: #505050; + width: 100%; height: 100%; } #root .container.register-component .box-container .box-right .form, #root .container.login-component .box-container .box-right .form { - max-width: 90%; + justify-content: center; + max-width: 100%; } + #root .container.register-component .box-container .box-right .bottom-form, + #root .container.login-component .box-container .box-right .bottom-form { + width: 100%; + display: flex; + flex-direction: column-reverse; + margin: 0; } + #root .container.register-component .box-container .box-right .bottom-form .check-box-container, + #root .container.login-component .box-container .box-right .bottom-form .check-box-container { + display: flex; + flex-direction: row; + padding-top: 13px; + align-items: center; } + #root .container.register-component .box-container .box-right .bottom-form .check-box-container p, + #root .container.login-component .box-container .box-right .bottom-form .check-box-container p { + color: black; + white-space: nowrap; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container, + #root .container.login-component .box-container .box-right .bottom-form .btn-container { + width: 100%; + display: flex; + justify-content: center; + padding-bottom: 15px; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { + align-items: center; + border: none; + width: 100%; + max-width: 100%; + height: 36px; + border-radius: 4px; + background: #00e6bc; + color: black; + font-size: 14px; + margin-top: 3%; } + #root .container.register-component .box-container .box-right .bottomAccount, + #root .container.login-component .box-container .box-right .bottomAccount { + display: flex; + flex-direction: column; + padding: 2%; } + #root .container.register-component .box-container .box-right .bottomAccount .loginAccount, + #root .container.login-component .box-container .box-right .bottomAccount .loginAccount { + text-align: center; + color: #2477e5; + font-size: 18px; } + #root .container.register-component .box-container .box-right .callingError, + #root .container.login-component .box-container .box-right .callingError { + color: red; + display: flex; justify-content: center; } } #root .register.nav, #root .login.nav { @@ -300,33 +364,16 @@ #root .login.nav img { height: 2.5rem; width: auto; } - #root .register.nav .link, - #root .login.nav .link { + #root .register.nav .signin-title, + #root .login.nav .signin-title { display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - justify-content: flex-end; - align-items: center; - color: white; } - #root .register.nav .link:hover, - #root .login.nav .link:hover { - color: #00b392; - font-weight: bold; } - @media (max-width: 600px) { - #root .register.nav img, - #root .login.nav img { - width: 136px; - height: 38px; - left: 130px; - top: 102px; } - #root .register.nav .link, - #root .login.nav .link { - justify-content: flex-start; - height: 30px; - left: 16px; - top: 141px; } } + justify-content: flex-start; } + @media (max-width: 600px) { + #root img { + width: 136px; + height: 38px; + left: 130px; + top: 102px; } } #root .mainContainer { background: #000A12; padding: 1.1% 1%; diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index a99c086..8661ca3 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -89,8 +89,8 @@ .bottom-form { width: 100%; display: flex; - justify-content: space-between; - margin: 3% 0; + flex-direction: column-reverse; + margin: 0; .check-box-container { display: flex; @@ -104,17 +104,17 @@ } .btn-container { - width: 60%; + width: 100%; display: flex; - justify-content: flex-end; + justify-content: center; padding-bottom: 15px; .signup-btn, button.login-btn { - align-self: end; + // align-self: end; border: none; width: 100%; - max-width: 115px; + max-width: 100%; height: 36px; border-radius: 4px; background: #00e6bc; @@ -126,13 +126,29 @@ .bottomAccount { display: flex; flex-direction: column; - padding: 30px; + padding: 5%; .loginAccount { text-align: center; color: #2477e5; font-size: 18px; } + .link { + display: flex; + width: 100%; + height: auto; + font-size: 1rem; + text-decoration: none; + // justify-content: flex-end; + flex-direction: column-reverse; + align-items: center; + color: $white; + + &:hover { + color: $turqoise3; + font-weight: bold; + } + } } .callingError { color: red; @@ -205,23 +221,79 @@ } } .box-right { - width: 100%; - margin: 2%; - padding: 0; display: flex; flex-direction: column; justify-content: center; - border-radius: 0; - background: #505050; - - // max-width: 100%; + margin: 2%; + padding: 0%; + border-radius: 4px; + background: $black; + width: 100%; height: 100%; + .form { - max-width: 90%; + justify-content: center; + max-width: 100% + + } + + .bottom-form { + width: 100%; + display: flex; + flex-direction: column-reverse; + margin: 0; + + .check-box-container { + display: flex; + flex-direction: row; + padding-top: 13px; + align-items: center; + p { + color: black; + white-space: nowrap; + } + } + + .btn-container { + width: 100%; + display: flex; + justify-content: center; + padding-bottom: 15px; + + .signup-btn, + button.login-btn { + align-items:center; + border: none; + width: 100%; + max-width: 100%; + height: 36px; + border-radius: 4px; + background: #00e6bc; + color: black; + font-size: 14px; + margin-top:3%; + } + } + } + .bottomAccount { + display: flex; + flex-direction: column; + padding: 2%; + + .loginAccount { + text-align: center; + color: #2477e5; + font-size: 18px; + } + } + .callingError { + color: red; + display: flex; justify-content: center; } - } - } + + + } } } diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index 14ca91b..9e7114d 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -13,21 +13,11 @@ height: 2.5rem; width: auto; } - .link { + .signin-title{ display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - justify-content: flex-end; - align-items: center; - color: $white; - - &:hover { - color: $turqoise3; - font-weight: bold; - } + justify-content: flex-start; } +} @media (max-width: 600px) { img { // position: absolute; @@ -36,14 +26,6 @@ left: 130px; top: 102px; } - .link { - // flex-direction: column; - justify-content: flex-start; - // position: absolute; -// width: 63px; -height: 30px; -left: 16px; -top: 141px; - } + } -} + From c3ee61280d5dd829f38b607514d7ca25ff25c87e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 22 Apr 2020 00:08:16 -0700 Subject: [PATCH 484/822] login and register page mobile responsive --- src/components/auth/Register.js | 31 ++++++++++++++++--- .../layout/nav-layouts/LoginNavLinks.js | 2 +- .../layout/nav-layouts/RegisterNavLinks.js | 6 ++-- src/css/main.css | 14 ++++++--- src/scss/components/_onboarding.scss | 4 +-- src/scss/components/_onboardingNavLinks.scss | 28 ++++++++++------- 6 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index fb12e4d..a513b43 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -11,10 +11,28 @@ import * as Yup from "yup"; // styling imports import Picture3 from "../../img/couch-popcorn.png"; import { TextField, Checkbox, Grid } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; + +const useStyles = makeStyles(theme => ({ + root: { + margin: theme.spacing(1) + }, + textField: { + display: "flex", + justifyContent: "center", + marginBottom: "2%", + width: "100%", + padding: "0" + // display:'flex', + // justifyContent:'center' + } +})); + const initialUser = { user: { email: "", @@ -38,6 +56,7 @@ const Register = (props) => { const { register, handleSubmit, errors } = useForm({ validationSchema: RegisterSchema, }); + const classes = useStyles(); const handleChange = (event) => { setUsers({ @@ -92,6 +111,7 @@ const Register = (props) => { { { { {
{/* todo: add Remember functionality */} -
+ {/*

Remember me

-
+
*/}
- Already have an account? + Already have an account? Login
diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js index e2ad669..a7911e8 100644 --- a/src/components/layout/nav-layouts/LoginNavLinks.js +++ b/src/components/layout/nav-layouts/LoginNavLinks.js @@ -8,7 +8,7 @@ export default function LoginNavLinks() { return (
Groa Logo -

Sign In

+

Sign In

); } diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index b274021..f1d7e40 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -1,6 +1,6 @@ import React from "react"; import { ifDev } from "../../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; +// import { Link } from "react-router-dom"; // styling imports import GroaLogo from "../../../img/groa-logo-nav.png"; @@ -8,9 +8,7 @@ export default function RegisterNavLinks() { return (
Groa Logo - - Login - +

Register

); } diff --git a/src/css/main.css b/src/css/main.css index d72f65b..d272b23 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -1,3 +1,4 @@ +@charset "UTF-8"; @import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); #root { /* @@ -188,7 +189,7 @@ height: 36px; border-radius: 4px; background: #00e6bc; - color: black; + color: Ć„ white; font-size: 14px; } #root .container.register-component .box-right .bottomAccount, #root .container.login-component .box-right .bottomAccount { @@ -330,7 +331,7 @@ height: 36px; border-radius: 4px; background: #00e6bc; - color: black; + color: white; font-size: 14px; margin-top: 3%; } #root .container.register-component .box-container .box-right .bottomAccount, @@ -362,18 +363,23 @@ flex-direction: column; } } #root .register.nav img, #root .login.nav img { + align-items: center; height: 2.5rem; width: auto; } #root .register.nav .signin-title, #root .login.nav .signin-title { display: flex; - justify-content: flex-start; } + color: white; } @media (max-width: 600px) { #root img { width: 136px; height: 38px; left: 130px; - top: 102px; } } + top: 102px; } + #root .signin-title { + display: flex; + justify-content: flex-start; + margin-top: 2%; } } #root .mainContainer { background: #000A12; padding: 1.1% 1%; diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 8661ca3..c2d31e8 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -118,7 +118,7 @@ height: 36px; border-radius: 4px; background: #00e6bc; - color: black; + color: Ć„$white; font-size: 14px; } } @@ -269,7 +269,7 @@ height: 36px; border-radius: 4px; background: #00e6bc; - color: black; + color: $white; font-size: 14px; margin-top:3%; } diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index 9e7114d..838e679 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -10,22 +10,28 @@ flex-direction: column; } img { + align-items: center; height: 2.5rem; width: auto; } - .signin-title{ + .signin-title { display: flex; - justify-content: flex-start; + color:white; + // align-items: flex-start;; } } - @media (max-width: 600px) { - img { - // position: absolute; - width: 136px; - height: 38px; - left: 130px; - top: 102px; - } +@media (max-width: 600px) { + img { + // position: absolute; + width: 136px; + height: 38px; + left: 130px; + top: 102px; + } + .signin-title { + display: flex; + justify-content: flex-start; + margin-top: 2%; } - +} From bcf3881c87babbd50c5ab1a6125912477240d954 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 22 Apr 2020 10:35:43 -0700 Subject: [PATCH 485/822] update google sign in btn and updated axioswithauth link --- public/index.html | 1 + src/components/auth/Login.js | 21 ++++-- src/css/main.css | 58 ++++++++++++--- .../btn_google_signin_light_normal_web@2x.png | Bin 0 -> 8055 bytes .../x1_btn_google_signin_light_normal_web.png | Bin 0 -> 4099 bytes src/scss/abstracts/_variables.scss | 6 ++ src/scss/components/_onboarding.scss | 67 +++++++++++++++--- src/utils/axiosWithAuth.js | 2 +- 8 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 src/img/btn_google_signin_light_normal_web@2x.png create mode 100644 src/img/x1_btn_google_signin_light_normal_web.png diff --git a/public/index.html b/public/index.html index cf7b07e..0057e58 100644 --- a/public/index.html +++ b/public/index.html @@ -3,6 +3,7 @@ + ({ root: { margin: theme.spacing(1) }, textField: { display: "flex", - justifyContent: "center", + // justifyContent: "center", marginBottom: "2%", - width: "100%", + width: "50%", padding: "0" // display:'flex', // justifyContent:'center' @@ -70,7 +73,7 @@ const LoginPage = props => {
-
+

@@ -89,7 +92,7 @@ const LoginPage = props => { {/* FORM START */}
@@ -116,6 +119,7 @@ const LoginPage = props => { {errors.password && errors.password.type === "required" && (

A password is required

)} +
{/*
@@ -130,8 +134,15 @@ const LoginPage = props => { +
+
+ +
+

Sign in with Google

+
+

{

- +
{/* FORM ENDS */}
diff --git a/src/css/main.css b/src/css/main.css index d272b23..e088bc2 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -1,5 +1,5 @@ -@charset "UTF-8"; @import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); +@import url(https://fonts.googleapis.com/css?family=Roboto:500); #root { /* sources that helped me style the input @@ -138,11 +138,11 @@ height: 550px; } #root .container.register-component .box-right .form, #root .container.login-component .box-right .form { - margin: auto; - padding: 3% 0; - max-width: 320px; width: 100%; - color: #505050; } + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; } #root .container.register-component .box-right .form-control, #root .container.login-component .box-right .form-control { border-radius: 4px; @@ -177,7 +177,8 @@ #root .container.login-component .box-right .bottom-form .btn-container { width: 100%; display: flex; - justify-content: center; + align-items: center; + flex-direction: column; padding-bottom: 15px; } #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, @@ -185,12 +186,49 @@ #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { border: none; width: 100%; - max-width: 100%; - height: 36px; + max-width: 50%; + height: 50px; border-radius: 4px; background: #00e6bc; - color: Ć„ white; + color: #505050; font-size: 14px; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn { + width: 50%; + height: 50px; + background-color: white; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); + margin-top: 2%; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; + background-color: white; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon { + position: absolute; + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { + margin: 18px 11px 0 80px; + color: #505050; + font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn:hover, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn:hover { + box-shadow: 0 0 6px #4285f4; } + #root .container.register-component .box-right .bottom-form .btn-container .google-btn:active, + #root .container.login-component .box-right .bottom-form .btn-container .google-btn:active { + background: white; } #root .container.register-component .box-right .bottomAccount, #root .container.login-component .box-right .bottomAccount { display: flex; @@ -254,7 +292,7 @@ #root .container.login-component .box-container .box-right .form { margin: 0 auto; padding: 0; - max-width: 50%; + max-width: 100%; width: 100%; color: #505050; } } @media (max-width: 600px) { diff --git a/src/img/btn_google_signin_light_normal_web@2x.png b/src/img/btn_google_signin_light_normal_web@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e2c5c7d2fd44bf9babaf95f859aaae3f09d7c6 GIT binary patch literal 8055 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 literal 0 HcmV?d00001 diff --git a/src/img/x1_btn_google_signin_light_normal_web.png b/src/img/x1_btn_google_signin_light_normal_web.png new file mode 100644 index 0000000000000000000000000000000000000000..29ab51106ce90afc978348404b55d340f801b31c GIT binary patch literal 4099 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 literal 0 HcmV?d00001 diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss index ea922b0..70d2ac6 100644 --- a/src/scss/abstracts/_variables.scss +++ b/src/scss/abstracts/_variables.scss @@ -12,6 +12,10 @@ $gray3: hsl(207, 100%, 4%); $black: #505050; $white: hsl(0, 0%, 100%); + +$google-blue: #4285f4; +$button-active-blue: #1669F2; + // color purposes here (will have to ask Martin or dig into Figma more for this) //text $white-text: $white; @@ -25,6 +29,8 @@ $secondary-accent: $turqoise2; @import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); $workSans: "Work Sans", sans-serif; +@import url(https://fonts.googleapis.com/css?family=Roboto:500); + // font sizing $baseFontSize: 10px; $deskFontSize: $baseFontSize * 1.4; // 14px diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index c2d31e8..70dd413 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -64,11 +64,14 @@ height: 550px; .form { - margin: auto; - padding: 3% 0; - max-width: 320px; + // margin: auto; + // padding: 3% 0; + // max-width: 320px; width: 100%; - color: $black; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; } .form-control { @@ -106,7 +109,8 @@ .btn-container { width: 100%; display: flex; - justify-content: center; + align-items: center; + flex-direction: column; padding-bottom: 15px; .signup-btn, @@ -114,13 +118,55 @@ // align-self: end; border: none; width: 100%; - max-width: 100%; - height: 36px; + max-width: 50%; + height: 50px; border-radius: 4px; background: #00e6bc; - color: Ć„$white; + color: $black; + font-size: 14px; + } + + //Gogole Sign in btn + .google-btn { + width: 50%; + height: 50px; + background-color: $white; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0,0,0,.25); + margin-top: 2%; + .google-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; + background-color: $white; + } + .google-icon { + position: absolute; + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; + } + .btn-text { + // float: right; + margin: 18px 11px 0 80px; + color: $black; font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; + + + } + &:hover { + box-shadow: 0 0 6px $google-blue; } + &:active { + background: $white; + } + } } } .bottomAccount { @@ -188,7 +234,7 @@ .form { margin: 0 auto; padding: 0; - max-width: 50%; + max-width: 100%; width: 100%; color: $black; } @@ -230,6 +276,8 @@ background: $black; width: 100%; height: 100%; + + .form { justify-content: center; @@ -258,6 +306,7 @@ width: 100%; display: flex; justify-content: center; + // flex-direction: column-reverse; padding-bottom: 15px; .signup-btn, diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 0fe4aa3..3e43394 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ - baseURL: "https://api.groa.us/api/users", + baseURL: "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users", headers: { Authorization: token } From d2911144ed758d5990a9f3b742ee3a049be31626 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 22 Apr 2020 10:52:20 -0700 Subject: [PATCH 486/822] update login and register page with google btn --- src/components/auth/Login.js | 2 +- src/components/auth/Register.js | 20 +-- src/css/main.css | 199 ++++++++++++++------------- src/scss/components/_onboarding.scss | 31 +++-- 4 files changed, 138 insertions(+), 114 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 6cfb577..c26a32c 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -29,7 +29,7 @@ const useStyles = makeStyles(theme => ({ display: "flex", // justifyContent: "center", marginBottom: "2%", - width: "50%", + width: "100%", padding: "0" // display:'flex', // justifyContent:'center' diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index a513b43..eeccbc2 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -108,8 +108,8 @@ const Register = (props) => { data-test={ifDev("registerForm")} onSubmit={handleSubmit(onSubmit)} > - - + {/* */} + {/* */} { {errors.email && errors.email.type === "required" && (

An email is required

)} -
- + {/* */} + {/* */} { {errors.user_name && errors.user_name.type === "required" && (

Username is required

)} -
- + {/* */} + {/* */} { {errors.password && errors.password.type === "min" && (

Password must be at least 6 characters long

)} -
- + {/* */} + {/* */} { errors.confirmpassword.type === "oneOf" && (

Password does not match

)} -
-
+ {/*
*/} + {/*
*/}
{/* todo: add Remember functionality */} {/*
diff --git a/src/css/main.css b/src/css/main.css index e088bc2..9637a3c 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -129,6 +129,7 @@ display: flex; flex-direction: column; justify-content: center; + align-items: center; margin: auto; padding: 3%; border-radius: 4px; @@ -138,7 +139,7 @@ height: 550px; } #root .container.register-component .box-right .form, #root .container.login-component .box-right .form { - width: 100%; + width: 50%; display: flex; justify-content: center; flex-direction: column; @@ -186,7 +187,7 @@ #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { border: none; width: 100%; - max-width: 50%; + max-width: 100%; height: 50px; border-radius: 4px; background: #00e6bc; @@ -194,7 +195,7 @@ font-size: 14px; } #root .container.register-component .box-right .bottom-form .btn-container .google-btn, #root .container.login-component .box-right .bottom-form .btn-container .google-btn { - width: 50%; + width: 100%; height: 50px; background-color: white; border-radius: 4px; @@ -211,14 +212,13 @@ background-color: white; } #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon, #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon { - position: absolute; margin-top: 11px; margin-left: 11px; width: 18px; height: 18px; } #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 18px 11px 0 80px; + margin: 7% 2% 0 30%; color: #505050; font-size: 14px; letter-spacing: 0.2px; @@ -294,99 +294,108 @@ padding: 0; max-width: 100%; width: 100%; - color: #505050; } } - @media (max-width: 600px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - display: none; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper .logo, - #root .container.login-component .box-container .box-left .image-wrapper .logo { - display: none; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { + color: #505050; } + #root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text, + #root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text { + margin: 4% 2% 0 38%; } } + +@media (max-width: 1068px) and (max-width: 600px) { + #root .container.register-component .box-container, + #root .container.login-component .box-container { + flex-direction: column; + align-items: center; } + #root .container.register-component .box-container .box-left, + #root .container.login-component .box-container .box-left { + width: 80%; + margin: 0; + padding: 0; } + #root .container.register-component .box-container .box-left .text-container, + #root .container.login-component .box-container .box-left .text-container { + margin: 0 auto; + width: 100%; } + #root .container.register-component .box-container .box-left .text-container h1, + #root .container.login-component .box-container .box-left .text-container h1 { + display: none; } + #root .container.register-component .box-container .box-left .text-container h5, + #root .container.login-component .box-container .box-left .text-container h5 { + display: none; } + #root .container.register-component .box-container .box-left .image-wrapper, + #root .container.login-component .box-container .box-left .image-wrapper { + display: none; } + #root .container.register-component .box-container .box-left .image-wrapper .logo, + #root .container.login-component .box-container .box-left .image-wrapper .logo { + display: none; } + #root .container.register-component .box-container .box-right, + #root .container.login-component .box-container .box-right { + display: flex; + flex-direction: column; + justify-content: center; + margin: 2%; + padding: 0%; + border-radius: 4px; + background: #505050; + width: 100%; + height: 100%; } + #root .container.register-component .box-container .box-right .form, + #root .container.login-component .box-container .box-right .form { + justify-content: center; + max-width: 100%; } + #root .container.register-component .box-container .box-right .bottom-form, + #root .container.login-component .box-container .box-right .bottom-form { + width: 100%; + display: flex; + flex-direction: column-reverse; + margin: 0; } + #root .container.register-component .box-container .box-right .bottom-form .check-box-container, + #root .container.login-component .box-container .box-right .bottom-form .check-box-container { display: flex; - flex-direction: column; - justify-content: center; - margin: 2%; - padding: 0%; - border-radius: 4px; - background: #505050; + flex-direction: row; + padding-top: 13px; + align-items: center; } + #root .container.register-component .box-container .box-right .bottom-form .check-box-container p, + #root .container.login-component .box-container .box-right .bottom-form .check-box-container p { + color: black; + white-space: nowrap; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container, + #root .container.login-component .box-container .box-right .bottom-form .btn-container { width: 100%; - height: 100%; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - justify-content: center; - max-width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form, - #root .container.login-component .box-container .box-right .bottom-form { + display: flex; + justify-content: center; + padding-bottom: 15px; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { + align-items: center; + border: none; width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; } - #root .container.register-component .box-container .box-right .bottom-form .check-box-container, - #root .container.login-component .box-container .box-right .bottom-form .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; } - #root .container.register-component .box-container .box-right .bottom-form .check-box-container p, - #root .container.login-component .box-container .box-right .bottom-form .check-box-container p { - color: black; - white-space: nowrap; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container, - #root .container.login-component .box-container .box-right .bottom-form .btn-container { - width: 100%; - display: flex; - justify-content: center; - padding-bottom: 15px; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { - align-items: center; - border: none; - width: 100%; - max-width: 100%; - height: 36px; - border-radius: 4px; - background: #00e6bc; - color: white; - font-size: 14px; - margin-top: 3%; } - #root .container.register-component .box-container .box-right .bottomAccount, - #root .container.login-component .box-container .box-right .bottomAccount { - display: flex; - flex-direction: column; - padding: 2%; } - #root .container.register-component .box-container .box-right .bottomAccount .loginAccount, - #root .container.login-component .box-container .box-right .bottomAccount .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; } - #root .container.register-component .box-container .box-right .callingError, - #root .container.login-component .box-container .box-right .callingError { - color: red; - display: flex; - justify-content: center; } } + max-width: 100%; + height: 50px; + border-radius: 4px; + background: #00e6bc; + font-size: 14px; + margin-top: 3%; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn { + width: 100%; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { + margin: 4% 2% 0 35%; } + #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, + #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { + display: flex; + flex-direction: column; + padding: 2%; } + #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, + #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { + text-align: center; + color: #2477e5; + font-size: 18px; } + #root .container.register-component .box-container .box-right .bottom-form .callingError, + #root .container.login-component .box-container .box-right .bottom-form .callingError { + color: red; + display: flex; + justify-content: center; } } #root .register.nav, #root .login.nav { font-family: "Work Sans", sans-serif; diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 70dd413..9d95cc7 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -55,6 +55,7 @@ display: flex; flex-direction: column; justify-content: center; + align-items: center; margin: auto; padding: 3%; border-radius: 4px; @@ -67,7 +68,7 @@ // margin: auto; // padding: 3% 0; // max-width: 320px; - width: 100%; + width: 50%; display: flex; justify-content: center; flex-direction: column; @@ -118,7 +119,7 @@ // align-self: end; border: none; width: 100%; - max-width: 50%; + max-width: 100%; height: 50px; border-radius: 4px; background: #00e6bc; @@ -128,7 +129,7 @@ //Gogole Sign in btn .google-btn { - width: 50%; + width: 100%; height: 50px; background-color: $white; border-radius: 4px; @@ -144,7 +145,7 @@ background-color: $white; } .google-icon { - position: absolute; + // position: absolute; margin-top: 11px; margin-left: 11px; width: 18px; @@ -152,7 +153,7 @@ } .btn-text { // float: right; - margin: 18px 11px 0 80px; + margin: 7% 2% 0 30%; color: $black; font-size: 14px; letter-spacing: 0.2px; @@ -238,6 +239,13 @@ width: 100%; color: $black; } + .btn-container { + .google-btn { + .btn-text { + // float: right; + margin: 4% 2% 0 38%; + } + } } } } @@ -315,13 +323,19 @@ border: none; width: 100%; max-width: 100%; - height: 36px; + height: 50px; border-radius: 4px; background: #00e6bc; - color: $white; + font-size: 14px; margin-top:3%; } + .google-btn { + width:100%; + .btn-text { + // float: right; + margin: 4% 2% 0 35%; + } } } .bottomAccount { @@ -342,7 +356,8 @@ } } - + } } } } +} \ No newline at end of file From fc2dd922ca96b312836007578d4eae6e1a6ab6bb Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 16:23:05 -0400 Subject: [PATCH 487/822] fixed bug on register and login --- src/components/auth/Register.js | 167 +++++++++++++--------------- src/store/actions/loginAction.js | 2 +- src/store/actions/registerAction.js | 8 +- src/utils/history.js | 2 + 4 files changed, 88 insertions(+), 91 deletions(-) create mode 100644 src/utils/history.js diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index eeccbc2..0f5cae1 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -13,34 +13,23 @@ import Picture3 from "../../img/couch-popcorn.png"; import { TextField, Checkbox, Grid } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; - // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; - -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ root: { - margin: theme.spacing(1) + margin: theme.spacing(1), }, textField: { display: "flex", justifyContent: "center", marginBottom: "2%", width: "100%", - padding: "0" + padding: "0", // display:'flex', // justifyContent:'center' - } -})); - -const initialUser = { - user: { - email: "", - user_name: "", - password: "", - confirmpassword: "", }, -}; +})); const RegisterSchema = Yup.object().shape({ user_name: Yup.string().required("Username is required"), @@ -52,7 +41,12 @@ const RegisterSchema = Yup.object().shape({ }); const Register = (props) => { - const [users, setUsers] = useState(initialUser.user); + const [users, setUsers] = useState({ + email: "", + user_name: "", + password: "", + confirmpassword: "", + }); const { register, handleSubmit, errors } = useForm({ validationSchema: RegisterSchema, }); @@ -60,20 +54,19 @@ const Register = (props) => { const handleChange = (event) => { setUsers({ - user: { - ...users, - [event.target.name]: event.target.value, - }, + ...users, + [event.target.name]: event.target.value, }); + console.log(users); }; const onSubmit = (event) => { - event.preventDefault(); let user = { user_name: users.user_name, email: users.email, password: users.password, }; + console.log("user before register button", user); props.registerAction(user); }; @@ -109,72 +102,72 @@ const Register = (props) => { onSubmit={handleSubmit(onSubmit)} > {/* */} - {/* */} - - {errors.email && errors.email.type === "required" && ( -

An email is required

- )} - {/*
*/} - {/* */} - - {errors.user_name && errors.user_name.type === "required" && ( -

Username is required

- )} - {/*
*/} - {/* */} - - {errors.password && errors.password.type === "required" && ( -

Password required

- )} - {errors.password && errors.password.type === "min" && ( -

Password must be at least 6 characters long

- )} - {/*
*/} - {/* */} - - {errors.confirmpassword && - errors.confirmpassword.type === "required" && ( -

Password Confirmation Required

- )} - {errors.confirmpassword && - errors.confirmpassword.type === "oneOf" && ( -

Password does not match

- )} - {/*
*/} + {/* */} + + {errors.email && errors.email.type === "required" && ( +

An email is required

+ )} + {/*
*/} + {/* */} + + {errors.user_name && errors.user_name.type === "required" && ( +

Username is required

+ )} + {/*
*/} + {/* */} + + {errors.password && errors.password.type === "required" && ( +

Password required

+ )} + {errors.password && errors.password.type === "min" && ( +

Password must be at least 6 characters long

+ )} + {/*
*/} + {/* */} + + {errors.confirmpassword && + errors.confirmpassword.type === "required" && ( +

Password Confirmation Required

+ )} + {errors.confirmpassword && + errors.confirmpassword.type === "oneOf" && ( +

Password does not match

+ )} + {/*
*/} {/*
*/}
{/* todo: add Remember functionality */} diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 3d6c285..1cbcc77 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -22,7 +22,7 @@ export function loginAction(userCreds, history) { type: FETCHING_WATCHLIST_SUCCESS, payload: res.data.watchlist }); - history.push(`/${res.data.id}/recommended`); + history.push(`/${res.data.id}/recommendations`); }) .catch(err => { console.log("ERROR: ", err); diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 1c00c16..6f9de09 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -5,7 +5,7 @@ export const FETCHING_USER_REGISTER_FAIL = "FETCHING_USER_REGISTER_FAIL"; // REGISTER export function registerAction(userCreds, history) { - let newUser = { + let user = { user_name: userCreds.user_name, password: userCreds.password }; @@ -15,14 +15,16 @@ export function registerAction(userCreds, history) { .then(res => { dispatch({ type: FETCHING_USER_REGISTER_SUCCESS }); axiosWithAuth() - .post("/login", newUser) + .post("/login", user) .then(res => { localStorage.setItem("token", res.data.token); dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.id }); - history.push(`/${res.data.id}/upload`); + history.push(`/${res.data.id}/recommendations`); + }).catch(err => { + console.log(err) }); }) .catch(err => { diff --git a/src/utils/history.js b/src/utils/history.js new file mode 100644 index 0000000..68df10c --- /dev/null +++ b/src/utils/history.js @@ -0,0 +1,2 @@ +import { createHashHistory } from "history"; +export default createHashHistory(); From e835719a5fe84ba889842adec4a0a505a0ccc99a Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 22 Apr 2020 13:49:21 -0700 Subject: [PATCH 488/822] update fix on register --- src/components/auth/Register.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 230bdae..10049aa 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -55,15 +55,13 @@ const Register = (props) => { const handleChange = (e) => { setUsers({ - ...users, - [event.target.name]: event.target.value, + [e.target.name]: e.target.value, }); console.log(users); }; -fixed-routes const onSubmit = (event) => { let user = { From 2310a98f8cb1bac2b40f901abc9d11be1382886c Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 22 Apr 2020 14:31:31 -0700 Subject: [PATCH 489/822] update baseURL --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3e43394..c21b743 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,7 +4,7 @@ const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ - baseURL: "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users", + baseURL: "https://dev.groa.us/api/users", headers: { Authorization: token } From f883bee7a7fdf1a54911d918939e40154959120c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:57:56 -0400 Subject: [PATCH 490/822] added history prop, fixed class warning. --- src/components/auth/Login.js | 83 +++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index c26a32c..680d5e1 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -19,49 +19,47 @@ import * as Yup from "yup"; import { Link } from "react-router-dom"; //google sign in -import GoogleBtn from "../../img/x1_btn_google_signin_light_normal_web.png" +import GoogleBtn from "../../img/x1_btn_google_signin_light_normal_web.png"; -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ root: { - margin: theme.spacing(1) + margin: theme.spacing(1), }, textField: { display: "flex", // justifyContent: "center", marginBottom: "2%", width: "100%", - padding: "0" + padding: "0", // display:'flex', // justifyContent:'center' - } + }, })); -const initialUser = { - user_name: "", - password: "" -}; - const RegisterSchema = Yup.object().shape({ user_name: Yup.string().required("Username is required"), - password: Yup.string().required("Password is required") + password: Yup.string().required("Password is required"), }); -const LoginPage = props => { - const [user, setUser] = useState(initialUser); +const LoginPage = (props) => { + const [user, setUser] = useState({ + user_name: "", + password: "", + }); const { handleSubmit, errors } = useForm({ - validationSchema: RegisterSchema + validationSchema: RegisterSchema, }); const classes = useStyles(); - const handleChange = e => { + const handleChange = (e) => { setUser({ ...user, - [e.target.name]: e.target.value + [e.target.name]: e.target.value, }); }; - const loginUser = e => { + const loginUser = (e) => { e.preventDefault(); - props.loginAction(user); + props.loginAction(user, props.history); }; return ( @@ -119,7 +117,7 @@ const LoginPage = props => { {errors.password && errors.password.type === "required" && (

A password is required

)} - +
{/*
@@ -134,27 +132,32 @@ const LoginPage = props => { -
-
- -
-

Sign in with Google

-
+
+
+ google logo +
+

+ Sign in with Google +

+
- -
-

- - Don't have an account? Sign up - -

-
- + +
+

+ + Don't have an account? Sign up + +

+
{/* FORM ENDS */}
@@ -164,10 +167,10 @@ const LoginPage = props => { ); }; -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, - errorStatus: state.login.error + errorStatus: state.login.error, }; }; export default connect(mapStateToProps, { loginAction })(LoginPage); From 6378097f6802614d8f390459983305bdaf504df2 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:58:19 -0400 Subject: [PATCH 491/822] added history prop --- src/components/auth/Register.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 0f5cae1..4de57b1 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -52,22 +52,21 @@ const Register = (props) => { }); const classes = useStyles(); - const handleChange = (event) => { + const handleChange = (e) => { setUsers({ ...users, - [event.target.name]: event.target.value, + [e.target.name]: e.target.value, }); - console.log(users); }; - const onSubmit = (event) => { + const onSubmit = () => { let user = { user_name: users.user_name, email: users.email, password: users.password, }; console.log("user before register button", user); - props.registerAction(user); + props.registerAction(user, props.history); }; return ( From 64570078036225f4c2dd9f7028cf1c426655679a Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:58:37 -0400 Subject: [PATCH 492/822] renamed id to match DB user_id --- src/store/actions/loginAction.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 1cbcc77..8330506 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -10,10 +10,11 @@ export function loginAction(userCreds, history) { axiosWithAuth() .post("/login", userCreds) .then(res => { + console.log(res) localStorage.setItem("token", res.data.token); dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, - payload: res.data.id }); + payload: res.data.user_id }); dispatch({ type: FETCHING_RATINGS_SUCCESS, payload: res.data.ratings @@ -22,7 +23,7 @@ export function loginAction(userCreds, history) { type: FETCHING_WATCHLIST_SUCCESS, payload: res.data.watchlist }); - history.push(`/${res.data.id}/recommendations`); + history.push(`/${res.data.user_id}/recommendations`); }) .catch(err => { console.log("ERROR: ", err); From 23ae9d6a29ed419fe2eaf27d89cf1a27eb4b8026 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:59:16 -0400 Subject: [PATCH 493/822] renamed payload to correct DB column --- src/store/actions/recommendationActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index 8b13edb..7cf5b87 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -18,7 +18,7 @@ export function recommendationAction(id) { .then(res => { dispatch({ type: FETCHING_RECOMMENDATIONS_SUCCESS, - payload: res.data.recommendation_json + payload: res.data.data }) }) .catch(err => { From 731256cb2d6bc9a985a011aace677c62292f4998 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:59:38 -0400 Subject: [PATCH 494/822] changed id to user_id --- src/store/actions/registerAction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 6f9de09..20db75c 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -20,9 +20,9 @@ export function registerAction(userCreds, history) { localStorage.setItem("token", res.data.token); dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, - payload: res.data.id + payload: res.data.user_id }); - history.push(`/${res.data.id}/recommendations`); + history.push(`/${res.data.user_id}/recommendations`); }).catch(err => { console.log(err) }); From 1874b9496129428b51a651b065ccc079e1ac1ba0 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:59:57 -0400 Subject: [PATCH 495/822] provided correct HTTPS link in axiosWithAuth --- src/utils/axiosWithAuth.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3e43394..9f654c9 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -4,10 +4,10 @@ const axiosWithAuth = () => { const token = localStorage.getItem("token"); return axios.create({ - baseURL: "http://groabe-env.v3umry9g8h.us-east-1.elasticbeanstalk.com/api/users", + baseURL: "https://dev.groa.us/api/users", headers: { - Authorization: token - } + Authorization: token, + }, }); }; From 0b62a8ebde7d2aa3b63e092742b331b95b9a7372 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 22 Apr 2020 18:31:52 -0400 Subject: [PATCH 496/822] fixed warning messages --- src/components/auth/Login.js | 15 ++++----------- src/components/auth/Register.js | 10 +--------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 680d5e1..5ff825a 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -5,7 +5,7 @@ import { ifDev } from "../../utils/removeAttribute.js"; // styling imports import Picture1 from "../../img/watching-tv.png"; -import { TextField, Checkbox } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; // Navbar Login @@ -19,7 +19,7 @@ import * as Yup from "yup"; import { Link } from "react-router-dom"; //google sign in -import GoogleBtn from "../../img/x1_btn_google_signin_light_normal_web.png"; +// import GoogleBtn from "../../img/x1_btn_google_signin_light_normal_web.png"; const useStyles = makeStyles((theme) => ({ root: { @@ -50,6 +50,7 @@ const LoginPage = (props) => { validationSchema: RegisterSchema, }); const classes = useStyles(); + const handleChange = (e) => { setUser({ ...user, @@ -119,15 +120,7 @@ const LoginPage = (props) => { )}
-
- {/*
- -

Remember me

-
*/} -
+
From 8155f1181b253ac2149569fcdb03f02d23beea20 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 23 Apr 2020 10:03:54 -0400 Subject: [PATCH 497/822] fixed login to route to recommendations --- src/components/auth/Login.js | 10 ++++++---- src/store/actions/loginAction.js | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 5ff825a..22947af 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -46,7 +46,7 @@ const LoginPage = (props) => { user_name: "", password: "", }); - const { handleSubmit, errors } = useForm({ + const { register, handleSubmit, errors } = useForm({ validationSchema: RegisterSchema, }); const classes = useStyles(); @@ -56,10 +56,10 @@ const LoginPage = (props) => { ...user, [e.target.name]: e.target.value, }); + console.log(user) }; - const loginUser = (e) => { - e.preventDefault(); + const onSubmit = () => { props.loginAction(user, props.history); }; @@ -92,7 +92,7 @@ const LoginPage = (props) => {
{ onChange={handleChange} label="Username" variant="outlined" + inputRef={register} /> {errors.user_name && errors.user_name.type === "required" && (

A username is required

@@ -114,6 +115,7 @@ const LoginPage = (props) => { onChange={handleChange} label="Password" variant="outlined" + inputRef={register} /> {errors.password && errors.password.type === "required" && (

A password is required

diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 8330506..163b4be 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -6,6 +6,7 @@ export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; // LOGIN export function loginAction(userCreds, history) { + console.log(userCreds) return dispatch => { axiosWithAuth() .post("/login", userCreds) From 3897a6c8f69c94f33571e889678205271cd48227 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 23 Apr 2020 10:31:51 -0400 Subject: [PATCH 498/822] adjusted path to correct path --- src/App.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/App.js b/src/App.js index ff3d623..2b50693 100644 --- a/src/App.js +++ b/src/App.js @@ -78,32 +78,32 @@ function App() { - + {/* this could be a modal */} {/* */} - - + +
From 5952e9b9ceb3adc71394cc46cbedf63efce78180 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 23 Apr 2020 09:37:57 -0700 Subject: [PATCH 499/822] add facebook button and clean up design on login and signup page --- src/components/auth/Login.js | 35 +++- src/css/main.css | 164 +++++++++++-------- src/scss/abstracts/_variables.scss | 2 +- src/scss/components/_onboarding.scss | 162 ++++++++++-------- src/scss/components/_onboardingNavLinks.scss | 3 +- 5 files changed, 222 insertions(+), 144 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index c26a32c..cfbd6f1 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -7,6 +7,9 @@ import { ifDev } from "../../utils/removeAttribute.js"; import Picture1 from "../../img/watching-tv.png"; import { TextField, Checkbox } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; +import Typography from '@material-ui/core/Typography'; +import Box from '@material-ui/core/Box'; + // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; @@ -18,9 +21,19 @@ import * as Yup from "yup"; //link to register import { Link } from "react-router-dom"; -//google sign in -import GoogleBtn from "../../img/x1_btn_google_signin_light_normal_web.png" +function Copyright() { + return ( + + {'Copyright Ā© '} + + GroĆ” + {' '} + 2020 + {'.'} + + ); +} const useStyles = makeStyles(theme => ({ root: { margin: theme.spacing(1) @@ -134,12 +147,20 @@ const LoginPage = props => { +

OR

Sign in with Google

+
+
+ +
+

Sign in with Facebook

+
+ {/*
Sign in with Facebook */}
@@ -150,15 +171,21 @@ const LoginPage = props => { to="/register" data-test={ifDev("register-link")} > - Don't have an account? Sign up +

Sign up

+

Don't have an account?

+ +

- +

{/* FORM ENDS */}
{/* END OF MAIN CONTENT */} + + +
// END LOGIN PAGE ); diff --git a/src/css/main.css b/src/css/main.css index 9637a3c..e578085 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -190,9 +190,37 @@ max-width: 100%; height: 50px; border-radius: 4px; - background: #00e6bc; + background: #00B392; color: #505050; - font-size: 14px; } + font-size: 14px; + margin-bottom: 2%; } + #root .container.register-component .box-right .bottom-form .btn-container .fancy, + #root .container.login-component .box-right .bottom-form .btn-container .fancy { + line-height: 0.5; + text-align: center; + margin: 1% 0; } + #root .container.register-component .box-right .bottom-form .btn-container .fancy span, + #root .container.login-component .box-right .bottom-form .btn-container .fancy span { + display: inline-block; + position: relative; } + #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, + #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, + #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before, + #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { + content: ""; + position: absolute; + height: 5px; + border-bottom: 1px solid white; + top: 0; + width: 104px; } + #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, + #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before { + right: 100%; + margin-right: 15px; } + #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, + #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { + left: 100%; + margin-left: 15px; } #root .container.register-component .box-right .bottom-form .btn-container .google-btn, #root .container.login-component .box-right .bottom-form .btn-container .google-btn { width: 100%; @@ -229,6 +257,41 @@ #root .container.register-component .box-right .bottom-form .btn-container .google-btn:active, #root .container.login-component .box-right .bottom-form .btn-container .google-btn:active { background: white; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn { + width: 100%; + height: 50px; + background-color: #3A5A97; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); + margin-top: 2%; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon { + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .btn-text, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .btn-text { + margin: 7% 2% 0 30%; + color: white; + font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:hover, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:hover { + box-shadow: 0 0 6px #4285f4; } + #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:active, + #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:active { + background: white; } #root .container.register-component .box-right .bottomAccount, #root .container.login-component .box-right .bottomAccount { display: flex; @@ -277,9 +340,7 @@ font-size: 10vw; } #root .container.register-component .box-container .box-left .text-container h5, #root .container.login-component .box-container .box-left .text-container h5 { - font-size: 3vw; - font-weight: normal; - padding-top: 2rem; } + font-size: 3vw; } #root .container.register-component .box-container .box-left .image-wrapper, #root .container.login-component .box-container .box-left .image-wrapper { width: 100%; } @@ -294,9 +355,12 @@ padding: 0; max-width: 100%; width: 100%; - color: #505050; } + color: white; } #root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text, #root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text { + margin: 4% 2% 0 38%; } + #root .container.register-component .box-container .box-right .btn-container .fb-btn .btn-text, + #root .container.login-component .box-container .box-right .btn-container .fb-btn .btn-text { margin: 4% 2% 0 38%; } } @media (max-width: 1068px) and (max-width: 600px) { @@ -327,75 +391,36 @@ display: none; } #root .container.register-component .box-container .box-right, #root .container.login-component .box-container .box-right { - display: flex; - flex-direction: column; - justify-content: center; margin: 2%; padding: 0%; - border-radius: 4px; background: #505050; - width: 100%; height: 100%; } #root .container.register-component .box-container .box-right .form, #root .container.login-component .box-container .box-right .form { - justify-content: center; max-width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form, - #root .container.login-component .box-container .box-right .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; } - #root .container.register-component .box-container .box-right .bottom-form .check-box-container, - #root .container.login-component .box-container .box-right .bottom-form .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; } - #root .container.register-component .box-container .box-right .bottom-form .check-box-container p, - #root .container.login-component .box-container .box-right .bottom-form .check-box-container p { - color: black; - white-space: nowrap; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container, - #root .container.login-component .box-container .box-right .bottom-form .btn-container { - width: 100%; - display: flex; - justify-content: center; - padding-bottom: 15px; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { - align-items: center; - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: #00e6bc; - font-size: 14px; - margin-top: 3%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn { - width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { - display: flex; - flex-direction: column; - padding: 2%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; } - #root .container.register-component .box-container .box-right .bottom-form .callingError, - #root .container.login-component .box-container .box-right .bottom-form .callingError { - color: red; - display: flex; - justify-content: center; } } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, + #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { + margin-top: 3%; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:before, + #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:after, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after { + content: ""; + width: 700%; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { + margin: 4% 2% 0 35%; } + #root .container.register-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text, + #root .container.login-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text { + margin: 4% 2% 0 35%; } + #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, + #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { + padding: 2%; } + #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, + #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { + font-size: 9px; } } #root .register.nav, #root .login.nav { font-family: "Work Sans", sans-serif; @@ -426,7 +451,8 @@ #root .signin-title { display: flex; justify-content: flex-start; - margin-top: 2%; } } + margin-top: 2%; + font-size: 20px; } } #root .mainContainer { background: #000A12; padding: 1.1% 1%; diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss index 70d2ac6..34baf42 100644 --- a/src/scss/abstracts/_variables.scss +++ b/src/scss/abstracts/_variables.scss @@ -2,7 +2,7 @@ $turqoise1: hsl(169, 100%, 50%); $turqoise2: hsl(169, 100%, 45%); $turqoise3: hsl(169, 100%, 35%); - +$turqoise: #00B392; $stargold: #ffb400; $gray1: #D8D8D8; diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 9d95cc7..a9ed584 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -65,14 +65,11 @@ height: 550px; .form { - // margin: auto; - // padding: 3% 0; - // max-width: 320px; width: 50%; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; } .form-control { @@ -122,9 +119,37 @@ max-width: 100%; height: 50px; border-radius: 4px; - background: #00e6bc; + background: $turqoise; color: $black; font-size: 14px; + margin-bottom: 2%; + } + + .fancy { + line-height: 0.5; + text-align: center; + margin: 1% 0; + } + .fancy span { + display: inline-block; + position: relative; + } + .fancy span:before, + .fancy span:after { + content: ""; + position: absolute; + height: 5px; + border-bottom: 1px solid white; + top: 0; + width: 104px; + } + .fancy span:before { + right: 100%; + margin-right: 15px; + } + .fancy span:after { + left: 100%; + margin-left: 15px; } //Gogole Sign in btn @@ -145,7 +170,6 @@ background-color: $white; } .google-icon { - // position: absolute; margin-top: 11px; margin-left: 11px; width: 18px; @@ -158,8 +182,44 @@ font-size: 14px; letter-spacing: 0.2px; font-family: "Roboto"; - - + } + &:hover { + box-shadow: 0 0 6px $google-blue; + } + &:active { + background: $white; + } + } + .fb-btn { + width: 100%; + height: 50px; + background-color: #3A5A97; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0,0,0,.25); + margin-top: 2%; + .fb-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; + // background-color: $white; + } + .fb-icon { + // position: absolute; + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; + } + .btn-text { + // float: right; + margin: 7% 2% 0 30%; + color: $white; + font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; } &:hover { box-shadow: 0 0 6px $google-blue; @@ -196,6 +256,7 @@ font-weight: bold; } } + } .callingError { color: red; @@ -220,8 +281,6 @@ } h5 { font-size: 3vw; - font-weight: normal; - padding-top: 2rem; } } .image-wrapper { @@ -237,7 +296,7 @@ padding: 0; max-width: 100%; width: 100%; - color: $black; + color: $white; } .btn-container { .google-btn { @@ -246,6 +305,12 @@ margin: 4% 2% 0 38%; } } + .fb-btn { + .btn-text { + // float: right; + margin: 4% 2% 0 38%; + } + } } } } @@ -275,87 +340,46 @@ } } .box-right { - display: flex; - flex-direction: column; - justify-content: center; margin: 2%; padding: 0%; - border-radius: 4px; + // border-radius: 4px; background: $black; - width: 100%; + // width: 100%; height: 100%; - - - .form { - justify-content: center; max-width: 100% - } - .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; - - .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; - p { - color: black; - white-space: nowrap; - } - } - .btn-container { - width: 100%; - display: flex; - justify-content: center; - // flex-direction: column-reverse; - padding-bottom: 15px; - .signup-btn, button.login-btn { - align-items:center; - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: #00e6bc; - - font-size: 14px; margin-top:3%; } + .fancy span:before, + .fancy span:after { + content: ""; + + width: 700%; + } .google-btn { - width:100%; .btn-text { - // float: right; margin: 4% 2% 0 35%; } } + .fb-btn { + .btn-text { + margin: 4% 2% 0 35%; + } + } } .bottomAccount { - display: flex; - flex-direction: column; padding: 2%; .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; + font-size: 9px; } } - .callingError { - color: red; - display: flex; - justify-content: center; - } } - } } } diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index 838e679..a59c3ce 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -32,6 +32,7 @@ display: flex; justify-content: flex-start; margin-top: 2%; - + font-size: 20px; + // text-decoration: none; } } From ab39f368a3d9fcb6007ce82bdf88333ec88a2922 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 23 Apr 2020 10:22:54 -0700 Subject: [PATCH 500/822] update login and register design --- src/components/auth/Login.js | 16 +++++------ src/components/auth/Register.js | 40 ++++++++++++++++++++++++---- src/css/main.css | 2 +- src/scss/components/_onboarding.scss | 9 ++++++- 4 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index cfbd6f1..b558c8d 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -25,12 +25,7 @@ import { Link } from "react-router-dom"; function Copyright() { return ( - {'Copyright © '} - - GroÔ - {' '} - 2020 - {'.'} + {"© 2020 by GROÁ, All rights reserved"} ); } @@ -177,13 +172,18 @@ const LoginPage = props => {

+
- + {/*
+ +
T e r m s and C o n d i t i on s
+
P r i v a c y
+
*/}
{/* FORM ENDS */}
{/* END OF MAIN CONTENT */} - +
diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 10049aa..cd2a353 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -12,10 +12,25 @@ import * as Yup from "yup"; import Picture3 from "../../img/couch-popcorn.png"; import { TextField, Checkbox, Grid } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; +import Typography from '@material-ui/core/Typography'; +import Box from '@material-ui/core/Box'; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; +function Copyright() { + return ( + + {'Copyright © '} + + GROÁ + {' '} + 2020 + {'.'} + + ); +} + const useStyles = makeStyles((theme) => ({ root: { margin: theme.spacing(1), @@ -26,8 +41,6 @@ const useStyles = makeStyles((theme) => ({ marginBottom: "2%", width: "100%", padding: "0", - // display:'flex', - // justifyContent:'center' }, })); @@ -101,7 +114,7 @@ const Register = (props) => {

{/* FORM STARTS */}
- + {/* */}
{
*/}
+

OR

+
+
+ +
+

Sign up with Google

+
+
+
+ +
+

Sign up with Facebook

+
@@ -195,15 +221,19 @@ const Register = (props) => { data-test={ifDev("loginBtn")} to="/login" > - Already have an account? Login +

Login

+

Already have an account?

- + {/* */} {/* FORM ENDS */}
{" "} {/* PAGE CONTAINER */} + + +
); }; diff --git a/src/css/main.css b/src/css/main.css index e578085..bad9ae2 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -408,7 +408,7 @@ #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before, #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after { content: ""; - width: 700%; } + width: 800%; } #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { margin: 4% 2% 0 35%; } diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index a9ed584..8166ec9 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -263,6 +263,13 @@ display: flex; justify-content: center; } + // .about-us{ + // display: flex; + + // justify-content: space-evenly; + // text-align: center; + // font-size: 14px; + // } } @media (max-width: 1068px) { @@ -359,7 +366,7 @@ .fancy span:after { content: ""; - width: 700%; + width: 800%; } .google-btn { .btn-text { From 0e1f563a96f7500ae97a416c200a44587ac5ef2a Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 23 Apr 2020 13:52:57 -0400 Subject: [PATCH 501/822] fixed styling errors --- src/components/auth/Login.js | 8 ++++---- src/components/auth/Register.js | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index d2b2093..ca1cc96 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -136,15 +136,15 @@ const LoginPage = (props) => {

OR

-
-
- +
+
+ Google icon

Sign in with Google

- + Facebook Icon

Sign in with Facebook

diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1899272..f0da28b 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -10,7 +10,7 @@ import * as Yup from "yup"; // styling imports import Picture3 from "../../img/couch-popcorn.png"; -import { TextField, Grid } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import Typography from '@material-ui/core/Typography'; import Box from '@material-ui/core/Box'; @@ -189,15 +189,15 @@ const Register = (props) => {

OR

-
-
- +
+
+ Google Icon

Sign up with Google

- + Facebook Icon

Sign up with Facebook

From 6e8de42cc12ff35d8f4484ef61951c4f41e2c5f4 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 23 Apr 2020 15:31:06 -0700 Subject: [PATCH 502/822] create search bar that is mobile friendy --- src/components/dashboard/Navigation.js | 125 +++++-- src/css/main.css | 14 +- src/scss/components/_navigation.scss | 83 +++-- src/scss/components/_onboarding.scss | 373 +++++++++++-------- src/scss/components/_onboardingNavLinks.scss | 9 +- 5 files changed, 384 insertions(+), 220 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 3b6a15f..0a9dffa 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -8,18 +8,68 @@ import { } from "../../store/actions"; // import debounce from "../../utils/debounce"; import { - faSearch, + // faSearch, faUserCircle, faAngleDown, faBars, faSync, - faBackspace + // faBackspace } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ifDev } from "../../utils/removeAttribute.js"; import GroaLogo from "../../img/groa-logo-nav.png"; +//for search bar +import { makeStyles, fade } from "@material-ui/core/styles"; +import SearchIcon from "@material-ui/icons/Search"; +import InputBase from "@material-ui/core/InputBase"; + + +const useStyles = makeStyles(theme => ({ + searchContainer: { + width: "46%", + margin: "auto" + }, + search: { + position: "relative", + borderRadius: theme.shape.borderRadius, + backgroundColor: 'white', + "&:hover": { + backgroundColor: '#00B392' + }, + marginTop: 30, + marginLeft: 0, + width: "100%", + [theme.breakpoints.up("sm")]: { + width: "auto" + } + }, + searchIcon: { + width: theme.spacing(7), + height: "100%", + position: "absolute", + pointerEvents: "none", + display: "flex", + alignItems: "center", + justifyContent: "center" + }, + inputRoot: { + color: "inherit" + }, + inputInput: { + padding: theme.spacing(1, 1, 1, 7), + transition: theme.transitions.create("width"), + width: "100%", + [theme.breakpoints.up("md")]: { + width: 200 + } + } +})); + + const Navigation = props => { + const classes = useStyles(); + const [query, setQuery] = useState({ query: "" }); @@ -82,33 +132,6 @@ const Navigation = props => {
- {/* If the path is upload hide the search container */} -
-
- - -
- -
- {/* If the path is recommended show update recommendations button */}
{/* END fa-icons */}
+ {/*
+
+ + +
+ +
*/} +
+
+
+ +
+ +
+
{/* END navContainer */}
); diff --git a/src/css/main.css b/src/css/main.css index bad9ae2..40d12a5 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -454,7 +454,7 @@ margin-top: 2%; font-size: 20px; } } #root .mainContainer { - background: #000A12; + background: #505050; padding: 1.1% 1%; font-family: "Work Sans", sans-serif; } #root .mainContainer .navContainer { @@ -488,7 +488,9 @@ #root .mainContainer .navContainer .Links .NavLink:hover { color: white; } @media only screen and (max-width: 750px) { - #root .mainContainer .navContainer .watchlist, #root .mainContainer .navContainer .recommended, #root .mainContainer .navContainer .explore, + #root .mainContainer .navContainer .watchlist, + #root .mainContainer .navContainer .recommended, + #root .mainContainer .navContainer .explore, #root .mainContainer .navContainer .dropdown-hover .angle-down-icon { flex: .000000001; white-space: pre; @@ -603,10 +605,14 @@ @media (hover: hover) and (pointer: fine) { #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { background-color: #D8D8D8; } } - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { display: none; } @media only screen and (max-width: 750px) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { display: block; } } #root .container.post-login { background: white; diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index 6176e50..eddcd66 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -1,14 +1,17 @@ .mainContainer { - background: #000A12; + background: $black; padding: 1.1% 1%; font-family: $workSans; + .navContainer { display: flex; justify-content: space-evenly; align-items: center; padding-right: 1rem; + .Bars { padding-top: 5px; + .bars-icon { color: white; font-size: 1.4rem; @@ -21,40 +24,49 @@ justify-content: space-evenly; align-items: center; margin: 0 .4rem; - a.active{ + + a.active { border-bottom: 3px solid #00E6BC; } - img{ + + img { height: 2rem; width: auto; } + .Groa-NavLink { &:hover { - color:white; + color: white; } } + .NavLink { color: white; text-decoration: none; margin: 0 1%; transition: all 500ms linear; - + &:hover { - color:white; + color: white; } - } + } } + @media only screen and (max-width: 750px) { - .watchlist, .recommended, .explore, - .dropdown-hover .angle-down-icon{ + + .watchlist, + .recommended, + .explore, + .dropdown-hover .angle-down-icon { flex: .000000001; white-space: pre; padding: 0; font-size: 0; margin: 0; - opacity: 0; + opacity: 0; } } + .searchContainer { background-color: $gray2; padding: .4rem; @@ -65,33 +77,39 @@ overflow: hidden; transition: all 500ms linear; min-width: 20vw; + .search-wrapper { display: flex; align-items: center; width: 75%; } - .search-icon, + + .search-icon, .backspace-icon { color: white; opacity: .4; font-size: 1.2rem; padding: .2rem; } + .backspace-icon { cursor: pointer; } + .searchBox { font-size: 1rem; background-color: $gray2; border: none; color: $white; } - input:focus{ + + input:focus { outline: none; } + input:-webkit-autofill, - input:-webkit-autofill:hover, - input:-webkit-autofill:focus, + input:-webkit-autofill:hover, + input:-webkit-autofill:focus, // input:-webkit-autofill:active { // -webkit-box-shadow: 0 0 0 30px $gray2 inset !important; // } @@ -99,6 +117,7 @@ -webkit-text-fill-color: $white !important; } } + button { white-space: nowrap; font-size: 1rem; @@ -109,25 +128,29 @@ cursor: pointer; transition: all 500ms linear; } - + @media only screen and (max-width: 750px) { .Links { justify-content: space-between; } + button { font-size: 0; padding: .2rem; - background-color: rgba(28,28,28,0); + background-color: rgba(28, 28, 28, 0); border: none; } + .sync-icon { font-size: initial; color: $white; } + .searchContainer { min-width: 35vw; } } + .fa-icons { width: 14%; display: flex; @@ -136,6 +159,7 @@ color: white; } } + button.hidden, .searchContainer.hidden, .hidden { @@ -147,6 +171,7 @@ margin: 0; opacity: 0; } + .dropdown-hover { padding: .25rem .5rem; position: relative; @@ -154,14 +179,17 @@ cursor: pointer; display: flex; align-items: center; + .angle-down-icon { padding-left: .5rem; } + .dropdown-content { display: none; } + &:hover { - .dropdown-content{ + .dropdown-content { display: flex; flex-direction: column; position: absolute; @@ -171,7 +199,7 @@ overflow: hidden; z-index: 5; border: 1px solid $gray1; - + .NavLink { border-top: 1px solid $gray1; color: $black; @@ -181,25 +209,34 @@ background: $white; white-space: nowrap; text-align: center; + &:hover { background-color: $gray1; } + @media(hover: hover) and (pointer: fine) { &:hover { background-color: $gray1; } } } - .watchlist-menu, .recommended-menu, .explore-menu { + + .watchlist-menu, + .recommended-menu, + .explore-menu { display: none; } + @media only screen and (max-width: 750px) { - .watchlist-menu, .recommended-menu, .explore-menu { - display: block; + + .watchlist-menu, + .recommended-menu, + .explore-menu { + display: block; } } } } } - -} + +} \ No newline at end of file diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 8166ec9..5ef9761 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -15,12 +15,14 @@ justify-content: flex-end; padding: 1.1% 1%; } + .box-container { display: flex; justify-content: space-between; margin: 0 auto; width: 85%; } + .box-left { width: 45%; margin: 0 1%; @@ -33,18 +35,22 @@ .text-container { white-space: nowrap; + h1 { font-size: 5vw; } + h5 { font-size: 1.5vw; font-weight: normal; padding-top: 2rem; } } + .image-wrapper { width: 75%; padding: 5% 0; + .logo { width: 100%; } @@ -82,6 +88,7 @@ margin: 2.6% auto; margin-bottom: 1rem; } + input::placeholder { font-size: 1.1rem; color: #d8d8d8; @@ -98,6 +105,7 @@ flex-direction: row; padding-top: 13px; align-items: center; + p { color: black; white-space: nowrap; @@ -124,16 +132,18 @@ font-size: 14px; margin-bottom: 2%; } - + .fancy { line-height: 0.5; text-align: center; margin: 1% 0; } + .fancy span { display: inline-block; - position: relative; + position: relative; } + .fancy span:before, .fancy span:after { content: ""; @@ -143,93 +153,107 @@ top: 0; width: 104px; } + .fancy span:before { right: 100%; margin-right: 15px; } + .fancy span:after { left: 100%; margin-left: 15px; } - - //Gogole Sign in btn - .google-btn { - width: 100%; - height: 50px; - background-color: $white; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0,0,0,.25); - margin-top: 2%; - .google-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; + + //Gogole Sign in btn + .google-btn { + width: 100%; + height: 50px; background-color: $white; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); + margin-top: 2%; + + .google-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; + background-color: $white; + } + + .google-icon { + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; + } + + .btn-text { + // float: right; + margin: 7% 2% 0 30%; + color: $black; + font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; + } + + &:hover { + box-shadow: 0 0 6px $google-blue; + } + + &:active { + background: $white; + } } - .google-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; - } - .btn-text { - // float: right; - margin: 7% 2% 0 30%; - color: $black; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; - } - &:hover { - box-shadow: 0 0 6px $google-blue; - } - &:active { - background: $white; - } - } - .fb-btn { - width: 100%; - height: 50px; - background-color: #3A5A97; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0,0,0,.25); - margin-top: 2%; - .fb-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - // background-color: $white; - } - .fb-icon { - // position: absolute; - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; - } - .btn-text { - // float: right; - margin: 7% 2% 0 30%; - color: $white; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; - } - &:hover { - box-shadow: 0 0 6px $google-blue; - } - &:active { - background: $white; + + .fb-btn { + width: 100%; + height: 50px; + background-color: #3A5A97; + border-radius: 4px; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); + margin-top: 2%; + + .fb-icon-wrapper { + position: absolute; + margin-top: 4px; + margin-left: 1px; + width: 40px; + height: 40px; + border-radius: 2px; + // background-color: $white; + } + + .fb-icon { + // position: absolute; + margin-top: 11px; + margin-left: 11px; + width: 18px; + height: 18px; + } + + .btn-text { + // float: right; + margin: 7% 2% 0 30%; + color: $white; + font-size: 14px; + letter-spacing: 0.2px; + font-family: "Roboto"; + } + + &:hover { + box-shadow: 0 0 6px $google-blue; + } + + &:active { + background: $white; + } } } - } } + .bottomAccount { display: flex; flex-direction: column; @@ -240,32 +264,35 @@ color: #2477e5; font-size: 18px; } + .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - // justify-content: flex-end; - flex-direction: column-reverse; - align-items: center; - color: $white; - - &:hover { - color: $turqoise3; - font-weight: bold; - } + display: flex; + width: 100%; + height: auto; + font-size: 1rem; + text-decoration: none; + // justify-content: flex-end; + flex-direction: column-reverse; + align-items: center; + color: $white; + + &:hover { + color: $turqoise3; + font-weight: bold; } - + } + } + .callingError { color: red; display: flex; justify-content: center; } + // .about-us{ // display: flex; - + // justify-content: space-evenly; // text-align: center; // font-size: 14px; @@ -276,16 +303,19 @@ .box-container { flex-direction: column; align-items: center; + .box-left { width: 80%; margin: 0; padding: 0; + .text-container { margin: 0 auto; width: 100%; h1 { font-size: 10vw; } + h5 { font-size: 3vw; } @@ -294,10 +324,12 @@ width: 100%; } } + .box-right { width: 100%; margin: 0; padding: 0; + .form { margin: 0 auto; padding: 0; @@ -305,90 +337,107 @@ width: 100%; color: $white; } + .btn-container { - .google-btn { - .btn-text { - // float: right; - margin: 4% 2% 0 38%; - } - } - .fb-btn { - .btn-text { - // float: right; - margin: 4% 2% 0 38%; + .google-btn { + .btn-text { + // float: right; + margin: 4% 2% 0 38%; + } + } + + .fb-btn { + .btn-text { + // float: right; + margin: 4% 2% 0 38%; + } + } } } - } } - } - @media (max-width: 600px) { - .box-container { - flex-direction: column; - align-items: center; - .box-left { - width: 80%; - margin: 0; - padding: 0; - .text-container { - margin: 0 auto; - width: 100%; - h1 { - display: none; + + @media (max-width: 600px) { + .box-container { + flex-direction: column; + align-items: center; + + .box-left { + width: 80%; + margin: 0; + padding: 0; + + .text-container { + margin: 0 auto; + width: 100%; + + h1 { + display: none; + } + + h5 { + display: none; + } } - h5 { + + .image-wrapper { display: none; + + .logo { + display: none; + } } } - .image-wrapper { - display: none; - .logo { - display: none; + + .box-right { + margin: 2%; + padding: 0%; + // border-radius: 4px; + background: $black; + // width: 100%; + height: 100%; + + .form { + max-width: 100% } - } - } - .box-right { - margin: 2%; - padding: 0%; - // border-radius: 4px; - background: $black; - // width: 100%; - height: 100%; - .form { - max-width: 100% - } - .bottom-form { - .btn-container { - .signup-btn, - button.login-btn { - margin-top:3%; + + .bottom-form { + .btn-container { + + .signup-btn, + button.login-btn { + margin-top: 3%; + } + + .fancy span:before, + .fancy span:after { + content: ""; + + width: 800%; + } + + .google-btn { + .btn-text { + margin: 4% 2% 0 35%; + } + } + + .fb-btn { + .btn-text { + margin: 4% 2% 0 35%; + } + } } - .fancy span:before, - .fancy span:after { - content: ""; - - width: 800%; - } - .google-btn { - .btn-text { - margin: 4% 2% 0 35%; + + .bottomAccount { + padding: 2%; + + .loginAccount { + font-size: 9px; + } } } - .fb-btn { - .btn-text { - margin: 4% 2% 0 35%; - } - } - } - .bottomAccount { - padding: 2%; - - .loginAccount { - font-size: 9px; - } } } } } - } -} } \ No newline at end of file diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index a59c3ce..ef72bc2 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -6,20 +6,24 @@ align-items: center; width: 100%; text-align: center; + @media (max-width: 600px) { flex-direction: column; } + img { align-items: center; height: 2.5rem; width: auto; } + .signin-title { display: flex; - color:white; + color: white; // align-items: flex-start;; } } + @media (max-width: 600px) { img { // position: absolute; @@ -28,6 +32,7 @@ left: 130px; top: 102px; } + .signin-title { display: flex; justify-content: flex-start; @@ -35,4 +40,4 @@ font-size: 20px; // text-decoration: none; } -} +} \ No newline at end of file From f5f5f54bf9d62b861d3e9a5b457e27b4c8db2d7b Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 24 Apr 2020 10:53:21 -0400 Subject: [PATCH 503/822] login routes to explore page --- src/store/actions/loginAction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 163b4be..6eff633 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -24,7 +24,7 @@ export function loginAction(userCreds, history) { type: FETCHING_WATCHLIST_SUCCESS, payload: res.data.watchlist }); - history.push(`/${res.data.user_id}/recommendations`); + history.push(`/${res.data.user_id}/explore`); }) .catch(err => { console.log("ERROR: ", err); From 5e10f06772c03ac74e7fa05b5b0f5371b752fd18 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 24 Apr 2020 10:53:35 -0400 Subject: [PATCH 504/822] register routes user to explore page --- src/store/actions/registerAction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 20db75c..534b1ce 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -22,7 +22,7 @@ export function registerAction(userCreds, history) { type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); - history.push(`/${res.data.user_id}/recommendations`); + history.push(`/${res.data.user_id}/explore`); }).catch(err => { console.log(err) }); From 433ea514525f5edde09273ceb7f6e116358b9b47 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Mon, 27 Apr 2020 01:21:23 -0700 Subject: [PATCH 505/822] add side navbar and user drop down menu updated --- src/components/dashboard/Navigation.js | 373 ++++++++++++++++--------- src/css/main.css | 15 +- src/img/GROA_logo_mobile.png | Bin 0 -> 4731 bytes src/scss/components/_navigation.scss | 19 +- 4 files changed, 265 insertions(+), 142 deletions(-) create mode 100644 src/img/GROA_logo_mobile.png diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 0a9dffa..eecb469 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -20,15 +20,47 @@ import { ifDev } from "../../utils/removeAttribute.js"; import GroaLogo from "../../img/groa-logo-nav.png"; //for search bar -import { makeStyles, fade } from "@material-ui/core/styles"; +import { makeStyles, fade, useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; +//for the navbar +import clsx from 'clsx'; +// import { makeStyles, useTheme } from '@material-ui/core/styles'; +import Drawer from '@material-ui/core/Drawer'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import AppBar from '@material-ui/core/AppBar'; +import Toolbar from '@material-ui/core/Toolbar'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import Divider from '@material-ui/core/Divider'; +import IconButton from '@material-ui/core/IconButton'; +import MenuIcon from '@material-ui/icons/Menu'; +import ChevronLeftIcon from '@material-ui/icons/ChevronLeft'; +import ChevronRightIcon from '@material-ui/icons/ChevronRight'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import InboxIcon from '@material-ui/icons/MoveToInbox'; +import MailIcon from '@material-ui/icons/Mail'; +//for user toggle menu +import Button from '@material-ui/core/Button'; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import PersonRoundedIcon from '@material-ui/icons/PersonRounded'; + +const drawerWidth = 240; + const useStyles = makeStyles(theme => ({ searchContainer: { - width: "46%", - margin: "auto" + width: "70%", + margin: "0 auto" + }, + [theme.breakpoints.down("xs")]: { + searchContainer:{ + width:"90%", + } }, search: { position: "relative", @@ -63,13 +95,126 @@ const useStyles = makeStyles(theme => ({ [theme.breakpoints.up("md")]: { width: 200 } + }, + //for nav bar + root: { + display: 'flex', + flexDirection:'column' + }, + appBar: { + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + }, + appBarShift: { + width: `calc(100% - ${drawerWidth}px)`, + marginLeft: drawerWidth, + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + }, + menuButton: { + marginRight: theme.spacing(2), + }, + hide: { + display: 'none', + }, + drawer: { + width: drawerWidth, + flexShrink: 0, + }, + drawerPaper: { + width: drawerWidth, + }, + drawerHeader: { + display: 'flex', + alignItems: 'center', + padding: theme.spacing(0, 1), + // necessary for content to be below app bar + ...theme.mixins.toolbar, + justifyContent: 'flex-end', + }, + content: { + flexGrow: 1, + padding: theme.spacing(3), + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + marginLeft: -drawerWidth, + }, + contentShift: { + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + marginLeft: 0, + }, + toolBar:{ + backgroundColor:'#505050' + }, + groaLogo: { + height:'2rem', + width: 'auto', + }, + logoContainer:{ + display:'flex', + flexDirection:'row' + }, + drawerContainer:{ + display:'flex', + flexDirection:'column', } })); const Navigation = props => { - const classes = useStyles(); + //for nav bar + const theme = useTheme(); + const [open, setOpen] = React.useState(false); + // for side bar menu + const linkAttributes = [{ + name: "Upload", + icon: + }, + { + name: "Explore", + icon: + }, + { + name: "Recommended", + icon: + }, + { + name: "Wishlist", + icon: + }, + { + name: "Ratings", + icon: + }]; + + const handleDrawerOpen = () => { + setOpen(true); + }; + const handleDrawerClose = () => { + setOpen(false); + }; + //for user icon menu + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const classes = useStyles(); const [query, setQuery] = useState({ query: "" }); @@ -102,137 +247,50 @@ const Navigation = props => { props.recommendationAction(id); }; - return ( -
-
-
- - -
- -
- Groa Logo - - Recommended - - - +
+ + + + - Watchlist - - - - Explore - -
- - {/* If the path is recommended show update recommendations button */} - - -
- {/* This is the container for the user-icon and the arrow */} -
- - - - - - -
- {/* This is the dropdown menu, links display based on media query */} - - Recommended - - - - Explore - - - - Ratings - - - - Upload data - - - - Watchlist - - - - Log out - -
- {/* END dropdown-content */} -
- {/* END dropdown-hover */} -
- {/* END fa-icons */} -
- {/*
-
- - -
- -
*/} -
+ + +
+ + Groa Logo + + + + + Ratings + Upload + Logout + + +
+ +
@@ -250,8 +308,53 @@ const Navigation = props => { onKeyDown={handleSubmit} />
-
- {/* END navContainer */} + +
+ + + + + +
+ + {theme.direction === 'ltr' ? : } + +
+ + + {linkAttributes.map((linkObject, index) => ( + + {linkObject.icon} + + + ))} + + + {/* + {['All mail', 'Trash', 'Spam'].map((text, index) => ( + + {index % 2 === 0 ? : } + + + ))} + */} +
+
+
+
+
); }; diff --git a/src/css/main.css b/src/css/main.css index 40d12a5..28d07a5 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -462,6 +462,9 @@ justify-content: space-evenly; align-items: center; padding-right: 1rem; } + @media only screen and (max-width: 750px) { + #root .mainContainer .navContainer { + justify-content: space-around; } } #root .mainContainer .navContainer .Bars { padding-top: 5px; } #root .mainContainer .navContainer .Bars .bars-icon { @@ -487,7 +490,7 @@ transition: all 500ms linear; } #root .mainContainer .navContainer .Links .NavLink:hover { color: white; } - @media only screen and (max-width: 750px) { + @media only screen and (max-width: 600px) { #root .mainContainer .navContainer .watchlist, #root .mainContainer .navContainer .recommended, #root .mainContainer .navContainer .explore, @@ -543,7 +546,9 @@ transition: all 500ms linear; } @media only screen and (max-width: 750px) { #root .mainContainer .navContainer .Links { - justify-content: space-between; } + justify-content: space-between; + padding: 0%; + margin-right: 0%; } #root .mainContainer .navContainer button { font-size: 0; padding: .2rem; @@ -605,12 +610,14 @@ @media (hover: hover) and (pointer: fine) { #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { background-color: #D8D8D8; } } - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { + display: none; } #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { display: none; } @media only screen and (max-width: 750px) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu, + #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { + display: none; } #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { display: block; } } diff --git a/src/img/GROA_logo_mobile.png b/src/img/GROA_logo_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..3df132fbc991a88212f439a5e6cf3ca67b884254 GIT binary patch literal 4731 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 literal 0 HcmV?d00001 diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index eddcd66..cee54da 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -8,6 +8,11 @@ justify-content: space-evenly; align-items: center; padding-right: 1rem; + @media only screen and (max-width: 750px) { + + justify-content: space-around; + + } .Bars { padding-top: 5px; @@ -17,6 +22,7 @@ font-size: 1.4rem; } } + .Links { width: 60%; @@ -32,6 +38,7 @@ img { height: 2rem; width: auto; + } .Groa-NavLink { @@ -52,7 +59,7 @@ } } - @media only screen and (max-width: 750px) { + @media only screen and (max-width: 600px) { .watchlist, .recommended, @@ -132,6 +139,8 @@ @media only screen and (max-width: 750px) { .Links { justify-content: space-between; + padding: 0%; + margin-right: 0%; } button { @@ -221,7 +230,9 @@ } } - .watchlist-menu, + .watchlist-menu { + display: none + } .recommended-menu, .explore-menu { display: none; @@ -229,7 +240,9 @@ @media only screen and (max-width: 750px) { - .watchlist-menu, + .watchlist-menu{ + display: none + } .recommended-menu, .explore-menu { display: block; From 53e22c51178e04a5c57f21701ae8ede89107a0f9 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Mon, 27 Apr 2020 01:29:23 -0700 Subject: [PATCH 506/822] update navbar --- src/components/dashboard/Navigation.js | 4 ++-- src/scss/components/_navigation.scss | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index eecb469..5a655dc 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -55,11 +55,11 @@ const drawerWidth = 240; const useStyles = makeStyles(theme => ({ searchContainer: { width: "70%", - margin: "0 auto" + margin: "auto" }, [theme.breakpoints.down("xs")]: { searchContainer:{ - width:"90%", + width:"50%", } }, search: { diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index cee54da..15ba016 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -1,5 +1,5 @@ .mainContainer { - background: $black; + background: $black; padding: 1.1% 1%; font-family: $workSans; @@ -8,11 +8,12 @@ justify-content: space-evenly; align-items: center; padding-right: 1rem; + @media only screen and (max-width: 750px) { - - justify-content: space-around; - - } + + justify-content: space-around; + + } .Bars { padding-top: 5px; @@ -22,7 +23,7 @@ font-size: 1.4rem; } } - + .Links { width: 60%; @@ -38,7 +39,7 @@ img { height: 2rem; width: auto; - + } .Groa-NavLink { @@ -233,6 +234,7 @@ .watchlist-menu { display: none } + .recommended-menu, .explore-menu { display: none; @@ -240,9 +242,10 @@ @media only screen and (max-width: 750px) { - .watchlist-menu{ + .watchlist-menu { display: none } + .recommended-menu, .explore-menu { display: block; From 865871acdd4434521651ff40b18fc3c1e1aeb6f5 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 27 Apr 2020 12:07:15 -0400 Subject: [PATCH 507/822] renamed state name to match DB name --- src/components/dashboard/Explore.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 20cf209..3dbd139 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -32,10 +32,10 @@ function Explore({ {movies .filter( movie => !ratings.includes(film => - film.name === movie.name && film.year === movie.year + film.primary_title === movie.primary_title && film.start_year === movie.start_year ).length && searchTerm !== '' ? - movie.name + movie.primary_title .toString() .toLowerCase() .includes( @@ -48,7 +48,7 @@ function Explore({ .map((movie, index) => { /* Checks if the film is in ratings */ const isRated = film => { - return film.name === movie.name && film.year === movie.year + return film.primary_title === movie.primary_title && film.start_year === movie.start_year } /* Returns the movie object if in ratings */ let rated = ratings.find(isRated) @@ -60,8 +60,8 @@ function Explore({ return ( Date: Mon, 27 Apr 2020 13:50:32 -0400 Subject: [PATCH 508/822] fixed syntax errors --- src/components/auth/Login.js | 85 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index ca1cc96..1db3a60 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -7,9 +7,8 @@ import { ifDev } from "../../utils/removeAttribute.js"; import Picture1 from "../../img/watching-tv.png"; import { TextField } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; -import Typography from '@material-ui/core/Typography'; -import Box from '@material-ui/core/Box'; - +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; // Navbar Login import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; @@ -24,11 +23,11 @@ import { Link } from "react-router-dom"; function Copyright() { return ( - {"© 2020 by GROÁ, All rights reserved"} + {"© 2020 by GROÁ, All rights reserved"} ); } -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ root: { margin: theme.spacing(1), }, @@ -63,7 +62,7 @@ const LoginPage = (props) => { ...user, [e.target.name]: e.target.value, }); - console.log(user) + console.log(user); }; const onSubmit = () => { @@ -135,44 +134,56 @@ const LoginPage = (props) => { Login -

OR

+

+ OR +

-
- Google icon -
-

Sign in with Google

-
-
-
- Facebook Icon -
-

Sign in with Facebook

-
- {/* Sign in with Facebook */} +
+ Google icon +
+

+ Sign in with Google +

+
+
+
+ Facebook Icon +
+

+ Sign in with Facebook +

+
+ {/* Sign in with Facebook */}
- -
-

- -

Sign up

-

Don't have an account?

- - - -

- -
- {/*
+ +
+

+ + + Don't have an account? +
Sign up +
+ +

+
+ {/*
T e r m s and C o n d i t i on s
P r i v a c y
*/} -
{/* FORM ENDS */}
From 0a060efbf0aae27ec7118a1b8733be3130934c47 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 27 Apr 2020 13:50:43 -0400 Subject: [PATCH 509/822] fixed syntax errors --- src/components/auth/Register.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f0da28b..bd8d8d8 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -22,7 +22,7 @@ function Copyright() { return ( {'Copyright © '} - + GROÁ {' '} 2020 @@ -193,13 +193,13 @@ const Register = (props) => {
Google Icon
-

Sign up with Google

+

Sign up with Google

-
+
Facebook Icon
-

Sign up with Facebook

+

Sign up with Facebook

From f740142350c666ff6982aa7278fc4502b3f28b30 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Mon, 27 Apr 2020 11:29:54 -0700 Subject: [PATCH 510/822] update icons on side bar, fix search bar placement --- src/components/dashboard/Navigation.js | 77 +++++++++++++++++--------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 5a655dc..e1507da 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -47,30 +47,39 @@ import MailIcon from '@material-ui/icons/Mail'; import Button from '@material-ui/core/Button'; import Menu from '@material-ui/core/Menu'; import MenuItem from '@material-ui/core/MenuItem'; +//icons import PersonRoundedIcon from '@material-ui/icons/PersonRounded'; +import PublishRoundedIcon from '@material-ui/icons/PublishRounded'; +import SearchRoundedIcon from '@material-ui/icons/SearchRounded'; +import ThumbUpRoundedIcon from '@material-ui/icons/ThumbUpRounded'; +import PlaylistAddCheckRoundedIcon from '@material-ui/icons/PlaylistAddCheckRounded'; +import GradeRoundedIcon from '@material-ui/icons/GradeRounded'; const drawerWidth = 240; const useStyles = makeStyles(theme => ({ searchContainer: { - width: "70%", - margin: "auto" + width: "40%", + margin:'auto', + backgroundColor:'#505050', + }, [theme.breakpoints.down("xs")]: { searchContainer:{ - width:"50%", + width:"80%", } }, search: { + // display:'flex', + // alignItems:'center', position: "relative", borderRadius: theme.shape.borderRadius, - backgroundColor: 'white', + backgroundColor: '#ffffff', "&:hover": { - backgroundColor: '#00B392' + backgroundColor: '#5c5b5b', + color:'#ffffff', }, - marginTop: 30, - marginLeft: 0, width: "100%", [theme.breakpoints.up("sm")]: { width: "auto" @@ -83,10 +92,18 @@ const useStyles = makeStyles(theme => ({ pointerEvents: "none", display: "flex", alignItems: "center", - justifyContent: "center" + justifyContent: "center", + color: '#505050', + "&:hover": { + // backgroundColor: '#5c5b5b', + color:'#D8D8D8', + }, }, inputRoot: { - color: "inherit" + color: "#505050", + "&:hover": { + color:'#ffffff', + }, }, inputInput: { padding: theme.spacing(1, 1, 1, 7), @@ -153,19 +170,22 @@ const useStyles = makeStyles(theme => ({ marginLeft: 0, }, toolBar:{ - backgroundColor:'#505050' + backgroundColor:'#505050', + display:'flex', + justifyContent:'space-between' + }, + appBar:{ + backgroundColor:'#5c5b5b' }, groaLogo: { height:'2rem', width: 'auto', }, - logoContainer:{ - display:'flex', - flexDirection:'row' - }, + drawerContainer:{ display:'flex', flexDirection:'column', + } })); @@ -177,23 +197,23 @@ const Navigation = props => { // for side bar menu const linkAttributes = [{ name: "Upload", - icon: + icon: }, { name: "Explore", - icon: + icon: }, { name: "Recommended", - icon: + icon: }, { name: "Wishlist", - icon: + icon: }, { name: "Ratings", - icon: + icon: }]; const handleDrawerOpen = () => { @@ -252,7 +272,7 @@ const Navigation = props => {
- { > -
Groa Logo @@ -288,9 +307,13 @@ const Navigation = props => { Logout -
-
+ + + + + +
@@ -310,10 +333,8 @@ const Navigation = props => {
- - - + { ))} */} +
{ })} >
+
+
+
); }; From 0a4318589ccb919dc9c7dede5ca6b24d79e79115 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 27 Apr 2020 15:56:30 -0400 Subject: [PATCH 511/822] passed down movie id to movie card --- src/components/dashboard/Explore.js | 121 ++++++++++++++-------------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 3dbd139..ce0ad05 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -7,22 +7,22 @@ import { getMoviesAction, setFilter } from "../../store/actions/index.js"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; -function Explore({ - isFetching, - movies, - userid, - getMoviesAction, - searchTerm, +function Explore({ + isFetching, + movies, + userid, + getMoviesAction, + searchTerm, setFilter, - ratings + ratings, }) { useEffect(() => { - setFilter("") + setFilter(""); // Returns the movies getMoviesAction(userid); }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render - const cardAmount = 25 + const cardAmount = 25; if (isFetching) return ; else @@ -30,58 +30,59 @@ function Explore({
{movies - .filter( movie => - !ratings.includes(film => - film.primary_title === movie.primary_title && film.start_year === movie.start_year - ).length && - searchTerm !== '' ? - movie.primary_title - .toString() - .toLowerCase() - .includes( - searchTerm - .toLowerCase() - ) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = film => { - return film.primary_title === movie.primary_title && film.start_year === movie.start_year - } - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated) - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - - ); - }) - } + return ( + + ); + })} +
-
- ); + ); } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, isFetching: state.movie.isFetching, @@ -89,7 +90,9 @@ const mapStateToProps = state => { moviesError: state.movie.error, searchTerm: state.filter.searchTerm, watchlist: state.watchlist.movies, - ratings: state.rating.movies + ratings: state.rating.movies, }; }; -export default connect(mapStateToProps, { getMoviesAction, setFilter })(Explore); +export default connect(mapStateToProps, { getMoviesAction, setFilter })( + Explore +); From 3d32432d5bc21f85c17df731fbd2b808c7bf28a3 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 27 Apr 2020 15:56:58 -0400 Subject: [PATCH 512/822] fixed rating star system with what backend needs --- src/components/movies/MovieCard.js | 82 +++++++++++++++++------------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 9048e68..ac30a7c 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -2,45 +2,61 @@ import React, { useState } from "react"; import { connect } from "react-redux"; import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; -import StarBorderIcon from '@material-ui/icons/StarBorder'; +import StarBorderIcon from "@material-ui/icons/StarBorder"; // more fields will be appearing according to the Figma file -function MovieCard({ userid, name, year, image, ratingAction, watchlist, addToWatchlistAction, rated, ratings }) { - const [yourRating, setYourRating] = useState(false) +function MovieCard({ + userid, + name, + year, + image, + movie_id, + ratingAction, + watchlist, + addToWatchlistAction, + rated, + ratings, +}) { + const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); /* Used for dynamically rendering the "Add to watchlist" button and if it's disabled */ - const [added, setAdded] = useState(false) + const [added, setAdded] = useState(false); /* This checks if the movie is in the watchlist */ - const inWatchlist = watchlist.some(movie => movie.name === name && movie.year === year) - const inRatings = ratings.some(movie => movie.name === name && movie.year === year) - + const inWatchlist = watchlist.some( + (movie) => movie.name === name && movie.year === year + ); + const inRatings = ratings.some( + (movie) => movie.name === name && movie.year === year + ); + /* Used to format the movie object for action calls */ let movie = { + movie_id: movie_id, name: name, year: year, - } + }; const handleChange = (event, newValue) => { /* Sets rating for the star value */ setRating(newValue); /* Sets rating for the POST request */ const newRating = { - ...movie, rating: newValue - } - ratingAction(userid, newRating) - setYourRating(true) - } + movie_id: movie.movie_id, + rating: newValue, + }; + ratingAction(userid, newRating); + setYourRating(true); + }; const handleClick = () => { /* Adds movie to the POST request */ - addToWatchlistAction(userid, movie) - setAdded(true) - } + addToWatchlistAction(userid, movie); + setAdded(true); + }; return (
-
Random Movie poster as a placeholder. @@ -48,43 +64,39 @@ function MovieCard({ userid, name, year, image, ratingAction, watchlist, addToWa

{name}

{year}

-
+
- - + } name={name} - value={ rated ? rated : rating } + value={rated ? rated : rating} onChange={handleChange} />
-
); } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, ratingError: state.rating.error, @@ -93,4 +105,6 @@ const mapStateToProps = state => { ratings: state.rating.movies, }; }; -export default connect(mapStateToProps, { ratingAction, addToWatchlistAction })(MovieCard); \ No newline at end of file +export default connect(mapStateToProps, { ratingAction, addToWatchlistAction })( + MovieCard +); From 5bb488983e804a3f5f878af84cee7e0275379ad3 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Mon, 27 Apr 2020 18:55:55 -0400 Subject: [PATCH 513/822] Updated PR format Putting descriptive tags to clean up the PR template as well as creating a section for staging environment links. --- pull_request_template.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pull_request_template.md b/pull_request_template.md index 64b0457..8322be4 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -1,9 +1,11 @@ -# Description +# Staging Env [TRY ME](#add your staged deployment link here) -Fixes # (issue) <-- this is for issue numbers from GitHub, -if squashing a bug from Trello, please add a link to that card here instead +# Description + + +Fixes # (issue) Please add a list of what someone reviewing the PR should be expecting from this PR. @@ -15,8 +17,7 @@ This will include the ## Type of change -Please delete options that are not relevant. - + - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) @@ -24,17 +25,20 @@ Please delete options that are not relevant. ## Change Status + - [ ] Complete, tested, ready to review and merge - [ ] Complete, but not tested (may need new tests) - [ ] Incomplete/work-in-progress, PR is for discussion/feedback # How Has This Been Tested? -- [ ] Test A -- [ ] Test B + +- [ ] +- [ ] # Checklist + - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] My code has been reviewed by at least one peer From 873e7fc59c6e41442689a2c8b8db9e3031f99e27 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 27 Apr 2020 19:44:20 -0400 Subject: [PATCH 514/822] fixes routes on the navigation --- src/components/dashboard/Navigation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index e1507da..5477e35 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -204,11 +204,11 @@ const Navigation = props => { icon: }, { - name: "Recommended", + name: "Recommendations", icon: }, { - name: "Wishlist", + name: "Watchlist", icon: }, { From 4e2c73c6b5ac099ef6b4349dceef289de3d3c78d Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 12:00:40 -0400 Subject: [PATCH 515/822] fix ratings state name --- src/components/dashboard/Ratings.js | 83 +++++++++++++++-------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 310dfa0..eb33102 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -7,17 +7,16 @@ import { getRatingAction, setFilter } from "../../store/actions/index.js"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; -function Ratings({ - userid, +function Ratings({ + userid, isFetching, getRatingAction, - ratings, + ratings, searchTerm, - setFilter + setFilter, }) { - useEffect(() => { - setFilter("") + setFilter(""); // Returns the ratings getRatingAction(userid); }, [getRatingAction, userid, setFilter]); @@ -26,51 +25,53 @@ function Ratings({ return (
- {ratings.filter(movie => - searchTerm !== '' ? - movie.name - .toString() - .toLowerCase() - .includes( - searchTerm - .toLowerCase() - ) : true - ).map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + {ratings + .filter((movie) => + searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - - ); - })} + return ( + + ); + })}
); } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, isFetching: state.rating.isFetching, ratings: state.rating.movies, ratingsError: state.rating.error, - searchTerm: state.filter.searchTerm + searchTerm: state.filter.searchTerm, }; }; -export default connect(mapStateToProps, { getRatingAction, setFilter })(Ratings); +export default connect(mapStateToProps, { getRatingAction, setFilter })( + Ratings +); From 7a2f466aa3b971f3de97401fe4126cccc5759394 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 12:01:07 -0400 Subject: [PATCH 516/822] fixed watchlist state naming --- src/components/dashboard/Watchlist.js | 84 ++++++++++++++------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 4afd677..6579a17 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -2,7 +2,11 @@ import React, { useState, useEffect } from "react"; // tools import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; -import { removeFromWatchlistAction, getWatchlistAction, setFilter } from "../../store/actions/index.js"; +import { + removeFromWatchlistAction, + getWatchlistAction, + setFilter, +} from "../../store/actions/index.js"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; @@ -14,20 +18,20 @@ function Watchlist({ watchlist, watchlistError, getWatchlistAction, - searchTerm, + searchTerm, removeFromWatchlistAction, - setFilter + setFilter, }) { - const [deleteMode, setDeleteMode] = useState(false) + const [deleteMode, setDeleteMode] = useState(false); useEffect(() => { - setFilter("") + setFilter(""); // Returns the users watchlist from the database getWatchlistAction(userid); - }, [ getWatchlistAction, userid, isDeleting, setFilter ]); + }, [getWatchlistAction, userid, isDeleting, setFilter]); function handleClick(id) { - removeFromWatchlistAction(userid ,id) + removeFromWatchlistAction(userid, id); } if (isFetching) return ; @@ -39,29 +43,30 @@ function Watchlist({ data-test={ifDev("watchlist-component")} >
- {watchlist.filter(movie => - searchTerm !== '' ? - movie.name - .toString() - .toLowerCase() - .includes( - searchTerm - .toLowerCase() - ) : true - ).map((movie, index) => { + {watchlist + .filter((movie) => + searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
setDeleteMode(!deleteMode)} +
setDeleteMode(!deleteMode)} > - {deleteMode &&} -
+ {deleteMode && ( + + )} +
); - })} + })}
); } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, isFetching: state.watchlist.isFetching, isDeleting: state.watchlist.isDeleting, watchlist: state.watchlist.movies, watchlistError: state.watchlist.error, - searchTerm: state.filter.searchTerm + searchTerm: state.filter.searchTerm, }; }; -export default connect(mapStateToProps, { - getWatchlistAction, - removeFromWatchlistAction, - setFilter -})( - Watchlist -); +export default connect(mapStateToProps, { + getWatchlistAction, + removeFromWatchlistAction, + setFilter, +})(Watchlist); From d94f73bc7581cb8a9a325a5cdb16b85e64cd750f Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 13:49:43 -0400 Subject: [PATCH 517/822] removed recommended as it is no longer used --- src/store/actions/index.js | 3 +- src/store/actions/recommendationActions.js | 53 ++++++--------------- src/store/reducers/recommendationReducer.js | 34 ++----------- 3 files changed, 19 insertions(+), 71 deletions(-) diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 74bb0ff..3a8cd95 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -1,7 +1,7 @@ import { loginAction } from "./loginAction.js"; import { ratingAction, getRatingAction } from "./ratingAction.js"; import { registerAction } from "./registerAction.js"; -import { recommendationAction, recommendedAction } from "./recommendationActions.js"; +import { recommendationAction } from "./recommendationActions.js"; import { uploadAction, toggleIsUploaded } from "./uploadAction.js"; import { addToWatchlistAction, @@ -17,7 +17,6 @@ export { ratingAction, registerAction, recommendationAction, - recommendedAction, uploadAction, toggleIsUploaded, getRatingAction, diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index 7cf5b87..7e51998 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -1,56 +1,31 @@ import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const FETCHING_RECOMMENDATIONS_START = "FETCHING_RECOMMENDATIONS_START"; -export const FETCHING_RECOMMENDATIONS_SUCCESS = "FETCHING_RECOMMENDATIONS_SUCCESS"; +export const FETCHING_RECOMMENDATIONS_SUCCESS = + "FETCHING_RECOMMENDATIONS_SUCCESS"; export const FETCHING_RECOMMENDATIONS_FAIL = "FETCHING_RECOMMENDATIONS_FAIL"; -export const FETCHING_RECOMMENDED_START = "FETCHING_RECOMMENDED_START"; -export const FETCHING_RECOMMENDED_SUCCESS = "FETCHING_RECOMMENDED_SUCCESS"; -export const FETCHING_RECOMMENDED_FAIL = "FETCHING_RECOMMENDED_FAIL"; // RECOMMENDATIONS // this call requests new recommendations be inserted into the database, then returns latest export function recommendationAction(id) { - return dispatch => { + return (dispatch) => { dispatch({ - type: FETCHING_RECOMMENDATIONS_START + type: FETCHING_RECOMMENDATIONS_START, }); axiosWithAuth() - .get(`/${id}/recommendations`) - .then(res => { + .get(`/${id}/recommendations`) + .then((res) => { + console.log(res); dispatch({ - type: FETCHING_RECOMMENDATIONS_SUCCESS, - payload: res.data.data - }) - }) - .catch(err => { - console.log("ERROR: ", err); - dispatch({ - type: FETCHING_RECOMMENDATIONS_FAIL, - payload: err + type: FETCHING_RECOMMENDATIONS_SUCCESS, + payload: res, }); - }); - }; -} -// RECOMMENDED -// this call retrieves the latest recommendations in the database -export function recommendedAction(id) { - return dispatch => { - dispatch({ - type: FETCHING_RECOMMENDED_START - }); - axiosWithAuth() - .get(`/${id}/recommended`) - .then(res => { - dispatch({ - type: FETCHING_RECOMMENDED_SUCCESS, - payload: res.data.recommendation_json - }) - }) - .catch(err => { + }) + .catch((err) => { console.log("ERROR: ", err); dispatch({ - type: FETCHING_RECOMMENDED_FAIL, - payload: err + type: FETCHING_RECOMMENDATIONS_FAIL, + payload: err, }); - }); + }); }; } \ No newline at end of file diff --git a/src/store/reducers/recommendationReducer.js b/src/store/reducers/recommendationReducer.js index 4a7e9cf..1995cc7 100644 --- a/src/store/reducers/recommendationReducer.js +++ b/src/store/reducers/recommendationReducer.js @@ -2,15 +2,12 @@ import { FETCHING_RECOMMENDATIONS_START, FETCHING_RECOMMENDATIONS_SUCCESS, FETCHING_RECOMMENDATIONS_FAIL, - FETCHING_RECOMMENDED_START, - FETCHING_RECOMMENDED_SUCCESS, - FETCHING_RECOMMENDED_FAIL } from "../actions/recommendationActions"; const initialState = { isFetching: false, movies: [], - error: "" + error: "", }; export const recommendations = (state = initialState, action) => { @@ -18,14 +15,14 @@ export const recommendations = (state = initialState, action) => { case FETCHING_RECOMMENDATIONS_START: return { ...state, - isFetching: true + isFetching: true, }; //RECOMMENDATIONS SUCCESS case FETCHING_RECOMMENDATIONS_SUCCESS: return { ...state, isFetching: false, - movies: action.payload + movies: action.payload, }; //RECOMMENDATIONS FAIL @@ -33,31 +30,8 @@ export const recommendations = (state = initialState, action) => { return { ...state, isFetching: false, - error: action.payload + error: action.payload, }; - - // --------- RECOMMENDED ----------- - case FETCHING_RECOMMENDED_START: - return { - ...state, - isFetching: true - }; - //RECOMMENDED SUCCESS - case FETCHING_RECOMMENDED_SUCCESS: - return { - ...state, - isFetching: false, - movies: action.payload - }; - - //RECOMMENDED FAIL - case FETCHING_RECOMMENDED_FAIL: - return { - ...state, - isFetching: false, - error: action.payload - }; - default: return state; } From 92373e7870389de27f43130cf79153811e54c9ae Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 14:15:35 -0400 Subject: [PATCH 518/822] adds recommendation action to explore page --- src/components/dashboard/Explore.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index ce0ad05..f3478de 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -2,7 +2,11 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; -import { getMoviesAction, setFilter } from "../../store/actions/index.js"; +import { + getMoviesAction, + setFilter, + recommendationAction, +} from "../../store/actions/index.js"; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; @@ -11,6 +15,7 @@ function Explore({ isFetching, movies, userid, + recommendationAction, getMoviesAction, searchTerm, setFilter, @@ -20,7 +25,8 @@ function Explore({ setFilter(""); // Returns the movies getMoviesAction(userid); - }, [getMoviesAction, userid, ratings, setFilter]); + recommendationAction(userid); + }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); // How many movies render const cardAmount = 25; @@ -93,6 +99,8 @@ const mapStateToProps = (state) => { ratings: state.rating.movies, }; }; -export default connect(mapStateToProps, { getMoviesAction, setFilter })( - Explore -); +export default connect(mapStateToProps, { + getMoviesAction, + recommendationAction, + setFilter, +})(Explore); From 3517384ccb28cebae86769feb4957de8245bf7e5 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 14:16:01 -0400 Subject: [PATCH 519/822] removed recommended action that is not used --- src/components/dashboard/Recommendations.js | 95 ++++++++++----------- 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index b1e8021..faeb065 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -3,10 +3,9 @@ import React, { useEffect } from "react"; import { connect } from "react-redux"; import { ifDev } from "../../utils/removeAttribute.js"; import { - recommendedAction, recommendationAction, toggleIsUploaded, - setFilter + setFilter, } from "../../store/actions/index.js"; // children components import LoadingScreen from "../layout/LoadingScreen.js"; @@ -16,23 +15,20 @@ function Recommendations({ isFetching, recommendations, userid, - recommendedAction, recommendationAction, - searchTerm, + searchTerm, isUploaded, - setFilter + setFilter, }) { useEffect(() => { - setFilter("") - // returns initial recommendations after uploading a file + setFilter(""); if (isUploaded === true) { recommendationAction(userid); toggleIsUploaded(); } + recommendationAction(userid); // Returns the most recent recommendations from the database - recommendedAction(userid); - - }, [ recommendedAction, userid, isUploaded, recommendationAction, setFilter ]); + }, [userid, isUploaded, recommendationAction, setFilter]); if (isFetching) return ; else @@ -43,62 +39,57 @@ function Recommendations({ >
{recommendations - .filter( movie => - searchTerm !== '' ? - movie.Title - .toString() - .toLowerCase() - .includes( - searchTerm - .toLowerCase() - ) - : true - ) - .map((movie, index) => { - let posterURI = movie["Poster URL"]; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = - `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + .filter((movie) => + searchTerm !== "" + ? movie.title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - - ); - }) - } + return ( + + ); + })} +
-
- ); + ); } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, isFetching: state.recommendations.isFetching, recommendations: state.recommendations.movies, recommendationsError: state.recommendations.error, searchTerm: state.filter.searchTerm, - isUploaded: state.upload.isUploaded + isUploaded: state.upload.isUploaded, }; }; export default connect(mapStateToProps, { - recommendedAction, recommendationAction, toggleIsUploaded, - setFilter + setFilter, })(Recommendations); From ea6bb0d9035772869155bc5951cc8635434cf8e8 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 14:17:33 -0400 Subject: [PATCH 520/822] calls correct payload from recommendation api --- src/store/actions/recommendationActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index 7e51998..3dfe217 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -17,7 +17,7 @@ export function recommendationAction(id) { console.log(res); dispatch({ type: FETCHING_RECOMMENDATIONS_SUCCESS, - payload: res, + payload: res.data, }); }) .catch((err) => { From 862b0bbc27c9fbd9772acad68faef8225a230641 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 28 Apr 2020 14:25:53 -0400 Subject: [PATCH 521/822] add comment on explore page for recommendation action --- src/components/dashboard/Explore.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index f3478de..1fa7e9f 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -25,6 +25,7 @@ function Explore({ setFilter(""); // Returns the movies getMoviesAction(userid); + // returns a list of recommendations to start the recommendations page recommendationAction(userid); }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); // How many movies render From 7725df4e31f11373042b2eeb1a916b6132205835 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 28 Apr 2020 12:19:40 -0700 Subject: [PATCH 522/822] add id to each linkAttribute --- src/components/dashboard/Navigation.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 5477e35..49a227a 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -196,22 +196,27 @@ const Navigation = props => { const [open, setOpen] = React.useState(false); // for side bar menu const linkAttributes = [{ + id:0, name: "Upload", icon: }, { + id:1, name: "Explore", icon: }, { + id:2, name: "Recommendations", icon: }, { + id:3, name: "Watchlist", icon: }, { + id:4, name: "Ratings", icon: }]; @@ -352,7 +357,7 @@ const Navigation = props => { {linkAttributes.map((linkObject, index) => ( - + {linkObject.icon} From 57e0e3f45269584b2bc0b4b7407d223cec849b4e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 28 Apr 2020 22:33:14 -0700 Subject: [PATCH 523/822] update movie cards and watchlist has movies centered --- src/components/dashboard/Watchlist.js | 44 ++++++--- src/components/movies/MovieCard.js | 114 +++++++++++++++++++----- src/css/main.css | 49 ---------- src/scss/components/_ratings.scss | 21 ++++- src/scss/components/_watchlist.scss | 123 +++++++++++++------------- 5 files changed, 205 insertions(+), 146 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6579a17..4e14b21 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -11,6 +11,20 @@ import { import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; +//for grid +import CssBaseline from '@material-ui/core/CssBaseline'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; +import Container from '@material-ui/core/Container'; + + +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(8), + paddingBottom: theme.spacing(8), + }, + +})); function Watchlist({ userid, isFetching, @@ -23,7 +37,7 @@ function Watchlist({ setFilter, }) { const [deleteMode, setDeleteMode] = useState(false); - + const classes = useStyles(); useEffect(() => { setFilter(""); // Returns the users watchlist from the database @@ -38,11 +52,17 @@ function Watchlist({ else if (isDeleting) return ; else return ( -
-
+ + //
+ <> + {/* */} + {/* */} + + {/*
*/} + {watchlist .filter((movie) => searchTerm !== "" @@ -60,9 +80,10 @@ function Watchlist({ return (
setDeleteMode(!deleteMode)} > + {deleteMode && (
); })} -
-
+ + {/*
*/} + + {/* */} + ); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ac30a7c..f8eb931 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -3,6 +3,59 @@ import { connect } from "react-redux"; import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; +//for grid +import CssBaseline from '@material-ui/core/CssBaseline'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; + +import Container from '@material-ui/core/Container'; +import Link from '@material-ui/core/Link'; +import AppBar from '@material-ui/core/AppBar'; +import Button from '@material-ui/core/Button'; +import CameraIcon from '@material-ui/icons/PhotoCamera'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import CardMedia from '@material-ui/core/CardMedia'; +import Toolbar from '@material-ui/core/Toolbar'; +import Typography from '@material-ui/core/Typography'; + +const useStyles = makeStyles((theme) => ({ + // icon: { + // marginRight: theme.spacing(2), + // }, + // heroContent: { + // backgroundColor: theme.palette.background.paper, + // padding: theme.spacing(8, 0, 6), + // }, + // heroButtons: { + // marginTop: theme.spacing(4), + // }, + cardGrid: { + paddingTop: theme.spacing(8), + paddingBottom: theme.spacing(8), + // justify:'center', + }, + card: { + height: '100%', + display: 'flex', + flexDirection: 'column', + }, + // cardMedia: { + // paddingTop: '56.25%', + // }, + cardContent: { + flexGrow: 1, + }, + +// name:{ +// width: '100%' +// }, + cardActions:{ +display:'flex', +// flexDirection:'column' + }, +})); // more fields will be appearing according to the Figma file function MovieCard({ @@ -29,6 +82,7 @@ function MovieCard({ const inRatings = ratings.some( (movie) => movie.name === name && movie.year === year ); + const classes = useStyles(); /* Used to format the movie object for action calls */ let movie = { @@ -56,31 +110,41 @@ function MovieCard({ }; return ( -
-
-
- Random Movie poster as a placeholder. -
-
-

{name}

-

{year}

-
-
-
+ + + + {/* End hero unit */} + + + {/* */} + + + Random Movie poster as a placeholder. -
- - + + + + -
-
+ /> + + + {/* */} + + + ); } const mapStateToProps = (state) => { diff --git a/src/css/main.css b/src/css/main.css index 28d07a5..2d53fa6 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -990,55 +990,6 @@ font-size: 1.5vw; } #root .container.recommendations .movie-cards .box .action-panel .watchlist-button:hover { text-decoration: underline; } - #root .watchlist-container { - font-family: "Work Sans", sans-serif; - background: #505050; - display: flex; - flex-direction: column; - min-height: 100vh; } - #root .watchlist-container .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; } - #root .watchlist-container .movie-cards .movie-card-container { - position: relative; - margin: 2% auto; } - #root .watchlist-container .movie-cards .movie-card-container .box { - border-radius: 5px; - overflow: hidden; - width: 100%; - display: flex; - flex-direction: column; } - #root .watchlist-container .movie-cards .movie-card-container .box .top-content { - display: flex; } - #root .watchlist-container .movie-cards .movie-card-container .box img { - width: 20vw; - height: 33.33vw; } - @media screen and (max-width: 500px) { - #root .watchlist-container .movie-cards .movie-card-container .box img { - width: 50vw; - height: 83.33vw; } } - #root .watchlist-container .movie-cards .movie-card-container .box .text-container { - display: none; } - #root .watchlist-container .movie-cards .movie-card-container .box .action-panel { - display: none; } - #root .watchlist-container .movie-cards .movie-card-container .delete-button { - position: absolute; - right: 1vw; - top: 2vw; - border-radius: 100%; - height: 2vw; - width: 2vw; - padding: 0; - cursor: pointer; - outline: inherit; - white-space: nowrap; - font-size: 1vw; - background-color: #21242C; - color: white; - font-weight: bold; } #root .container.loading-screen { background: #000A12; display: flex; diff --git a/src/scss/components/_ratings.scss b/src/scss/components/_ratings.scss index 4b2eed0..f5d4f6f 100644 --- a/src/scss/components/_ratings.scss +++ b/src/scss/components/_ratings.scss @@ -4,6 +4,7 @@ display: flex; flex-direction: column; min-height: 100vh; + .movie-cards { width: 75%; margin: 3% auto; @@ -11,23 +12,27 @@ flex-direction: row; flex-wrap: wrap; justify-content: space-evenly; + .box { border-radius: 5px; overflow: hidden; width: 30vw; height: 30vw; max-width: 33%; - margin: 2.5% ; + margin: 2.5%; display: flex; flex-direction: column; + .top-content { display: flex; position: relative; + .aspect-ratio-wrapper { padding-bottom: 80%; position: relative; width: 60%; overflow: hidden; + img { height: 100%; position: absolute; @@ -35,18 +40,21 @@ object-fit: cover; } } + .text-container { color: black; background-color: $white; width: 45%; padding: 2.5%; font-size: 1.5vw; + p { padding: .5rem 0; } } } - .action-panel { + + .action-panel { display: flex; flex-direction: column; align-items: flex-end; @@ -54,17 +62,21 @@ width: 100%; padding: 1vw 0; background-color: $gray2; + >* { width: 50%; text-align: left; margin: 1vw; } - p{ + + p { color: $turqoise2; } - .stars{ + + .stars { font-size: 2.5vw; } + .watchlist-button { background-color: inherit; color: inherit; @@ -75,6 +87,7 @@ outline: inherit; color: $turqoise2; font-size: 1.5vw; + &:hover { text-decoration: underline; } diff --git a/src/scss/components/_watchlist.scss b/src/scss/components/_watchlist.scss index 89de4e5..d6c6bf7 100644 --- a/src/scss/components/_watchlist.scss +++ b/src/scss/components/_watchlist.scss @@ -1,61 +1,64 @@ -.watchlist-container { - font-family: $workSans; - background:$black; - display: flex; - flex-direction: column; - min-height: 100vh; - .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - .movie-card-container { - position: relative; - margin: 2% auto; - .box { - border-radius: 5px; - overflow: hidden; - width: 100%; - display: flex; - flex-direction: column; - .top-content { - display: flex; - } - img { - width: 20vw; - height: 33.33vw; - } - @media screen and (max-width: 500px) { - img { - width: 50vw; - height: 83.33vw; - } - } - .text-container { - display: none; - } - .action-panel { - display: none; - } - } - .delete-button { - position: absolute; - right: 1vw; - top: 2vw; - border-radius: 100%; - height: 2vw; - width: 2vw; - padding: 0; - cursor: pointer; - outline: inherit; - white-space: nowrap; - font-size: 1vw; - background-color: $gray2; - color: $white; - font-weight: bold; - } - } - } -} +// .watchlist-container { +// font-family: $workSans; +// background:$black; +// display: flex; +// flex-direction: column; +// min-height: 100vh; +// .movie-cards { +// width: 20%; +// margin: 0% auto; +// display: flex; +// flex-direction: row; +// flex-wrap: wrap; +// .movie-card-container { +// position: relative; +// margin: 0 auto; +// width: 30%; +// .box { +// border-radius: 5px; +// overflow: hidden; +// width: 100%; +// display: flex; +// flex-direction: column; + +// img { +// width: 20vw; +// height: 33.33vw; +// } +// .text-container { +// display: flex; +// flex-direction: column; +// } +// @media screen and (max-width: 600px) { +// img { +// width: 50vw; +// height: 83.33vw; +// } +// } +// .text-container { +// display: none; +// } +// .action-panel { +// display: none; +// } +// } +// .delete-button { +// position: absolute; +// right: 1vw; +// top: 2vw; +// border-radius: 100%; +// height: 2vw; +// width: 2vw; +// padding: 0; +// cursor: pointer; +// outline: inherit; +// white-space: nowrap; +// font-size: 1vw; +// background-color: $gray2; +// color: $white; +// font-weight: bold; +// } +// } +// } +// } \ No newline at end of file From 5c0a990218d043f381d6892bdc79b2638f983162 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 29 Apr 2020 07:56:39 -0700 Subject: [PATCH 524/822] start on opacity of movie descriptions when hover --- src/components/movies/MovieCard.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index f8eb931..ad6eb93 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -34,7 +34,7 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(8), paddingBottom: theme.spacing(8), - // justify:'center', + justify:'center', }, card: { height: '100%', @@ -55,6 +55,22 @@ const useStyles = makeStyles((theme) => ({ display:'flex', // flexDirection:'column' }, + stars:{ + fontSize: '2.5vw', + }, + middle:{ + transition:'.5s ease', + opacity: 0, + position: 'absolute', + top: '50%', + left:' 50%', + transform: 'translate(-50%, -50%)', + // -msTransform:' translate(-50%, -50%)', + textAlign: 'center', + }, + opacityBox:{ + + }, })); // more fields will be appearing according to the Figma file @@ -131,6 +147,11 @@ function MovieCard({ {year} +
+ + Hello there + +
From b249e5f8c035d50ceec74b03e0536ef185c73262 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 29 Apr 2020 10:58:22 -0700 Subject: [PATCH 526/822] updating moviecards in mobile --- src/components/dashboard/Watchlist.js | 4 ++- src/components/movies/MovieCard.js | 35 ++++++++++++++++----------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 4e14b21..e463875 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -60,9 +60,10 @@ function Watchlist({ <> {/* */} {/* */} - + {/*
*/} + {watchlist .filter((movie) => searchTerm !== "" @@ -112,6 +113,7 @@ function Watchlist({ {/*
*/}
+
{/*
*/} ); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ad6eb93..5c18a05 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -34,12 +34,16 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(8), paddingBottom: theme.spacing(8), - justify:'center', + paddingLeft: theme.spacing(8), + paddingRight: theme.spacing(8), + width: "100%" + // justify:'center', }, card: { - height: '100%', + // height: '50%', display: 'flex', flexDirection: 'column', + width:'100%', }, // cardMedia: { // paddingTop: '56.25%', @@ -59,7 +63,7 @@ display:'flex', fontSize: '2.5vw', }, middle:{ - transition:'.5s ease', + transition:' .5s ease', opacity: 0, position: 'absolute', top: '50%', @@ -71,6 +75,9 @@ display:'flex', opacityBox:{ }, + movieImg:{ + width:'100%', + }, })); // more fields will be appearing according to the Figma file @@ -128,16 +135,16 @@ function MovieCard({ return ( - +
{/* End hero unit */} - + {/* */} {/* */} - Random Movie poster as a placeholder. + Random Movie poster as a placeholder. @@ -155,12 +162,12 @@ function MovieCard({ @@ -182,8 +189,8 @@ function MovieCard({ {/* */} - - + {/* */} +
); } const mapStateToProps = (state) => { From 88152ef77adcf304bb0b98beea6f3087fdf89098 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 29 Apr 2020 12:27:54 -0700 Subject: [PATCH 527/822] edit image size on mobile device --- src/components/dashboard/Watchlist.js | 11 +- src/components/movies/MovieCard.js | 4 +- src/css/main.css | 100 ++++++++-------- src/scss/components/_congratulations.scss | 102 ++++++++-------- src/scss/components/_navigation.scss | 1 - src/scss/components/_onboardingNavLinks.scss | 12 +- src/scss/components/_recommendations.scss | 12 +- src/scss/components/_watchlist.scss | 120 +++++++++---------- 8 files changed, 176 insertions(+), 186 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index e463875..1a8ce53 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -63,7 +63,7 @@ function Watchlist({ {/*
*/} - + {/* */} {watchlist .filter((movie) => searchTerm !== "" @@ -84,7 +84,7 @@ function Watchlist({ onClick={() => setDeleteMode(!deleteMode)} > - + - {deleteMode && ( + {/* {deleteMode && ( - )} + )} */}
); })} {/*
*/} - + {/* */} {/* */} diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 5c18a05..dec49fa 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -34,8 +34,8 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(8), paddingBottom: theme.spacing(8), - paddingLeft: theme.spacing(8), - paddingRight: theme.spacing(8), + // paddingLeft: theme.spacing(8), + // paddingRight: theme.spacing(8), width: "100%" // justify:'center', }, diff --git a/src/css/main.css b/src/css/main.css index 2d53fa6..cc0f8f2 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -443,11 +443,6 @@ display: flex; color: white; } @media (max-width: 600px) { - #root img { - width: 136px; - height: 38px; - left: 130px; - top: 102px; } #root .signin-title { display: flex; justify-content: flex-start; @@ -878,49 +873,6 @@ #root .textholder2 { width: 80%; margin: 6.6% auto; } } - #root .CongratsPage { - border: 2px solid #000A12; - background: #000A12; - height: 100vh; - font-family: "Work Sans", sans-serif; } - #root .CongratsPage .CenterBox { - display: flex; - margin-top: 10%; - justify-content: center; } - #root .CongratsPage .CenterBox .congratsForm { - display: flex; - justify-content: center; - background: white; - width: 600px; - height: 600px; } - #root .CongratsPage .CenterBox .congratsForm .textHolder { - text-align: center; - margin-top: 10%; - width: 550px; - height: 350px; } - #root .CongratsPage .CenterBox .congratsForm .textHolder h1 { - font-size: 35px; - padding-left: 80px; - padding-right: 50px; - margin-top: 10px; - font-weight: 400px; } - #root .CongratsPage .CenterBox .congratsForm .textHolder h2 { - font-size: 20px; - padding-top: 15px; - padding-bottom: 15px; - padding-left: 9px; } - #root .CongratsPage .CenterBox .congratsForm .textHolder .image { - display: flex; - justify-content: center; - margin: 16px; } - #root .CongratsPage .CenterBox .congratsForm .textHolder button { - font-size: 20px; - width: 220px; - height: 51px; - margin-top: 43px; - background: #00B392; - border-radius: 5px; - border: none; } #root .container.recommendations { font-family: "Work Sans", sans-serif; background: #505050; @@ -951,11 +903,6 @@ position: relative; width: 60%; overflow: hidden; } - #root .container.recommendations .movie-cards .box .top-content .aspect-ratio-wrapper img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; } #root .container.recommendations .movie-cards .box .top-content .text-container { color: black; background-color: white; @@ -990,6 +937,53 @@ font-size: 1.5vw; } #root .container.recommendations .movie-cards .box .action-panel .watchlist-button:hover { text-decoration: underline; } + #root .watchlist-container { + font-family: "Work Sans", sans-serif; + background: #505050; + display: flex; + flex-direction: column; + min-height: 100vh; } + #root .watchlist-container .movie-cards { + width: 20%; + margin: 0% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; } + #root .watchlist-container .movie-cards .movie-card-container { + position: relative; + margin: 0 auto; + width: 30%; } + #root .watchlist-container .movie-cards .movie-card-container .box { + border-radius: 5px; + overflow: hidden; + width: 100%; + display: flex; + flex-direction: column; } + #root .watchlist-container .movie-cards .movie-card-container .box img { + width: 20vw; + height: 33.33vw; } + #root .watchlist-container .movie-cards .movie-card-container .box .text-container { + display: flex; + flex-direction: column; } + #root .watchlist-container .movie-cards .movie-card-container .box .text-container { + display: none; } + #root .watchlist-container .movie-cards .movie-card-container .box .action-panel { + display: none; } + #root .watchlist-container .movie-cards .movie-card-container .delete-button { + position: absolute; + right: 1vw; + top: 2vw; + border-radius: 100%; + height: 2vw; + width: 2vw; + padding: 0; + cursor: pointer; + outline: inherit; + white-space: nowrap; + font-size: 1vw; + background-color: #21242C; + color: white; + font-weight: bold; } #root .container.loading-screen { background: #000A12; display: flex; diff --git a/src/scss/components/_congratulations.scss b/src/scss/components/_congratulations.scss index c837792..b150ffe 100644 --- a/src/scss/components/_congratulations.scss +++ b/src/scss/components/_congratulations.scss @@ -1,55 +1,55 @@ -.CongratsPage{ - border: 2px solid #000A12; - background:#000A12; - height: 100vh; - font-family: $workSans; +// .CongratsPage{ +// border: 2px solid #000A12; +// background:#000A12; +// height: 100vh; +// font-family: $workSans; - .CenterBox{ - display:flex; - margin-top: 10%; - justify-content: center; +// .CenterBox{ +// display:flex; +// margin-top: 10%; +// justify-content: center; - .congratsForm{ - display: flex; - justify-content: center; - background: white; - width: 600px; - height: 600px; +// .congratsForm{ +// display: flex; +// justify-content: center; +// background: white; +// width: 600px; +// height: 600px; - .textHolder{ - text-align: center; - margin-top: 10%; - width: 550px; - height: 350px; +// .textHolder{ +// text-align: center; +// margin-top: 10%; +// width: 550px; +// height: 350px; - h1{ - font-size: 35px; - padding-left: 80px; - padding-right: 50px; - margin-top: 10px; - font-weight: 400px; - } - h2{ - font-size: 20px; - padding-top: 15px; - padding-bottom: 15px; - padding-left: 9px; - } - .image{ - display: flex; - justify-content: center; - margin: 16px; - } - button{ - font-size: 20px; - width: 220px; - height: 51px; - margin-top: 43px; - background:#00B392; - border-radius: 5px; - border:none; - } - } - } - } -} \ No newline at end of file +// h1{ +// font-size: 35px; +// padding-left: 80px; +// padding-right: 50px; +// margin-top: 10px; +// font-weight: 400px; +// } +// h2{ +// font-size: 20px; +// padding-top: 15px; +// padding-bottom: 15px; +// padding-left: 9px; +// } +// .image{ +// display: flex; +// justify-content: center; +// margin: 16px; +// } +// button{ +// font-size: 20px; +// width: 220px; +// height: 51px; +// margin-top: 43px; +// background:#00B392; +// border-radius: 5px; +// border:none; +// } +// } +// } +// } +// } \ No newline at end of file diff --git a/src/scss/components/_navigation.scss b/src/scss/components/_navigation.scss index 15ba016..908008c 100644 --- a/src/scss/components/_navigation.scss +++ b/src/scss/components/_navigation.scss @@ -39,7 +39,6 @@ img { height: 2rem; width: auto; - } .Groa-NavLink { diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index ef72bc2..31f970a 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -25,13 +25,13 @@ } @media (max-width: 600px) { - img { + // img { // position: absolute; - width: 136px; - height: 38px; - left: 130px; - top: 102px; - } + // width: 136px; + // height: 38px; + // left: 130px; + // top: 102px; + // } .signin-title { display: flex; diff --git a/src/scss/components/_recommendations.scss b/src/scss/components/_recommendations.scss index e8354cf..7cf0141 100644 --- a/src/scss/components/_recommendations.scss +++ b/src/scss/components/_recommendations.scss @@ -28,12 +28,12 @@ position: relative; width: 60%; overflow: hidden; - img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; - } + // img { + // height: 100%; + // position: absolute; + // right: 0; + // object-fit: cover; + // } } .text-container { color: black; diff --git a/src/scss/components/_watchlist.scss b/src/scss/components/_watchlist.scss index d6c6bf7..891c935 100644 --- a/src/scss/components/_watchlist.scss +++ b/src/scss/components/_watchlist.scss @@ -1,64 +1,60 @@ -// .watchlist-container { -// font-family: $workSans; -// background:$black; -// display: flex; -// flex-direction: column; -// min-height: 100vh; -// .movie-cards { -// width: 20%; -// margin: 0% auto; -// display: flex; -// flex-direction: row; -// flex-wrap: wrap; -// .movie-card-container { -// position: relative; -// margin: 0 auto; -// width: 30%; -// .box { -// border-radius: 5px; -// overflow: hidden; -// width: 100%; -// display: flex; -// flex-direction: column; +.watchlist-container { + font-family: $workSans; + background:$black; + display: flex; + flex-direction: column; + min-height: 100vh; + .movie-cards { + width: 20%; + margin: 0% auto; + display: flex; + flex-direction: row; + flex-wrap: wrap; + .movie-card-container { + position: relative; + margin: 0 auto; + width: 30%; + .box { + border-radius: 5px; + overflow: hidden; + width: 100%; + display: flex; + flex-direction: column; -// img { -// width: 20vw; -// height: 33.33vw; -// } -// .text-container { -// display: flex; -// flex-direction: column; -// } -// @media screen and (max-width: 600px) { -// img { -// width: 50vw; -// height: 83.33vw; -// } -// } -// .text-container { -// display: none; -// } -// .action-panel { -// display: none; -// } -// } -// .delete-button { -// position: absolute; -// right: 1vw; -// top: 2vw; -// border-radius: 100%; -// height: 2vw; -// width: 2vw; -// padding: 0; -// cursor: pointer; -// outline: inherit; -// white-space: nowrap; -// font-size: 1vw; -// background-color: $gray2; -// color: $white; -// font-weight: bold; -// } -// } -// } -// } + img { + width: 20vw; + height: 33.33vw; + } + .text-container { + display: flex; + flex-direction: column; + } + @media screen and (max-width: 600px) { + } + .text-container { + display: none; + } + .action-panel { + display: none; + } + } + .delete-button { + position: absolute; + right: 1vw; + top: 2vw; + border-radius: 100%; + height: 2vw; + width: 2vw; + padding: 0; + cursor: pointer; + outline: inherit; + white-space: nowrap; + font-size: 1vw; + background-color: $gray2; + color: $white; + font-weight: bold; + } + } + } +} \ No newline at end of file From 7dc95531956fde193e9326addf2ba41960c419fc Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 29 Apr 2020 15:38:45 -0700 Subject: [PATCH 528/822] cards centered in watchlist, max width 100% --- src/components/dashboard/Watchlist.js | 11 +- src/components/movies/MovieCard.js | 19 +- src/css/main.css | 253 ---------------------- src/scss/components/_explore.scss | 170 +++++++-------- src/scss/components/_ratings.scss | 170 +++++++-------- src/scss/components/_recommendations.scss | 164 +++++++------- src/scss/components/_watchlist.scss | 116 +++++----- 7 files changed, 334 insertions(+), 569 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 1a8ce53..ff4d3fe 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -37,7 +37,10 @@ function Watchlist({ setFilter, }) { const [deleteMode, setDeleteMode] = useState(false); + //for matieral-ui const classes = useStyles(); + const [spacing, setSpacing] = React.useState(2); + useEffect(() => { setFilter(""); // Returns the users watchlist from the database @@ -58,9 +61,12 @@ function Watchlist({ // data-test={ifDev("watchlist-component")} // > <> + {/* */} + {/* */} + {/* */} {/* */} {/* */} - + {/*
*/} {/* */} @@ -113,8 +119,9 @@ function Watchlist({ })} {/*
*/} - {/*
*/}
+ {/*
*/} + {/*
*/} {/* */} ); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index dec49fa..d12859c 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -21,6 +21,12 @@ import Toolbar from '@material-ui/core/Toolbar'; import Typography from '@material-ui/core/Typography'; const useStyles = makeStyles((theme) => ({ + root:{ + flexGrow:1, + }, + control: { + padding: theme.spacing(2), + }, // icon: { // marginRight: theme.spacing(2), // }, @@ -44,6 +50,8 @@ const useStyles = makeStyles((theme) => ({ display: 'flex', flexDirection: 'column', width:'100%', + margin:0, + justifyContent:'center', }, // cardMedia: { // paddingTop: '56.25%', @@ -105,7 +113,10 @@ function MovieCard({ const inRatings = ratings.some( (movie) => movie.name === name && movie.year === year ); + //material-ui const classes = useStyles(); + // const [spacing, setSpacing] = React.useState(2); + /* Used to format the movie object for action calls */ let movie = { @@ -135,9 +146,9 @@ function MovieCard({ return ( -
+ {/* End hero unit */} - {/* */} + {/* */} @@ -189,8 +200,8 @@ function MovieCard({ {/* */} - {/* */} -
+
+ ); } const mapStateToProps = (state) => { diff --git a/src/css/main.css b/src/css/main.css index cc0f8f2..34081b0 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -873,117 +873,6 @@ #root .textholder2 { width: 80%; margin: 6.6% auto; } } - #root .container.recommendations { - font-family: "Work Sans", sans-serif; - background: #505050; - display: flex; - flex-direction: column; - min-height: 100vh; } - #root .container.recommendations .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; } - #root .container.recommendations .movie-cards .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; } - #root .container.recommendations .movie-cards .box .top-content { - display: flex; - position: relative; } - #root .container.recommendations .movie-cards .box .top-content .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; } - #root .container.recommendations .movie-cards .box .top-content .text-container { - color: black; - background-color: white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; } - #root .container.recommendations .movie-cards .box .top-content .text-container p { - padding: .5rem 0; } - #root .container.recommendations .movie-cards .box .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: #21242C; } - #root .container.recommendations .movie-cards .box .action-panel > * { - width: 50%; - text-align: left; - margin: 1vw; } - #root .container.recommendations .movie-cards .box .action-panel .stars { - font-size: 2.5vw; } - #root .container.recommendations .movie-cards .box .action-panel .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: #00e6bb; - font-size: 1.5vw; } - #root .container.recommendations .movie-cards .box .action-panel .watchlist-button:hover { - text-decoration: underline; } - #root .watchlist-container { - font-family: "Work Sans", sans-serif; - background: #505050; - display: flex; - flex-direction: column; - min-height: 100vh; } - #root .watchlist-container .movie-cards { - width: 20%; - margin: 0% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; } - #root .watchlist-container .movie-cards .movie-card-container { - position: relative; - margin: 0 auto; - width: 30%; } - #root .watchlist-container .movie-cards .movie-card-container .box { - border-radius: 5px; - overflow: hidden; - width: 100%; - display: flex; - flex-direction: column; } - #root .watchlist-container .movie-cards .movie-card-container .box img { - width: 20vw; - height: 33.33vw; } - #root .watchlist-container .movie-cards .movie-card-container .box .text-container { - display: flex; - flex-direction: column; } - #root .watchlist-container .movie-cards .movie-card-container .box .text-container { - display: none; } - #root .watchlist-container .movie-cards .movie-card-container .box .action-panel { - display: none; } - #root .watchlist-container .movie-cards .movie-card-container .delete-button { - position: absolute; - right: 1vw; - top: 2vw; - border-radius: 100%; - height: 2vw; - width: 2vw; - padding: 0; - cursor: pointer; - outline: inherit; - white-space: nowrap; - font-size: 1vw; - background-color: #21242C; - color: white; - font-weight: bold; } #root .container.loading-screen { background: #000A12; display: flex; @@ -1005,145 +894,3 @@ text-align: center; line-height: 2rem; color: #ffffff; } - #root .container.ratings { - font-family: "Work Sans", sans-serif; - background: #505050; - display: flex; - flex-direction: column; - min-height: 100vh; } - #root .container.ratings .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; } - #root .container.ratings .movie-cards .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; } - #root .container.ratings .movie-cards .box .top-content { - display: flex; - position: relative; } - #root .container.ratings .movie-cards .box .top-content .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; } - #root .container.ratings .movie-cards .box .top-content .aspect-ratio-wrapper img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; } - #root .container.ratings .movie-cards .box .top-content .text-container { - color: black; - background-color: white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; } - #root .container.ratings .movie-cards .box .top-content .text-container p { - padding: .5rem 0; } - #root .container.ratings .movie-cards .box .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: #21242C; } - #root .container.ratings .movie-cards .box .action-panel > * { - width: 50%; - text-align: left; - margin: 1vw; } - #root .container.ratings .movie-cards .box .action-panel p { - color: #00e6bb; } - #root .container.ratings .movie-cards .box .action-panel .stars { - font-size: 2.5vw; } - #root .container.ratings .movie-cards .box .action-panel .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: #00e6bb; - font-size: 1.5vw; } - #root .container.ratings .movie-cards .box .action-panel .watchlist-button:hover { - text-decoration: underline; } - #root .container.explore { - font-family: "Work Sans", sans-serif; - background: #505050; - display: flex; - flex-direction: column; - min-height: 100vh; } - #root .container.explore .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; } - #root .container.explore .movie-cards .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; } - #root .container.explore .movie-cards .box .top-content { - display: flex; - position: relative; } - #root .container.explore .movie-cards .box .top-content .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; } - #root .container.explore .movie-cards .box .top-content .aspect-ratio-wrapper img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; } - #root .container.explore .movie-cards .box .top-content .text-container { - color: black; - background-color: white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; } - #root .container.explore .movie-cards .box .top-content .text-container p { - padding: .5rem 0; } - #root .container.explore .movie-cards .box .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: #21242C; } - #root .container.explore .movie-cards .box .action-panel > * { - width: 50%; - text-align: left; - margin: 1vw; } - #root .container.explore .movie-cards .box .action-panel p { - color: #00e6bb; } - #root .container.explore .movie-cards .box .action-panel .stars { - font-size: 2.5vw; } - #root .container.explore .movie-cards .box .action-panel .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: #00e6bb; - font-size: 1.5vw; } - #root .container.explore .movie-cards .box .action-panel .watchlist-button:hover { - text-decoration: underline; } diff --git a/src/scss/components/_explore.scss b/src/scss/components/_explore.scss index a8b4f26..2f5c0e0 100644 --- a/src/scss/components/_explore.scss +++ b/src/scss/components/_explore.scss @@ -1,86 +1,86 @@ -.container.explore { - font-family: $workSans; - background: $black; - display: flex; - flex-direction: column; - min-height: 100vh; - .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; - .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; - .top-content { - display: flex; - position: relative; - .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; - img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; - } - } - .text-container { - color: black; - background-color: $white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; - p { - padding: .5rem 0; - } - } - } - .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: $gray2; - >* { - width: 50%; - text-align: left; - margin: 1vw; - } - p{ - color: $turqoise2; - } - .stars{ - font-size: 2.5vw; - } - .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: $turqoise2; - font-size: 1.5vw; - &:hover { - text-decoration: underline; - } - } - } - } - } - } +// .container.explore { +// font-family: $workSans; +// background: $black; +// display: flex; +// flex-direction: column; +// min-height: 100vh; +// .movie-cards { +// width: 75%; +// margin: 3% auto; +// display: flex; +// flex-direction: row; +// flex-wrap: wrap; +// justify-content: space-evenly; +// .box { +// border-radius: 5px; +// overflow: hidden; +// width: 30vw; +// height: 30vw; +// max-width: 33%; +// margin: 2.5%; +// display: flex; +// flex-direction: column; +// .top-content { +// display: flex; +// position: relative; +// .aspect-ratio-wrapper { +// padding-bottom: 80%; +// position: relative; +// width: 60%; +// overflow: hidden; +// img { +// height: 100%; +// position: absolute; +// right: 0; +// object-fit: cover; +// } +// } +// .text-container { +// color: black; +// background-color: $white; +// width: 45%; +// padding: 2.5%; +// font-size: 1.5vw; +// p { +// padding: .5rem 0; +// } +// } +// } +// .action-panel { +// display: flex; +// flex-direction: column; +// align-items: flex-end; +// height: auto; +// width: 100%; +// padding: 1vw 0; +// background-color: $gray2; +// >* { +// width: 50%; +// text-align: left; +// margin: 1vw; +// } +// p{ +// color: $turqoise2; +// } +// .stars{ +// font-size: 2.5vw; +// } +// .watchlist-button { +// background-color: inherit; +// color: inherit; +// border: none; +// padding: 0; +// font: inherit; +// cursor: pointer; +// outline: inherit; +// color: $turqoise2; +// font-size: 1.5vw; +// &:hover { +// text-decoration: underline; +// } +// } +// } +// } +// } +// } \ No newline at end of file diff --git a/src/scss/components/_ratings.scss b/src/scss/components/_ratings.scss index f5d4f6f..ce26b46 100644 --- a/src/scss/components/_ratings.scss +++ b/src/scss/components/_ratings.scss @@ -1,98 +1,98 @@ -.container.ratings { - font-family: $workSans; - background: $black; - display: flex; - flex-direction: column; - min-height: 100vh; +// .container.ratings { +// font-family: $workSans; +// background: $black; +// display: flex; +// flex-direction: column; +// min-height: 100vh; - .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; +// .movie-cards { +// width: 75%; +// margin: 3% auto; +// display: flex; +// flex-direction: row; +// flex-wrap: wrap; +// justify-content: space-evenly; - .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; +// .box { +// border-radius: 5px; +// overflow: hidden; +// width: 30vw; +// height: 30vw; +// max-width: 33%; +// margin: 2.5%; +// display: flex; +// flex-direction: column; - .top-content { - display: flex; - position: relative; +// .top-content { +// display: flex; +// position: relative; - .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; +// .aspect-ratio-wrapper { +// padding-bottom: 80%; +// position: relative; +// width: 60%; +// overflow: hidden; - img { - height: 100%; - position: absolute; - right: 0; - object-fit: cover; - } - } +// img { +// height: 100%; +// position: absolute; +// right: 0; +// object-fit: cover; +// } +// } - .text-container { - color: black; - background-color: $white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; +// .text-container { +// color: black; +// background-color: $white; +// width: 45%; +// padding: 2.5%; +// font-size: 1.5vw; - p { - padding: .5rem 0; - } - } - } +// p { +// padding: .5rem 0; +// } +// } +// } - .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: $gray2; +// .action-panel { +// display: flex; +// flex-direction: column; +// align-items: flex-end; +// height: auto; +// width: 100%; +// padding: 1vw 0; +// background-color: $gray2; - >* { - width: 50%; - text-align: left; - margin: 1vw; - } +// >* { +// width: 50%; +// text-align: left; +// margin: 1vw; +// } - p { - color: $turqoise2; - } +// p { +// color: $turqoise2; +// } - .stars { - font-size: 2.5vw; - } +// .stars { +// font-size: 2.5vw; +// } - .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: $turqoise2; - font-size: 1.5vw; +// .watchlist-button { +// background-color: inherit; +// color: inherit; +// border: none; +// padding: 0; +// font: inherit; +// cursor: pointer; +// outline: inherit; +// color: $turqoise2; +// font-size: 1.5vw; - &:hover { - text-decoration: underline; - } - } - } - } - } -} \ No newline at end of file +// &:hover { +// text-decoration: underline; +// } +// } +// } +// } +// } +// } \ No newline at end of file diff --git a/src/scss/components/_recommendations.scss b/src/scss/components/_recommendations.scss index 7cf0141..5d8a4ff 100644 --- a/src/scss/components/_recommendations.scss +++ b/src/scss/components/_recommendations.scss @@ -1,82 +1,82 @@ -.container.recommendations { - font-family: $workSans; - background: $black; - display: flex; - flex-direction: column; - min-height: 100vh; - .movie-cards { - width: 75%; - margin: 3% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-evenly; - .box { - border-radius: 5px; - overflow: hidden; - width: 30vw; - height: 30vw; - max-width: 33%; - margin: 2.5%; - display: flex; - flex-direction: column; - .top-content { - display: flex; - position: relative; - .aspect-ratio-wrapper { - padding-bottom: 80%; - position: relative; - width: 60%; - overflow: hidden; - // img { - // height: 100%; - // position: absolute; - // right: 0; - // object-fit: cover; - // } - } - .text-container { - color: black; - background-color: $white; - width: 45%; - padding: 2.5%; - font-size: 1.5vw; - p { - padding: .5rem 0; - } - } - } - .action-panel { - display: flex; - flex-direction: column; - align-items: flex-end; - height: auto; - width: 100%; - padding: 1vw 0; - background-color: $gray2; - >* { - width: 50%; - text-align: left; - margin: 1vw; - } - .stars{ - font-size: 2.5vw; - } - .watchlist-button { - background-color: inherit; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - color: $turqoise2; - font-size: 1.5vw; - &:hover { - text-decoration: underline; - } - } - } - } - } -} \ No newline at end of file +// .container.recommendations { +// font-family: $workSans; +// background: $black; +// display: flex; +// flex-direction: column; +// min-height: 100vh; +// .movie-cards { +// width: 75%; +// margin: 3% auto; +// display: flex; +// flex-direction: row; +// flex-wrap: wrap; +// justify-content: space-evenly; +// .box { +// border-radius: 5px; +// overflow: hidden; +// width: 30vw; +// height: 30vw; +// max-width: 33%; +// margin: 2.5%; +// display: flex; +// flex-direction: column; +// .top-content { +// display: flex; +// position: relative; +// .aspect-ratio-wrapper { +// padding-bottom: 80%; +// position: relative; +// width: 60%; +// overflow: hidden; +// // img { +// // height: 100%; +// // position: absolute; +// // right: 0; +// // object-fit: cover; +// // } +// } +// .text-container { +// color: black; +// background-color: $white; +// width: 45%; +// padding: 2.5%; +// font-size: 1.5vw; +// p { +// padding: .5rem 0; +// } +// } +// } +// .action-panel { +// display: flex; +// flex-direction: column; +// align-items: flex-end; +// height: auto; +// width: 100%; +// padding: 1vw 0; +// background-color: $gray2; +// >* { +// width: 50%; +// text-align: left; +// margin: 1vw; +// } +// .stars{ +// font-size: 2.5vw; +// } +// .watchlist-button { +// background-color: inherit; +// color: inherit; +// border: none; +// padding: 0; +// font: inherit; +// cursor: pointer; +// outline: inherit; +// color: $turqoise2; +// font-size: 1.5vw; +// &:hover { +// text-decoration: underline; +// } +// } +// } +// } +// } +// } \ No newline at end of file diff --git a/src/scss/components/_watchlist.scss b/src/scss/components/_watchlist.scss index 891c935..f79421c 100644 --- a/src/scss/components/_watchlist.scss +++ b/src/scss/components/_watchlist.scss @@ -1,60 +1,60 @@ -.watchlist-container { - font-family: $workSans; - background:$black; - display: flex; - flex-direction: column; - min-height: 100vh; - .movie-cards { - width: 20%; - margin: 0% auto; - display: flex; - flex-direction: row; - flex-wrap: wrap; - .movie-card-container { - position: relative; - margin: 0 auto; - width: 30%; - .box { - border-radius: 5px; - overflow: hidden; - width: 100%; - display: flex; - flex-direction: column; +// .watchlist-container { +// font-family: $workSans; +// background:$black; +// display: flex; +// flex-direction: column; +// min-height: 100vh; +// .movie-cards { +// width: 20%; +// margin: 0% auto; +// display: flex; +// flex-direction: row; +// flex-wrap: wrap; +// .movie-card-container { +// position: relative; +// margin: 0 auto; +// width: 30%; +// .box { +// border-radius: 5px; +// overflow: hidden; +// width: 100%; +// display: flex; +// flex-direction: column; - img { - width: 20vw; - height: 33.33vw; - } - .text-container { - display: flex; - flex-direction: column; - } - @media screen and (max-width: 600px) { - } - .text-container { - display: none; - } - .action-panel { - display: none; - } - } - .delete-button { - position: absolute; - right: 1vw; - top: 2vw; - border-radius: 100%; - height: 2vw; - width: 2vw; - padding: 0; - cursor: pointer; - outline: inherit; - white-space: nowrap; - font-size: 1vw; - background-color: $gray2; - color: $white; - font-weight: bold; - } - } - } -} +// img { +// width: 20vw; +// height: 33.33vw; +// } +// .text-container { +// display: flex; +// flex-direction: column; +// } +// @media screen and (max-width: 600px) { +// } +// .text-container { +// display: none; +// } +// .action-panel { +// display: none; +// } +// } +// .delete-button { +// position: absolute; +// right: 1vw; +// top: 2vw; +// border-radius: 100%; +// height: 2vw; +// width: 2vw; +// padding: 0; +// cursor: pointer; +// outline: inherit; +// white-space: nowrap; +// font-size: 1vw; +// background-color: $gray2; +// color: $white; +// font-weight: bold; +// } +// } +// } +// } \ No newline at end of file From 98e2a0564a85f6055663139075e89cbfd790b2d1 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 29 Apr 2020 22:09:10 -0700 Subject: [PATCH 529/822] grid functional on mobile on all pages --- src/components/dashboard/Explore.js | 28 +- src/components/dashboard/Navigation.js | 10 +- src/components/dashboard/Ratings.js | 28 +- src/components/dashboard/Recommendations.js | 34 +- src/components/dashboard/Watchlist.js | 36 +- src/components/movies/MovieCard.js | 27 +- src/css/main.css | 896 -------------------- src/scss/main.scss | 10 +- 8 files changed, 119 insertions(+), 950 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 1fa7e9f..e731cd8 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -10,7 +10,19 @@ import { // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; +//for grid +import CssBaseline from '@material-ui/core/CssBaseline'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; +import Container from '@material-ui/core/Container'; +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(8), + paddingBottom: theme.spacing(8), + }, + +})); function Explore({ isFetching, movies, @@ -30,12 +42,16 @@ function Explore({ }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); // How many movies render const cardAmount = 25; + const classes = useStyles(); + if (isFetching) return ; else return ( -
-
+ //
+ //
+ + {movies .filter((movie) => !ratings.includes( @@ -66,6 +82,8 @@ function Explore({ let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( + + + ); })} -
-
+ {/*
+
*/} + ); } diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 49a227a..6256485 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -186,7 +186,13 @@ const useStyles = makeStyles(theme => ({ display:'flex', flexDirection:'column', - } + }, + + [theme.breakpoints.down("xs")]: { + userIcon:{ + display:'none', + } +}, })); @@ -298,7 +304,7 @@ const Navigation = props => { ({ + cardGrid: { + paddingTop: theme.spacing(8), + paddingBottom: theme.spacing(8), + }, + +})); function Ratings({ userid, isFetching, @@ -20,11 +32,15 @@ function Ratings({ // Returns the ratings getRatingAction(userid); }, [getRatingAction, userid, setFilter]); + const classes = useStyles(); + if (isFetching) return ; else return ( -
-
+ //
+ //
+ + {ratings .filter((movie) => searchTerm !== "" @@ -41,6 +57,8 @@ function Ratings({ let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( + + + ); })} -
-
+ {/*
+
*/} + ); } diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index faeb065..bd79356 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -10,6 +10,19 @@ import { // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; +//for grid +import CssBaseline from '@material-ui/core/CssBaseline'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; +import Container from '@material-ui/core/Container'; + +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(8), + paddingBottom: theme.spacing(8), + }, + +})); function Recommendations({ isFetching, @@ -29,15 +42,18 @@ function Recommendations({ recommendationAction(userid); // Returns the most recent recommendations from the database }, [userid, isUploaded, recommendationAction, setFilter]); + const classes = useStyles(); if (isFetching) return ; else return ( -
-
+ //
+ //
+ + {recommendations .filter((movie) => searchTerm !== "" @@ -54,6 +70,8 @@ function Recommendations({ let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( + + + ); })} -
-
+ {/*
+
*/} + ); } diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index c4da8c3..ca75394 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -56,17 +56,14 @@ function Watchlist({ else return ( - //
- <> - {/* */} - {/* */} - {/* */} - {/* */} - {/* */} - + + // /* */} + // {/* */} + // {/* */} + // {/* */} + // {/* */} + + {/* */} {/*
*/} {/* */} @@ -80,6 +77,7 @@ function Watchlist({ : true ) .map((movie, index) => { + let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; @@ -90,6 +88,7 @@ function Watchlist({ onClick={() => setDeleteMode(!deleteMode)} > + - {/* {deleteMode && ( + + {deleteMode && ( - )} */} + )}
); })} - - {/*
*/} - - {/* */} - {/* */} - {/* */} - + + + ); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index d12859c..d31f808 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -21,9 +21,9 @@ import Toolbar from '@material-ui/core/Toolbar'; import Typography from '@material-ui/core/Typography'; const useStyles = makeStyles((theme) => ({ - root:{ - flexGrow:1, - }, + // root:{ + // flexGrow:1, + // }, control: { padding: theme.spacing(2), }, @@ -42,16 +42,18 @@ const useStyles = makeStyles((theme) => ({ paddingBottom: theme.spacing(8), // paddingLeft: theme.spacing(8), // paddingRight: theme.spacing(8), - width: "100%" + // width: "100%" // justify:'center', + }, card: { - // height: '50%', + height: '100%', display: 'flex', flexDirection: 'column', + border: "1px solid #5B7648", width:'100%', - margin:0, - justifyContent:'center', + // margin:0, + // justifyContent:'center', }, // cardMedia: { // paddingTop: '56.25%', @@ -64,8 +66,9 @@ const useStyles = makeStyles((theme) => ({ // width: '100%' // }, cardActions:{ -display:'flex', +// display:'flex', // flexDirection:'column' +margin:'auto', }, stars:{ fontSize: '2.5vw', @@ -145,10 +148,10 @@ function MovieCard({ return ( - - + + {/* */} {/* End hero unit */} - + {/* */} {/* */} @@ -201,7 +204,7 @@ function MovieCard({ {/* */} - + // ); } const mapStateToProps = (state) => { diff --git a/src/css/main.css b/src/css/main.css index 34081b0..e69de29 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -1,896 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); -@import url(https://fonts.googleapis.com/css?family=Roboto:500); -#root { - /* - sources that helped me style the input - https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/ - - haven't added the functionality for drap and drop yet https://css-tricks.com/drag-and-drop-file-uploading/ -*/ } - #root html, - #root body { - margin: 0; - padding: 0; - box-sizing: border-box; } - #root html *, - #root body * { - box-sizing: inherit; } - -@-webkit-keyframes flexGrow { - to { - flex: 1; } } - -@-o-keyframes flexGrow { - to { - flex: 1; } } - -@keyframes flexGrow { - to { - flex: 1; } } - -@-webkit-keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - -@-o-keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - -@keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - #root html { - font-family: "Work Sans", sans-serif; - font-weight: normal; - color: #505050; - font-size: 14px; } - #root h1, - #root h2, - #root h3, - #root h4, - #root h5, - #root h6 { - font-weight: bold; - margin: 0; } - #root h1 a, - #root h2 a, - #root h3 a, - #root h4 a, - #root h5 a, - #root h6 a { - font-weight: inherit; } - #root em { - font-style: italic; } - #root strong { - font-weight: bold; } - #root .uppercase { - text-transform: uppercase; } - #root .lowercase { - text-transform: lowercase; } - #root .App { - min-height: 100vh; } - #root .container.register-component, - #root .container.login-component { - font-family: "Work Sans", sans-serif; - color: white; - background: #505050; - margin: 0 auto; - width: 100%; - min-height: 100vh; } - #root .container.register-component .onboarding-nav, - #root .container.login-component .onboarding-nav { - color: white; - display: flex; - width: 95%; - margin: 0 auto; - justify-content: flex-end; - padding: 1.1% 1%; } - #root .container.register-component .box-container, - #root .container.login-component .box-container { - display: flex; - justify-content: space-between; - margin: 0 auto; - width: 85%; } - #root .container.register-component .box-left, - #root .container.login-component .box-left { - width: 45%; - margin: 0 1%; - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - align-items: center; - text-align: left; - max-width: 100%; - box-sizing: border-box; } - #root .container.register-component .box-left .text-container, - #root .container.login-component .box-left .text-container { - white-space: nowrap; } - #root .container.register-component .box-left .text-container h1, - #root .container.login-component .box-left .text-container h1 { - font-size: 5vw; } - #root .container.register-component .box-left .text-container h5, - #root .container.login-component .box-left .text-container h5 { - font-size: 1.5vw; - font-weight: normal; - padding-top: 2rem; } - #root .container.register-component .box-left .image-wrapper, - #root .container.login-component .box-left .image-wrapper { - width: 75%; - padding: 5% 0; } - #root .container.register-component .box-left .image-wrapper .logo, - #root .container.login-component .box-left .image-wrapper .logo { - width: 100%; } - #root .container.register-component .box-right, - #root .container.login-component .box-right { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: auto; - padding: 3%; - border-radius: 4px; - background: #505050; - width: 100%; - max-width: 518px; - height: 550px; } - #root .container.register-component .box-right .form, - #root .container.login-component .box-right .form { - width: 50%; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; } - #root .container.register-component .box-right .form-control, - #root .container.login-component .box-right .form-control { - border-radius: 4px; - border: 1px solid #d8d8d8; - max-width: 320px; - width: 100%; - height: auto; - padding: 2.7% 1.7%; - margin: 2.6% auto; - margin-bottom: 1rem; } - #root .container.register-component .box-right input::placeholder, - #root .container.login-component .box-right input::placeholder { - font-size: 1.1rem; - color: #d8d8d8; } - #root .container.register-component .box-right .bottom-form, - #root .container.login-component .box-right .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; } - #root .container.register-component .box-right .bottom-form .check-box-container, - #root .container.login-component .box-right .bottom-form .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; } - #root .container.register-component .box-right .bottom-form .check-box-container p, - #root .container.login-component .box-right .bottom-form .check-box-container p { - color: black; - white-space: nowrap; } - #root .container.register-component .box-right .bottom-form .btn-container, - #root .container.login-component .box-right .bottom-form .btn-container { - width: 100%; - display: flex; - align-items: center; - flex-direction: column; - padding-bottom: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: #00B392; - color: #505050; - font-size: 14px; - margin-bottom: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy, - #root .container.login-component .box-right .bottom-form .btn-container .fancy { - line-height: 0.5; - text-align: center; - margin: 1% 0; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span { - display: inline-block; - position: relative; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - position: absolute; - height: 5px; - border-bottom: 1px solid white; - top: 0; - width: 104px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before { - right: 100%; - margin-right: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - left: 100%; - margin-left: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn { - width: 100%; - height: 50px; - background-color: white; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - background-color: white; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 7% 2% 0 30%; - color: #505050; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:active { - background: white; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn { - width: 100%; - height: 50px; - background-color: #3A5A97; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 7% 2% 0 30%; - color: white; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:active { - background: white; } - #root .container.register-component .box-right .bottomAccount, - #root .container.login-component .box-right .bottomAccount { - display: flex; - flex-direction: column; - padding: 5%; } - #root .container.register-component .box-right .bottomAccount .loginAccount, - #root .container.login-component .box-right .bottomAccount .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; } - #root .container.register-component .box-right .bottomAccount .link, - #root .container.login-component .box-right .bottomAccount .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - flex-direction: column-reverse; - align-items: center; - color: white; } - #root .container.register-component .box-right .bottomAccount .link:hover, - #root .container.login-component .box-right .bottomAccount .link:hover { - color: #00b392; - font-weight: bold; } - #root .container.register-component .box-right .callingError, - #root .container.login-component .box-right .callingError { - color: red; - display: flex; - justify-content: center; } - @media (max-width: 1068px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - font-size: 10vw; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - font-size: 3vw; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - width: 100%; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - width: 100%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - margin: 0 auto; - padding: 0; - max-width: 100%; - width: 100%; - color: white; } - #root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text { - margin: 4% 2% 0 38%; } - #root .container.register-component .box-container .box-right .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 38%; } } - -@media (max-width: 1068px) and (max-width: 600px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - display: none; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper .logo, - #root .container.login-component .box-container .box-left .image-wrapper .logo { - display: none; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - margin: 2%; - padding: 0%; - background: #505050; - height: 100%; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - max-width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { - margin-top: 3%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - width: 800%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { - padding: 2%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { - font-size: 9px; } } - #root .register.nav, - #root .login.nav { - font-family: "Work Sans", sans-serif; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - text-align: center; } - @media (max-width: 600px) { - #root .register.nav, - #root .login.nav { - flex-direction: column; } } - #root .register.nav img, - #root .login.nav img { - align-items: center; - height: 2.5rem; - width: auto; } - #root .register.nav .signin-title, - #root .login.nav .signin-title { - display: flex; - color: white; } - @media (max-width: 600px) { - #root .signin-title { - display: flex; - justify-content: flex-start; - margin-top: 2%; - font-size: 20px; } } - #root .mainContainer { - background: #505050; - padding: 1.1% 1%; - font-family: "Work Sans", sans-serif; } - #root .mainContainer .navContainer { - display: flex; - justify-content: space-evenly; - align-items: center; - padding-right: 1rem; } - @media only screen and (max-width: 750px) { - #root .mainContainer .navContainer { - justify-content: space-around; } } - #root .mainContainer .navContainer .Bars { - padding-top: 5px; } - #root .mainContainer .navContainer .Bars .bars-icon { - color: white; - font-size: 1.4rem; } - #root .mainContainer .navContainer .Links { - width: 60%; - display: flex; - justify-content: space-evenly; - align-items: center; - margin: 0 .4rem; } - #root .mainContainer .navContainer .Links a.active { - border-bottom: 3px solid #00E6BC; } - #root .mainContainer .navContainer .Links img { - height: 2rem; - width: auto; } - #root .mainContainer .navContainer .Links .Groa-NavLink:hover { - color: white; } - #root .mainContainer .navContainer .Links .NavLink { - color: white; - text-decoration: none; - margin: 0 1%; - transition: all 500ms linear; } - #root .mainContainer .navContainer .Links .NavLink:hover { - color: white; } - @media only screen and (max-width: 600px) { - #root .mainContainer .navContainer .watchlist, - #root .mainContainer .navContainer .recommended, - #root .mainContainer .navContainer .explore, - #root .mainContainer .navContainer .dropdown-hover .angle-down-icon { - flex: .000000001; - white-space: pre; - padding: 0; - font-size: 0; - margin: 0; - opacity: 0; } } - #root .mainContainer .navContainer .searchContainer { - background-color: #21242C; - padding: .4rem; - border-radius: 5px; - display: flex; - flex: 1; - justify-content: space-between; - overflow: hidden; - transition: all 500ms linear; - min-width: 20vw; } - #root .mainContainer .navContainer .searchContainer .search-wrapper { - display: flex; - align-items: center; - width: 75%; } - #root .mainContainer .navContainer .searchContainer .search-icon, - #root .mainContainer .navContainer .searchContainer .backspace-icon { - color: white; - opacity: .4; - font-size: 1.2rem; - padding: .2rem; } - #root .mainContainer .navContainer .searchContainer .backspace-icon { - cursor: pointer; } - #root .mainContainer .navContainer .searchContainer .searchBox { - font-size: 1rem; - background-color: #21242C; - border: none; - color: white; } - #root .mainContainer .navContainer .searchContainer input:focus { - outline: none; } - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:hover, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:focus, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill { - -webkit-text-fill-color: white !important; } - #root .mainContainer .navContainer button { - white-space: nowrap; - font-size: 1rem; - padding: .4rem; - margin: 0 .6rem; - border-radius: 5px; - background-color: white; - cursor: pointer; - transition: all 500ms linear; } - @media only screen and (max-width: 750px) { - #root .mainContainer .navContainer .Links { - justify-content: space-between; - padding: 0%; - margin-right: 0%; } - #root .mainContainer .navContainer button { - font-size: 0; - padding: .2rem; - background-color: rgba(28, 28, 28, 0); - border: none; } - #root .mainContainer .navContainer .sync-icon { - font-size: initial; - color: white; } - #root .mainContainer .navContainer .searchContainer { - min-width: 35vw; } } - #root .mainContainer .navContainer .fa-icons { - width: 14%; - display: flex; - justify-content: space-between; - font-size: 1.6rem; - color: white; } - #root .mainContainer button.hidden, - #root .mainContainer .searchContainer.hidden, - #root .mainContainer .hidden { - min-width: 0; - flex: .000000001; - white-space: pre; - padding: 0; - font-size: 0; - margin: 0; - opacity: 0; } - #root .mainContainer .dropdown-hover { - padding: .25rem .5rem; - position: relative; - white-space: nowrap; - cursor: pointer; - display: flex; - align-items: center; } - #root .mainContainer .dropdown-hover .angle-down-icon { - padding-left: .5rem; } - #root .mainContainer .dropdown-hover .dropdown-content { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content { - display: flex; - flex-direction: column; - position: absolute; - top: 2rem; - right: .4rem; - border-radius: 5px; - overflow: hidden; - z-index: 5; - border: 1px solid #D8D8D8; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink { - border-top: 1px solid #D8D8D8; - color: #505050; - text-decoration: none; - font-size: 1.1rem; - padding: 1rem 1.5rem; - background: white; - white-space: nowrap; - text-align: center; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { - background-color: #D8D8D8; } - @media (hover: hover) and (pointer: fine) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { - background-color: #D8D8D8; } } - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, - #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { - display: none; } - @media only screen and (max-width: 750px) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, - #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { - display: block; } } - #root .container.post-login { - background: white; - color: black; } - #root .container.post-login header { - margin: 0% auto; - text-align: center; } - #root .container.post-login header h1 { - font-size: 4rem; - margin-top: 2.75%; } - #root .container.post-login header p { - font-size: 1.75rem; - margin: 2.24% auto; - line-height: 2.15rem; - width: 100%; - max-width: 425px; - height: 68; - text-align: center; } - #root .container.post-login .choice-selection-container { - text-align: center; } - #root .container.post-login .choice-selection-container h2 { - font-size: 2.5rem; - margin: 2% 0% 4.25% 0%; } - #root .container.post-login .choice-selection-container .choice-selection { - margin: auto; - width: 71%; - display: flex; - justify-content: space-around; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box { - width: 35%; - max-width: 287px; - height: 550px; - display: flex; - flex-direction: column; - justify-content: space-between; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box h4 { - font-size: 1.75rem; - font-weight: bold; - margin-bottom: 27px; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .img-box { - width: 100%; - max-width: 285; - height: auto; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn { - width: 100%; - max-width: 287px; - height: 51px; - margin-top: 32px; - justify-content: flex-end; - border: none; - font-size: 1.75rem; - color: white; - background: #21242c; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn:hover { - color: #21242c; - background: white; - border: 1px solid grey; } - #root .container.post-login .hidden, - #root .container.post-login .setup-wizard.choice-box.hidden { - display: none; } - #root .DataUploadPage { - display: flex; - justify-content: center; - font-family: "Work Sans", sans-serif; } - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 4em; - margin-top: 4%; - margin-bottom: 2%; - font-weight: 700; - text-align: center; } - #root .textholder1 h2, - #root .textholder1 h3 { - width: 60%; - text-align: center; - margin: 3.5% auto; - display: flex; - justify-content: center; - font-weight: 400; - font-size: 1.7em; } - @media only screen and (max-width: 500px) { - #root .textholder1 { - text-align: center; - padding-top: 25px; } - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 180%; - margin-top: 4%; } - #root .textholder1 h2, - #root .textholder1 h3 { - margin-top: 15px; - display: flex; - justify-content: center; - padding: 0 35px 0 35px; } } - @media only screen and (max-width: 375px) { - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 180%; } - #root .textholder1 h2, - #root .textholder1 h3 { - margin-top: 25px; - display: flex; - justify-content: center; - padding: 0 13px 0 13px; } } - #root .ptext { - font-size: 14px; } - @media only screen and (max-width: 375px) { - #root .ptext { - padding-top: 25px; - font-size: 10px; } } - #root .DboxContainer { - display: flex; - justify-content: space-around; - margin-top: 6%; } - #root .DboxContainer .DboxLeft, - #root .DboxContainer .DboxRight { - width: 290px; - height: 250px; - padding-top: 15px; } - #root .DboxContainer .textContainer p { - font-size: 20px; } - #root .DboxContainer .textContainer p a#pLink { - color: #2477e5; - font-weight: 700; - text-decoration: none; } - @media only screen and (max-width: 500px) { - #root .DboxContainer .DboxLeft { - display: flex; } - #root .DboxContainer .DboxLeft img { - width: 100px; - height: auto; } - #root .DboxContainer .DboxRight { - margin-top: 72%; - display: flex; - width: 360px; } - #root .DboxContainer .DboxRight img { - width: 100px; - height: auto; } } - #root .dropdown { - display: flex; - position: relative; - flex-direction: column; - width: 290px; } - #root .dropdown .centerBtn { - margin: auto; } - #root .dropdown img { - width: 100%; - max-width: 164px; - height: auto; } - #root .dropdown .dropBtn { - width: 220px; - height: 102px; - background-color: #00b392; - color: #ffffff; - padding: 0 35px 0 35px; - font-size: 20px; - border: none; - border-radius: 6px; - cursor: pointer; - outline: inherit; } - #root .dropdown .dropdown-content { - display: none; - height: 310px; } - #root .dropdown .dropdown-content p { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; } - #root .dropdown .dropBtn:hover, - #root .dropdown .dropBtn:focus { - background-color: #00b392; } - #root .dropdown .dropdown a:hover { - background-color: #ddd; } - #root .dropdown .show { - display: block; } - @media only screen and (max-width: 500px) { - #root .dropdown .dropBtn { - width: 197px; - height: 80px; - background-color: #00b392; - color: #ffffff; - padding: 0 39px 0 39px; - font-size: 16px; - border: none; - border-radius: 6px; - cursor: pointer; - outline: inherit; } - #root .dropdown .dropdown-content { - height: 280px; } } - @media only screen and (max-width: 375px) { - #root .dropdown .dropdown-content { - height: 320px; } } - #root .dropdown-content-Empty { - display: block; - height: 310px; - position: relative; } - @media only screen and (max-width: 500px) { - #root .dropdown-content-Empty { - display: block; - height: 280px; - position: relative; } } - @media only screen and (max-width: 375px) { - #root .dropdown-content-Empty { - display: block; - height: 320px; - position: relative; } } - #root .show2 { - display: none; } - #root .UploadContainer { - display: flex; - justify-content: center; - align-content: center; - position: relative; } - #root .UploadContainer .inputholder input[type="file"] { - font-size: 100px; - position: absolute; - left: 0; - top: 0; - opacity: 0; - max-width: 100%; } - #root .UploadContainer label#uploadLabel { - width: 420px; - text-align: center; - margin: auto; - padding: 7% 0; - cursor: pointer; - font-size: 16px; - font-weight: 700; - display: inline-block; - border: 2px dashed #2477e5; - border-radius: 3px; - color: #2477e5; } - #root .UploadContainer label#uploadLabel img { - margin-top: 4.3%; } - @media only screen and (max-width: 500px) { - #root .UploadContainer .inputholder { - display: flex; - justify-content: center; - padding: 10px; - width: 232px; - height: 66px; } - #root .UploadContainer .inputholder .uploadData { - margin-top: 25px; - height: 50px; } } - #root .textholder2 { - width: 44%; - margin: 3.3% auto; - text-align: center; - font-size: 14px; - display: flex; - justify-content: center; } - @media only screen and (max-width: 500px) { - #root .textholder2 { - width: 80%; - margin: 6.6% auto; } } - #root .container.loading-screen { - background: #000A12; - display: flex; - flex-direction: column; - justify-content: center; - height: 100vh; - font-family: "Work Sans", sans-serif; } - #root .container.loading-screen h4, - #root .container.loading-screen p, - #root .container.loading-screen .loading-component { - margin: 4.5% auto; } - #root .container.loading-screen h4 { - font-size: 2.5rem; - color: #ffffff; - text-align: center; - font-weight: 700; } - #root .container.loading-screen p { - font-size: 1.4rem; - text-align: center; - line-height: 2rem; - color: #ffffff; } diff --git a/src/scss/main.scss b/src/scss/main.scss index c4aced5..3bfaa1d 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -1,5 +1,5 @@ -#root { - @import "abstracts/all"; - @import "base/all"; - @import "components/all"; -} +// #root { +// @import "abstracts/all"; +// @import "base/all"; +// @import "components/all"; +// } From fb5ccaf0d0eb7df429788b7a6edfe70325036885 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 30 Apr 2020 08:25:01 -0700 Subject: [PATCH 530/822] update movie cards to be in grid - still pending --- src/components/dashboard/Navigation.js | 17 +- src/components/dashboard/Watchlist.js | 2 +- src/components/movies/MovieCard.js | 68 +- src/css/main.css | 896 +++++++++++++++++++++++++ src/scss/main.scss | 10 +- 5 files changed, 955 insertions(+), 38 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 6256485..4ac3b72 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -65,11 +65,11 @@ const useStyles = makeStyles(theme => ({ backgroundColor:'#505050', }, - [theme.breakpoints.down("xs")]: { - searchContainer:{ - width:"80%", - } - }, + // [theme.breakpoints.down("xs")]: { + // searchContainer:{ + // width:"100%", + // } + // }, search: { // display:'flex', // alignItems:'center', @@ -81,7 +81,7 @@ const useStyles = makeStyles(theme => ({ color:'#ffffff', }, width: "100%", - [theme.breakpoints.up("sm")]: { + [theme.breakpoints.down("sm")]: { width: "auto" } }, @@ -191,7 +191,10 @@ const useStyles = makeStyles(theme => ({ [theme.breakpoints.down("xs")]: { userIcon:{ display:'none', - } + searchContainer:{ + width:"100%", + } + }, }, })); diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index ca75394..28ce14b 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -88,7 +88,7 @@ function Watchlist({ onClick={() => setDeleteMode(!deleteMode)} > - + ({ cardGrid: { paddingTop: theme.spacing(8), paddingBottom: theme.spacing(8), + display:'flex', + flexDirection:'row', // paddingLeft: theme.spacing(8), // paddingRight: theme.spacing(8), // width: "100%" @@ -50,13 +52,23 @@ const useStyles = makeStyles((theme) => ({ height: '100%', display: 'flex', flexDirection: 'column', - border: "1px solid #5B7648", + // border: "1px solid #5B7648", width:'100%', // margin:0, // justifyContent:'center', + '&:hover':{ + background:'black', + opacity: 0.3 + }, + moreInfo:{ + display: 'flex', + flexDirection: 'row', + }, }, // cardMedia: { - // paddingTop: '56.25%', + // '&:hover':{ + // opacity: 5, + // } // }, cardContent: { flexGrow: 1, @@ -77,17 +89,31 @@ margin:'auto', transition:' .5s ease', opacity: 0, position: 'absolute', - top: '50%', - left:' 50%', transform: 'translate(-50%, -50%)', // -msTransform:' translate(-50%, -50%)', textAlign: 'center', + '&:hover':{ + opacity: 1, + } }, - opacityBox:{ - + text:{ + backgroundColor: '#4CAF50', + color: 'white', + fontSize: '16px', + opacity: 0, + visibility: 'hidden', + transition: 'opacity .2s, visibility .2s', }, movieImg:{ width:'100%', + opacity: 1, + display: 'block', + height: 'auto', + transition: '5s ease', + backfaceVisibility: 'hidden', + '&:hover':{ + opacity: 0.3, + } }, })); @@ -149,18 +175,16 @@ function MovieCard({ return ( - {/* */} - {/* End hero unit */} - {/* */} - - {/* */} + - + + {/* */} Random Movie poster as a placeholder. - - + {/* */} + +
Description:
+ + {name} @@ -168,11 +192,7 @@ function MovieCard({ {year} -
- - Hello there - -
+
*/} diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 28ce14b..6060892 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -15,14 +15,22 @@ import MovieCard from "../movies/MovieCard.js"; import CssBaseline from '@material-ui/core/CssBaseline'; import Grid from '@material-ui/core/Grid'; import { makeStyles } from '@material-ui/core/styles'; -import Container from '@material-ui/core/Container'; +// import Container from '@material-ui/core/Container'; +import GridList from "@material-ui/core/GridList"; +import GridListTile from "@material-ui/core/GridListTile"; + +//reactstrap +// import { Container, Row, Col } from 'reactstrap'; const useStyles = makeStyles((theme) => ({ cardGrid: { - paddingTop: theme.spacing(8), + paddingTop: theme.spacing(2), paddingBottom: theme.spacing(8), }, + gridlist:{ + + } })); function Watchlist({ @@ -62,11 +70,11 @@ function Watchlist({ // {/* */} // {/* */} // {/* */} - - {/* */} - {/*
*/} - - {/* */} + // +
+ + {/* // + // */} {watchlist .filter((movie) => searchTerm !== "" @@ -88,8 +96,8 @@ function Watchlist({ onClick={() => setDeleteMode(!deleteMode)} > - - + {/* */} + {/* */} - + {/* */} + {/* */} {deleteMode && (
); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index e211d5f..d5f6b1b 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -4,21 +4,21 @@ import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid -import CssBaseline from '@material-ui/core/CssBaseline'; -import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; +import CssBaseline from "@material-ui/core/CssBaseline"; +import Grid from "@material-ui/core/Grid"; +import { makeStyles } from "@material-ui/core/styles"; -import Container from '@material-ui/core/Container'; -import Link from '@material-ui/core/Link'; -import AppBar from '@material-ui/core/AppBar'; -import Button from '@material-ui/core/Button'; -import CameraIcon from '@material-ui/icons/PhotoCamera'; -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Toolbar from '@material-ui/core/Toolbar'; -import Typography from '@material-ui/core/Typography'; +import Container from "@material-ui/core/Container"; +import Link from "@material-ui/core/Link"; +import AppBar from "@material-ui/core/AppBar"; +import Button from "@material-ui/core/Button"; +import CameraIcon from "@material-ui/icons/PhotoCamera"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import CardContent from "@material-ui/core/CardContent"; +import CardMedia from "@material-ui/core/CardMedia"; +import Toolbar from "@material-ui/core/Toolbar"; +import Typography from "@material-ui/core/Typography"; const useStyles = makeStyles((theme) => ({ // root:{ @@ -31,14 +31,14 @@ const useStyles = makeStyles((theme) => ({ // marginRight: theme.spacing(2), // }, // heroContent: { - // backgroundColor: theme.palette.background.paper, + // backgroundColor: theme.palette.background.paper, // padding: theme.spacing(8, 0, 6), // }, // heroButtons: { // marginTop: theme.spacing(4), // }, cardGrid: { - paddingTop: theme.spacing(8), + paddingTop: theme.spacing(4), paddingBottom: theme.spacing(8), display:'flex', flexDirection:'row', @@ -52,13 +52,13 @@ const useStyles = makeStyles((theme) => ({ height: '100%', display: 'flex', flexDirection: 'column', - // border: "1px solid #5B7648", + border: "1px solid #5B7648", width:'100%', // margin:0, // justifyContent:'center', '&:hover':{ background:'black', - opacity: 0.3 + // opacity: 0.3, }, moreInfo:{ display: 'flex', @@ -69,9 +69,12 @@ const useStyles = makeStyles((theme) => ({ // '&:hover':{ // opacity: 5, // } + // }, cardContent: { - flexGrow: 1, + // flexGrow: 1, + padding:0, + textAlign:'center', }, // name:{ @@ -80,22 +83,24 @@ const useStyles = makeStyles((theme) => ({ cardActions:{ // display:'flex', // flexDirection:'column' -margin:'auto', +// margin:'auto', +fontSize:'10px' }, stars:{ fontSize: '2.5vw', + alignContent:'center' }, - middle:{ - transition:' .5s ease', - opacity: 0, - position: 'absolute', - transform: 'translate(-50%, -50%)', - // -msTransform:' translate(-50%, -50%)', - textAlign: 'center', - '&:hover':{ - opacity: 1, - } - }, +// middle:{ +// transition:' .5s ease', +// opacity: 0, +// position: 'absolute', +// transform: 'translate(-50%, -50%)', +// -msTransform:' translate(-50%, -50%)', +// textAlign: 'center', +// '&:hover':{ +// opacity: 1, +// } +// }, text:{ backgroundColor: '#4CAF50', color: 'white', @@ -103,18 +108,25 @@ margin:'auto', opacity: 0, visibility: 'hidden', transition: 'opacity .2s, visibility .2s', + '&:hover':{ + opacity: 5, + }, }, + movieImg:{ width:'100%', opacity: 1, display: 'block', - height: 'auto', - transition: '5s ease', + // height: 'auto', + // transition: '5s ease', backfaceVisibility: 'hidden', - '&:hover':{ - opacity: 0.3, - } + // '&:hover':{ + // opacity: 0.3, + // } }, +watchList:{ + fontSize:'8px' +} })); // more fields will be appearing according to the Figma file @@ -162,6 +174,7 @@ function MovieCard({ movie_id: movie.movie_id, rating: newValue, }; + console.log(newRating); ratingAction(userid, newRating); setYourRating(true); }; @@ -173,20 +186,21 @@ function MovieCard({ }; return ( + - + // - +
{/* */} Random Movie poster as a placeholder. {/* */} -
Description:
+ {/*
Description:
*/} - + {name} @@ -194,8 +208,9 @@ function MovieCard({ - + + - +
-
+ ); } const mapStateToProps = (state) => { @@ -236,4 +252,4 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps, { ratingAction, addToWatchlistAction })( MovieCard -); +); \ No newline at end of file From e59441d34ef8210fa0c57bd2037d876914d728a9 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 30 Apr 2020 18:50:48 -0400 Subject: [PATCH 533/822] creates function to get user screen width --- src/utils/widthFinder.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/utils/widthFinder.js diff --git a/src/utils/widthFinder.js b/src/utils/widthFinder.js new file mode 100644 index 0000000..2c40402 --- /dev/null +++ b/src/utils/widthFinder.js @@ -0,0 +1,10 @@ +const widthFinder = (screenWidth) => { + console.log("passed down width", screenWidth); + if (parseInt(screenWidth) < 380) { + return true; + } else { + return false; + } +}; + +export default widthFinder; From 5b9241c06c3b1074cb853ba5c233edee122c54c4 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 30 Apr 2020 18:51:14 -0400 Subject: [PATCH 534/822] created script for node-sass --- css/main.css | 1 + package-lock.json | 12 +- package.json | 7 +- src/css/main.css | 896 ---------------------------------------------- 4 files changed, 11 insertions(+), 905 deletions(-) create mode 100644 css/main.css delete mode 100644 src/css/main.css diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..51deb47 --- /dev/null +++ b/css/main.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap");@import url(https://fonts.googleapis.com/css?family=Roboto:500);#root{}#root html,#root body{margin:0;padding:0;box-sizing:border-box}#root html *,#root body *{box-sizing:inherit}@-webkit-keyframes flexGrow{to{flex:1}}@-o-keyframes flexGrow{to{flex:1}}@keyframes flexGrow{to{flex:1}}@-webkit-keyframes flexShrink{to{flex:.01;flex:.00001}}@-o-keyframes flexShrink{to{flex:.01;flex:.00001}}@keyframes flexShrink{to{flex:.01;flex:.00001}}#root html{font-family:"Work Sans",sans-serif;font-weight:normal;color:#505050;font-size:14px}#root h1,#root h2,#root h3,#root h4,#root h5,#root h6{font-weight:bold;margin:0}#root h1 a,#root h2 a,#root h3 a,#root h4 a,#root h5 a,#root h6 a{font-weight:inherit}#root em{font-style:italic}#root strong{font-weight:bold}#root .uppercase{text-transform:uppercase}#root .lowercase{text-transform:lowercase}#root .App{min-height:100vh}#root .container.register-component,#root .container.login-component{font-family:"Work Sans",sans-serif;color:#fff;background:#505050;margin:0 auto;width:100%;min-height:100vh}#root .container.register-component .onboarding-nav,#root .container.login-component .onboarding-nav{color:#fff;display:flex;width:95%;margin:0 auto;justify-content:flex-end;padding:1.1% 1%}#root .container.register-component .box-container,#root .container.login-component .box-container{display:flex;justify-content:space-between;margin:0 auto;width:85%}#root .container.register-component .box-left,#root .container.login-component .box-left{width:45%;margin:0 1%;display:flex;justify-content:center;align-content:center;flex-direction:column;align-items:center;text-align:left;max-width:100%;box-sizing:border-box}#root .container.register-component .box-left .text-container,#root .container.login-component .box-left .text-container{white-space:nowrap}#root .container.register-component .box-left .text-container h1,#root .container.login-component .box-left .text-container h1{font-size:5vw}#root .container.register-component .box-left .text-container h5,#root .container.login-component .box-left .text-container h5{font-size:1.5vw;font-weight:normal;padding-top:2rem}#root .container.register-component .box-left .image-wrapper,#root .container.login-component .box-left .image-wrapper{width:75%;padding:5% 0}#root .container.register-component .box-left .image-wrapper .logo,#root .container.login-component .box-left .image-wrapper .logo{width:100%}#root .container.register-component .box-right,#root .container.login-component .box-right{display:flex;flex-direction:column;justify-content:center;align-items:center;margin:auto;padding:3%;border-radius:4px;background:#505050;width:100%;max-width:518px;height:550px}#root .container.register-component .box-right .form,#root .container.login-component .box-right .form{width:50%;display:flex;justify-content:center;flex-direction:column;align-items:center}#root .container.register-component .box-right .form-control,#root .container.login-component .box-right .form-control{border-radius:4px;border:1px solid #d8d8d8;max-width:320px;width:100%;height:auto;padding:2.7% 1.7%;margin:2.6% auto;margin-bottom:1rem}#root .container.register-component .box-right input::placeholder,#root .container.login-component .box-right input::placeholder{font-size:1.1rem;color:#d8d8d8}#root .container.register-component .box-right .bottom-form,#root .container.login-component .box-right .bottom-form{width:100%;display:flex;flex-direction:column-reverse;margin:0}#root .container.register-component .box-right .bottom-form .check-box-container,#root .container.login-component .box-right .bottom-form .check-box-container{display:flex;flex-direction:row;padding-top:13px;align-items:center}#root .container.register-component .box-right .bottom-form .check-box-container p,#root .container.login-component .box-right .bottom-form .check-box-container p{color:black;white-space:nowrap}#root .container.register-component .box-right .bottom-form .btn-container,#root .container.login-component .box-right .bottom-form .btn-container{width:100%;display:flex;align-items:center;flex-direction:column;padding-bottom:15px}#root .container.register-component .box-right .bottom-form .btn-container .signup-btn,#root .container.register-component .box-right .bottom-form .btn-container button.login-btn,#root .container.login-component .box-right .bottom-form .btn-container .signup-btn,#root .container.login-component .box-right .bottom-form .btn-container button.login-btn{border:none;width:100%;max-width:100%;height:50px;border-radius:4px;background:#00B392;color:#505050;font-size:14px;margin-bottom:2%}#root .container.register-component .box-right .bottom-form .btn-container .fancy,#root .container.login-component .box-right .bottom-form .btn-container .fancy{line-height:0.5;text-align:center;margin:1% 0}#root .container.register-component .box-right .bottom-form .btn-container .fancy span,#root .container.login-component .box-right .bottom-form .btn-container .fancy span{display:inline-block;position:relative}#root .container.register-component .box-right .bottom-form .btn-container .fancy span:before,#root .container.register-component .box-right .bottom-form .btn-container .fancy span:after,#root .container.login-component .box-right .bottom-form .btn-container .fancy span:before,#root .container.login-component .box-right .bottom-form .btn-container .fancy span:after{content:"";position:absolute;height:5px;border-bottom:1px solid white;top:0;width:104px}#root .container.register-component .box-right .bottom-form .btn-container .fancy span:before,#root .container.login-component .box-right .bottom-form .btn-container .fancy span:before{right:100%;margin-right:15px}#root .container.register-component .box-right .bottom-form .btn-container .fancy span:after,#root .container.login-component .box-right .bottom-form .btn-container .fancy span:after{left:100%;margin-left:15px}#root .container.register-component .box-right .bottom-form .btn-container .google-btn,#root .container.login-component .box-right .bottom-form .btn-container .google-btn{width:100%;height:50px;background-color:#fff;border-radius:4px;box-shadow:0 3px 4px 0 rgba(0,0,0,0.25);margin-top:2%}#root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper,#root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper{position:absolute;margin-top:4px;margin-left:1px;width:40px;height:40px;border-radius:2px;background-color:#fff}#root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon,#root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon{margin-top:11px;margin-left:11px;width:18px;height:18px}#root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text,#root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text{margin:7% 2% 0 30%;color:#505050;font-size:14px;letter-spacing:0.2px;font-family:"Roboto"}#root .container.register-component .box-right .bottom-form .btn-container .google-btn:hover,#root .container.login-component .box-right .bottom-form .btn-container .google-btn:hover{box-shadow:0 0 6px #4285f4}#root .container.register-component .box-right .bottom-form .btn-container .google-btn:active,#root .container.login-component .box-right .bottom-form .btn-container .google-btn:active{background:#fff}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn{width:100%;height:50px;background-color:#3A5A97;border-radius:4px;box-shadow:0 3px 4px 0 rgba(0,0,0,0.25);margin-top:2%}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper{position:absolute;margin-top:4px;margin-left:1px;width:40px;height:40px;border-radius:2px}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon{margin-top:11px;margin-left:11px;width:18px;height:18px}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn .btn-text,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn .btn-text{margin:7% 2% 0 30%;color:#fff;font-size:14px;letter-spacing:0.2px;font-family:"Roboto"}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn:hover,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn:hover{box-shadow:0 0 6px #4285f4}#root .container.register-component .box-right .bottom-form .btn-container .fb-btn:active,#root .container.login-component .box-right .bottom-form .btn-container .fb-btn:active{background:#fff}#root .container.register-component .box-right .bottomAccount,#root .container.login-component .box-right .bottomAccount{display:flex;flex-direction:column;padding:5%}#root .container.register-component .box-right .bottomAccount .loginAccount,#root .container.login-component .box-right .bottomAccount .loginAccount{text-align:center;color:#2477e5;font-size:18px}#root .container.register-component .box-right .bottomAccount .link,#root .container.login-component .box-right .bottomAccount .link{display:flex;width:100%;height:auto;font-size:1rem;text-decoration:none;flex-direction:column-reverse;align-items:center;color:#fff}#root .container.register-component .box-right .bottomAccount .link:hover,#root .container.login-component .box-right .bottomAccount .link:hover{color:#00b392;font-weight:bold}#root .container.register-component .box-right .callingError,#root .container.login-component .box-right .callingError{color:red;display:flex;justify-content:center}@media (max-width: 1068px){#root .container.register-component .box-container,#root .container.login-component .box-container{flex-direction:column;align-items:center}#root .container.register-component .box-container .box-left,#root .container.login-component .box-container .box-left{width:80%;margin:0;padding:0}#root .container.register-component .box-container .box-left .text-container,#root .container.login-component .box-container .box-left .text-container{margin:0 auto;width:100%}#root .container.register-component .box-container .box-left .text-container h1,#root .container.login-component .box-container .box-left .text-container h1{font-size:10vw}#root .container.register-component .box-container .box-left .text-container h5,#root .container.login-component .box-container .box-left .text-container h5{font-size:3vw}#root .container.register-component .box-container .box-left .image-wrapper,#root .container.login-component .box-container .box-left .image-wrapper{width:100%}#root .container.register-component .box-container .box-right,#root .container.login-component .box-container .box-right{width:100%;margin:0;padding:0}#root .container.register-component .box-container .box-right .form,#root .container.login-component .box-container .box-right .form{margin:0 auto;padding:0;max-width:100%;width:100%;color:#fff}#root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text,#root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text{margin:4% 2% 0 38%}#root .container.register-component .box-container .box-right .btn-container .fb-btn .btn-text,#root .container.login-component .box-container .box-right .btn-container .fb-btn .btn-text{margin:4% 2% 0 38%}}@media (max-width: 1068px) and (max-width: 600px){#root .container.register-component .box-container,#root .container.login-component .box-container{flex-direction:column;align-items:center}#root .container.register-component .box-container .box-left,#root .container.login-component .box-container .box-left{width:80%;margin:0;padding:0}#root .container.register-component .box-container .box-left .text-container,#root .container.login-component .box-container .box-left .text-container{margin:0 auto;width:100%}#root .container.register-component .box-container .box-left .text-container h1,#root .container.login-component .box-container .box-left .text-container h1{display:none}#root .container.register-component .box-container .box-left .text-container h5,#root .container.login-component .box-container .box-left .text-container h5{display:none}#root .container.register-component .box-container .box-left .image-wrapper,#root .container.login-component .box-container .box-left .image-wrapper{display:none}#root .container.register-component .box-container .box-left .image-wrapper .logo,#root .container.login-component .box-container .box-left .image-wrapper .logo{display:none}#root .container.register-component .box-container .box-right,#root .container.login-component .box-container .box-right{margin:2%;padding:0%;background:#505050;height:100%}#root .container.register-component .box-container .box-right .form,#root .container.login-component .box-container .box-right .form{max-width:100%}#root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn,#root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn,#root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn,#root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn{margin-top:3%}#root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:before,#root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:after,#root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before,#root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after{content:"";width:800%}#root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text,#root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text{margin:4% 2% 0 35%}#root .container.register-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text,#root .container.login-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text{margin:4% 2% 0 35%}#root .container.register-component .box-container .box-right .bottom-form .bottomAccount,#root .container.login-component .box-container .box-right .bottom-form .bottomAccount{padding:2%}#root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount,#root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount{font-size:9px}}#root .register.nav,#root .login.nav{font-family:"Work Sans",sans-serif;display:flex;justify-content:space-between;align-items:center;width:100%;text-align:center}@media (max-width: 600px){#root .register.nav,#root .login.nav{flex-direction:column}}#root .register.nav img,#root .login.nav img{align-items:center;height:2.5rem;width:auto}#root .register.nav .signin-title,#root .login.nav .signin-title{display:flex;color:white}@media (max-width: 600px){#root .signin-title{display:flex;justify-content:flex-start;margin-top:2%;font-size:20px}}#root .mainContainer{background:#505050;padding:1.1% 1%;font-family:"Work Sans",sans-serif}#root .mainContainer .navContainer{display:flex;justify-content:space-evenly;align-items:center;padding-right:1rem}@media only screen and (max-width: 750px){#root .mainContainer .navContainer{justify-content:space-around}}#root .mainContainer .navContainer .Bars{padding-top:5px}#root .mainContainer .navContainer .Bars .bars-icon{color:white;font-size:1.4rem}#root .mainContainer .navContainer .Links{width:60%;display:flex;justify-content:space-evenly;align-items:center;margin:0 .4rem}#root .mainContainer .navContainer .Links a.active{border-bottom:3px solid #00E6BC}#root .mainContainer .navContainer .Links img{height:2rem;width:auto}#root .mainContainer .navContainer .Links .Groa-NavLink:hover{color:white}#root .mainContainer .navContainer .Links .NavLink{color:white;text-decoration:none;margin:0 1%;transition:all 500ms linear}#root .mainContainer .navContainer .Links .NavLink:hover{color:white}@media only screen and (max-width: 600px){#root .mainContainer .navContainer .watchlist,#root .mainContainer .navContainer .recommended,#root .mainContainer .navContainer .explore,#root .mainContainer .navContainer .dropdown-hover .angle-down-icon{flex:.000000001;white-space:pre;padding:0;font-size:0;margin:0;opacity:0}}#root .mainContainer .navContainer .searchContainer{background-color:#21242C;padding:.4rem;border-radius:5px;display:flex;flex:1;justify-content:space-between;overflow:hidden;transition:all 500ms linear;min-width:20vw}#root .mainContainer .navContainer .searchContainer .search-wrapper{display:flex;align-items:center;width:75%}#root .mainContainer .navContainer .searchContainer .search-icon,#root .mainContainer .navContainer .searchContainer .backspace-icon{color:white;opacity:.4;font-size:1.2rem;padding:.2rem}#root .mainContainer .navContainer .searchContainer .backspace-icon{cursor:pointer}#root .mainContainer .navContainer .searchContainer .searchBox{font-size:1rem;background-color:#21242C;border:none;color:#fff}#root .mainContainer .navContainer .searchContainer input:focus{outline:none}#root .mainContainer .navContainer .searchContainer input:-webkit-autofill,#root .mainContainer .navContainer .searchContainer input:-webkit-autofill:hover,#root .mainContainer .navContainer .searchContainer input:-webkit-autofill:focus,#root .mainContainer .navContainer .searchContainer input:-webkit-autofill{-webkit-text-fill-color:#fff !important}#root .mainContainer .navContainer button{white-space:nowrap;font-size:1rem;padding:.4rem;margin:0 .6rem;border-radius:5px;background-color:#fff;cursor:pointer;transition:all 500ms linear}@media only screen and (max-width: 750px){#root .mainContainer .navContainer .Links{justify-content:space-between;padding:0%;margin-right:0%}#root .mainContainer .navContainer button{font-size:0;padding:.2rem;background-color:rgba(28,28,28,0);border:none}#root .mainContainer .navContainer .sync-icon{font-size:initial;color:#fff}#root .mainContainer .navContainer .searchContainer{min-width:35vw}}#root .mainContainer .navContainer .fa-icons{width:14%;display:flex;justify-content:space-between;font-size:1.6rem;color:white}#root .mainContainer button.hidden,#root .mainContainer .searchContainer.hidden,#root .mainContainer .hidden{min-width:0;flex:.000000001;white-space:pre;padding:0;font-size:0;margin:0;opacity:0}#root .mainContainer .dropdown-hover{padding:.25rem .5rem;position:relative;white-space:nowrap;cursor:pointer;display:flex;align-items:center}#root .mainContainer .dropdown-hover .angle-down-icon{padding-left:.5rem}#root .mainContainer .dropdown-hover .dropdown-content{display:none}#root .mainContainer .dropdown-hover:hover .dropdown-content{display:flex;flex-direction:column;position:absolute;top:2rem;right:.4rem;border-radius:5px;overflow:hidden;z-index:5;border:1px solid #D8D8D8}#root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink{border-top:1px solid #D8D8D8;color:#505050;text-decoration:none;font-size:1.1rem;padding:1rem 1.5rem;background:#fff;white-space:nowrap;text-align:center}#root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover{background-color:#D8D8D8}@media (hover: hover) and (pointer: fine){#root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover{background-color:#D8D8D8}}#root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu{display:none}#root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu,#root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu{display:none}@media only screen and (max-width: 750px){#root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu{display:none}#root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu,#root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu{display:block}}#root .container.post-login{background:white;color:black}#root .container.post-login header{margin:0% auto;text-align:center}#root .container.post-login header h1{font-size:4rem;margin-top:2.75%}#root .container.post-login header p{font-size:1.75rem;margin:2.24% auto;line-height:2.15rem;width:100%;max-width:425px;height:68;text-align:center}#root .container.post-login .choice-selection-container{text-align:center}#root .container.post-login .choice-selection-container h2{font-size:2.5rem;margin:2% 0% 4.25% 0%}#root .container.post-login .choice-selection-container .choice-selection{margin:auto;width:71%;display:flex;justify-content:space-around}#root .container.post-login .choice-selection-container .choice-selection .choice-box{width:35%;max-width:287px;height:550px;display:flex;flex-direction:column;justify-content:space-between}#root .container.post-login .choice-selection-container .choice-selection .choice-box h4{font-size:1.75rem;font-weight:bold;margin-bottom:27px}#root .container.post-login .choice-selection-container .choice-selection .choice-box .img-box{width:100%;max-width:285;height:auto}#root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn{width:100%;max-width:287px;height:51px;margin-top:32px;justify-content:flex-end;border:none;font-size:1.75rem;color:white;background:#21242c}#root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn:hover{color:#21242c;background:white;border:1px solid grey}#root .container.post-login .hidden,#root .container.post-login .setup-wizard.choice-box.hidden{display:none}#root .DataUploadPage{display:flex;justify-content:center;font-family:"Work Sans",sans-serif}#root .textholder1 h1{display:flex;justify-content:center;font-size:4em;margin-top:4%;margin-bottom:2%;font-weight:700;text-align:center}#root .textholder1 h2,#root .textholder1 h3{width:60%;text-align:center;margin:3.5% auto;display:flex;justify-content:center;font-weight:400;font-size:1.7em}@media only screen and (max-width: 500px){#root .textholder1{text-align:center;padding-top:25px}#root .textholder1 h1{display:flex;justify-content:center;font-size:180%;margin-top:4%}#root .textholder1 h2,#root .textholder1 h3{margin-top:15px;display:flex;justify-content:center;padding:0 35px 0 35px}}@media only screen and (max-width: 375px){#root .textholder1 h1{display:flex;justify-content:center;font-size:180%}#root .textholder1 h2,#root .textholder1 h3{margin-top:25px;display:flex;justify-content:center;padding:0 13px 0 13px}}#root .ptext{font-size:14px}@media only screen and (max-width: 375px){#root .ptext{padding-top:25px;font-size:10px}}#root .DboxContainer{display:flex;justify-content:space-around;margin-top:6%}#root .DboxContainer .DboxLeft,#root .DboxContainer .DboxRight{width:290px;height:250px;padding-top:15px}#root .DboxContainer .textContainer p{font-size:20px}#root .DboxContainer .textContainer p a#pLink{color:#2477e5;font-weight:700;text-decoration:none}@media only screen and (max-width: 500px){#root .DboxContainer .DboxLeft{display:flex}#root .DboxContainer .DboxLeft img{width:100px;height:auto}#root .DboxContainer .DboxRight{margin-top:72%;display:flex;width:360px}#root .DboxContainer .DboxRight img{width:100px;height:auto}}#root .dropdown{display:flex;position:relative;flex-direction:column;width:290px}#root .dropdown .centerBtn{margin:auto}#root .dropdown img{width:100%;max-width:164px;height:auto}#root .dropdown .dropBtn{width:220px;height:102px;background-color:#00b392;color:#ffffff;padding:0 35px 0 35px;font-size:20px;border:none;border-radius:6px;cursor:pointer;outline:inherit}#root .dropdown .dropdown-content{display:none;height:310px}#root .dropdown .dropdown-content p{color:black;padding:12px 16px;text-decoration:none;display:block}#root .dropdown .dropBtn:hover,#root .dropdown .dropBtn:focus{background-color:#00b392}#root .dropdown .dropdown a:hover{background-color:#ddd}#root .dropdown .show{display:block}@media only screen and (max-width: 500px){#root .dropdown .dropBtn{width:197px;height:80px;background-color:#00b392;color:#ffffff;padding:0 39px 0 39px;font-size:16px;border:none;border-radius:6px;cursor:pointer;outline:inherit}#root .dropdown .dropdown-content{height:280px}}@media only screen and (max-width: 375px){#root .dropdown .dropdown-content{height:320px}}#root .dropdown-content-Empty{display:block;height:310px;position:relative}@media only screen and (max-width: 500px){#root .dropdown-content-Empty{display:block;height:280px;position:relative}}@media only screen and (max-width: 375px){#root .dropdown-content-Empty{display:block;height:320px;position:relative}}#root .show2{display:none}#root .UploadContainer{display:flex;justify-content:center;align-content:center;position:relative}#root .UploadContainer .inputholder input[type="file"]{font-size:100px;position:absolute;left:0;top:0;opacity:0;max-width:100%}#root .UploadContainer label#uploadLabel{width:420px;text-align:center;margin:auto;padding:7% 0;cursor:pointer;font-size:16px;font-weight:700;display:inline-block;border:2px dashed #2477e5;border-radius:3px;color:#2477e5}#root .UploadContainer label#uploadLabel img{margin-top:4.3%}@media only screen and (max-width: 500px){#root .UploadContainer .inputholder{display:flex;justify-content:center;padding:10px;width:232px;height:66px}#root .UploadContainer .inputholder .uploadData{margin-top:25px;height:50px}}#root .textholder2{width:44%;margin:3.3% auto;text-align:center;font-size:14px;display:flex;justify-content:center}@media only screen and (max-width: 500px){#root .textholder2{width:80%;margin:6.6% auto}}#root .container.loading-screen{background:#000A12;display:flex;flex-direction:column;justify-content:center;height:100vh;font-family:"Work Sans",sans-serif}#root .container.loading-screen h4,#root .container.loading-screen p,#root .container.loading-screen .loading-component{margin:4.5% auto}#root .container.loading-screen h4{font-size:2.5rem;color:#ffffff;text-align:center;font-weight:700}#root .container.loading-screen p{font-size:1.4rem;text-align:center;line-height:2rem;color:#ffffff} diff --git a/package-lock.json b/package-lock.json index 34fb96b..0f3b81a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6640,9 +6640,9 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indent-string": { "version": "4.0.0", @@ -9501,9 +9501,9 @@ } }, "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", + "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", diff --git a/package.json b/package.json index 09fec47..f227e6a 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@testing-library/user-event": "^7.1.2", "acorn": "^7.1.1", "axios": "^0.19.2", - "node-sass": "^4.13.1", + "node-sass": "^4.14.0", "puppeteer": "^2.1.1", "react": "^16.13.1", "react-dom": "^16.13.1", @@ -35,7 +35,8 @@ "scripts": { "start": "react-scripts start", "build": "GENERATE_SOURCEMAP=false react-scripts build", - "test": "react-scripts test" + "test": "react-scripts test", + "node-sass": "node-sass --watch --output-style compressed -o css src/scss" }, "eslintConfig": { "extends": "react-app" @@ -56,4 +57,4 @@ "history": "^4.10.1", "redux-mock-store": "^1.5.4" } -} +} \ No newline at end of file diff --git a/src/css/main.css b/src/css/main.css deleted file mode 100644 index 34081b0..0000000 --- a/src/css/main.css +++ /dev/null @@ -1,896 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap"); -@import url(https://fonts.googleapis.com/css?family=Roboto:500); -#root { - /* - sources that helped me style the input - https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/ - - haven't added the functionality for drap and drop yet https://css-tricks.com/drag-and-drop-file-uploading/ -*/ } - #root html, - #root body { - margin: 0; - padding: 0; - box-sizing: border-box; } - #root html *, - #root body * { - box-sizing: inherit; } - -@-webkit-keyframes flexGrow { - to { - flex: 1; } } - -@-o-keyframes flexGrow { - to { - flex: 1; } } - -@keyframes flexGrow { - to { - flex: 1; } } - -@-webkit-keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - -@-o-keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - -@keyframes flexShrink { - to { - flex: .01; - flex: .00001; } } - #root html { - font-family: "Work Sans", sans-serif; - font-weight: normal; - color: #505050; - font-size: 14px; } - #root h1, - #root h2, - #root h3, - #root h4, - #root h5, - #root h6 { - font-weight: bold; - margin: 0; } - #root h1 a, - #root h2 a, - #root h3 a, - #root h4 a, - #root h5 a, - #root h6 a { - font-weight: inherit; } - #root em { - font-style: italic; } - #root strong { - font-weight: bold; } - #root .uppercase { - text-transform: uppercase; } - #root .lowercase { - text-transform: lowercase; } - #root .App { - min-height: 100vh; } - #root .container.register-component, - #root .container.login-component { - font-family: "Work Sans", sans-serif; - color: white; - background: #505050; - margin: 0 auto; - width: 100%; - min-height: 100vh; } - #root .container.register-component .onboarding-nav, - #root .container.login-component .onboarding-nav { - color: white; - display: flex; - width: 95%; - margin: 0 auto; - justify-content: flex-end; - padding: 1.1% 1%; } - #root .container.register-component .box-container, - #root .container.login-component .box-container { - display: flex; - justify-content: space-between; - margin: 0 auto; - width: 85%; } - #root .container.register-component .box-left, - #root .container.login-component .box-left { - width: 45%; - margin: 0 1%; - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - align-items: center; - text-align: left; - max-width: 100%; - box-sizing: border-box; } - #root .container.register-component .box-left .text-container, - #root .container.login-component .box-left .text-container { - white-space: nowrap; } - #root .container.register-component .box-left .text-container h1, - #root .container.login-component .box-left .text-container h1 { - font-size: 5vw; } - #root .container.register-component .box-left .text-container h5, - #root .container.login-component .box-left .text-container h5 { - font-size: 1.5vw; - font-weight: normal; - padding-top: 2rem; } - #root .container.register-component .box-left .image-wrapper, - #root .container.login-component .box-left .image-wrapper { - width: 75%; - padding: 5% 0; } - #root .container.register-component .box-left .image-wrapper .logo, - #root .container.login-component .box-left .image-wrapper .logo { - width: 100%; } - #root .container.register-component .box-right, - #root .container.login-component .box-right { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: auto; - padding: 3%; - border-radius: 4px; - background: #505050; - width: 100%; - max-width: 518px; - height: 550px; } - #root .container.register-component .box-right .form, - #root .container.login-component .box-right .form { - width: 50%; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; } - #root .container.register-component .box-right .form-control, - #root .container.login-component .box-right .form-control { - border-radius: 4px; - border: 1px solid #d8d8d8; - max-width: 320px; - width: 100%; - height: auto; - padding: 2.7% 1.7%; - margin: 2.6% auto; - margin-bottom: 1rem; } - #root .container.register-component .box-right input::placeholder, - #root .container.login-component .box-right input::placeholder { - font-size: 1.1rem; - color: #d8d8d8; } - #root .container.register-component .box-right .bottom-form, - #root .container.login-component .box-right .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; } - #root .container.register-component .box-right .bottom-form .check-box-container, - #root .container.login-component .box-right .bottom-form .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; } - #root .container.register-component .box-right .bottom-form .check-box-container p, - #root .container.login-component .box-right .bottom-form .check-box-container p { - color: black; - white-space: nowrap; } - #root .container.register-component .box-right .bottom-form .btn-container, - #root .container.login-component .box-right .bottom-form .btn-container { - width: 100%; - display: flex; - align-items: center; - flex-direction: column; - padding-bottom: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: #00B392; - color: #505050; - font-size: 14px; - margin-bottom: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy, - #root .container.login-component .box-right .bottom-form .btn-container .fancy { - line-height: 0.5; - text-align: center; - margin: 1% 0; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span { - display: inline-block; - position: relative; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - position: absolute; - height: 5px; - border-bottom: 1px solid white; - top: 0; - width: 104px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before { - right: 100%; - margin-right: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - left: 100%; - margin-left: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn { - width: 100%; - height: 50px; - background-color: white; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - background-color: white; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 7% 2% 0 30%; - color: #505050; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:active { - background: white; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn { - width: 100%; - height: 50px; - background-color: #3A5A97; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 7% 2% 0 30%; - color: white; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:active { - background: white; } - #root .container.register-component .box-right .bottomAccount, - #root .container.login-component .box-right .bottomAccount { - display: flex; - flex-direction: column; - padding: 5%; } - #root .container.register-component .box-right .bottomAccount .loginAccount, - #root .container.login-component .box-right .bottomAccount .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; } - #root .container.register-component .box-right .bottomAccount .link, - #root .container.login-component .box-right .bottomAccount .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - flex-direction: column-reverse; - align-items: center; - color: white; } - #root .container.register-component .box-right .bottomAccount .link:hover, - #root .container.login-component .box-right .bottomAccount .link:hover { - color: #00b392; - font-weight: bold; } - #root .container.register-component .box-right .callingError, - #root .container.login-component .box-right .callingError { - color: red; - display: flex; - justify-content: center; } - @media (max-width: 1068px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - font-size: 10vw; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - font-size: 3vw; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - width: 100%; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - width: 100%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - margin: 0 auto; - padding: 0; - max-width: 100%; - width: 100%; - color: white; } - #root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text { - margin: 4% 2% 0 38%; } - #root .container.register-component .box-container .box-right .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 38%; } } - -@media (max-width: 1068px) and (max-width: 600px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - display: none; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper .logo, - #root .container.login-component .box-container .box-left .image-wrapper .logo { - display: none; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - margin: 2%; - padding: 0%; - background: #505050; - height: 100%; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - max-width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { - margin-top: 3%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - width: 800%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { - padding: 2%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { - font-size: 9px; } } - #root .register.nav, - #root .login.nav { - font-family: "Work Sans", sans-serif; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - text-align: center; } - @media (max-width: 600px) { - #root .register.nav, - #root .login.nav { - flex-direction: column; } } - #root .register.nav img, - #root .login.nav img { - align-items: center; - height: 2.5rem; - width: auto; } - #root .register.nav .signin-title, - #root .login.nav .signin-title { - display: flex; - color: white; } - @media (max-width: 600px) { - #root .signin-title { - display: flex; - justify-content: flex-start; - margin-top: 2%; - font-size: 20px; } } - #root .mainContainer { - background: #505050; - padding: 1.1% 1%; - font-family: "Work Sans", sans-serif; } - #root .mainContainer .navContainer { - display: flex; - justify-content: space-evenly; - align-items: center; - padding-right: 1rem; } - @media only screen and (max-width: 750px) { - #root .mainContainer .navContainer { - justify-content: space-around; } } - #root .mainContainer .navContainer .Bars { - padding-top: 5px; } - #root .mainContainer .navContainer .Bars .bars-icon { - color: white; - font-size: 1.4rem; } - #root .mainContainer .navContainer .Links { - width: 60%; - display: flex; - justify-content: space-evenly; - align-items: center; - margin: 0 .4rem; } - #root .mainContainer .navContainer .Links a.active { - border-bottom: 3px solid #00E6BC; } - #root .mainContainer .navContainer .Links img { - height: 2rem; - width: auto; } - #root .mainContainer .navContainer .Links .Groa-NavLink:hover { - color: white; } - #root .mainContainer .navContainer .Links .NavLink { - color: white; - text-decoration: none; - margin: 0 1%; - transition: all 500ms linear; } - #root .mainContainer .navContainer .Links .NavLink:hover { - color: white; } - @media only screen and (max-width: 600px) { - #root .mainContainer .navContainer .watchlist, - #root .mainContainer .navContainer .recommended, - #root .mainContainer .navContainer .explore, - #root .mainContainer .navContainer .dropdown-hover .angle-down-icon { - flex: .000000001; - white-space: pre; - padding: 0; - font-size: 0; - margin: 0; - opacity: 0; } } - #root .mainContainer .navContainer .searchContainer { - background-color: #21242C; - padding: .4rem; - border-radius: 5px; - display: flex; - flex: 1; - justify-content: space-between; - overflow: hidden; - transition: all 500ms linear; - min-width: 20vw; } - #root .mainContainer .navContainer .searchContainer .search-wrapper { - display: flex; - align-items: center; - width: 75%; } - #root .mainContainer .navContainer .searchContainer .search-icon, - #root .mainContainer .navContainer .searchContainer .backspace-icon { - color: white; - opacity: .4; - font-size: 1.2rem; - padding: .2rem; } - #root .mainContainer .navContainer .searchContainer .backspace-icon { - cursor: pointer; } - #root .mainContainer .navContainer .searchContainer .searchBox { - font-size: 1rem; - background-color: #21242C; - border: none; - color: white; } - #root .mainContainer .navContainer .searchContainer input:focus { - outline: none; } - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:hover, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill:focus, - #root .mainContainer .navContainer .searchContainer input:-webkit-autofill { - -webkit-text-fill-color: white !important; } - #root .mainContainer .navContainer button { - white-space: nowrap; - font-size: 1rem; - padding: .4rem; - margin: 0 .6rem; - border-radius: 5px; - background-color: white; - cursor: pointer; - transition: all 500ms linear; } - @media only screen and (max-width: 750px) { - #root .mainContainer .navContainer .Links { - justify-content: space-between; - padding: 0%; - margin-right: 0%; } - #root .mainContainer .navContainer button { - font-size: 0; - padding: .2rem; - background-color: rgba(28, 28, 28, 0); - border: none; } - #root .mainContainer .navContainer .sync-icon { - font-size: initial; - color: white; } - #root .mainContainer .navContainer .searchContainer { - min-width: 35vw; } } - #root .mainContainer .navContainer .fa-icons { - width: 14%; - display: flex; - justify-content: space-between; - font-size: 1.6rem; - color: white; } - #root .mainContainer button.hidden, - #root .mainContainer .searchContainer.hidden, - #root .mainContainer .hidden { - min-width: 0; - flex: .000000001; - white-space: pre; - padding: 0; - font-size: 0; - margin: 0; - opacity: 0; } - #root .mainContainer .dropdown-hover { - padding: .25rem .5rem; - position: relative; - white-space: nowrap; - cursor: pointer; - display: flex; - align-items: center; } - #root .mainContainer .dropdown-hover .angle-down-icon { - padding-left: .5rem; } - #root .mainContainer .dropdown-hover .dropdown-content { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content { - display: flex; - flex-direction: column; - position: absolute; - top: 2rem; - right: .4rem; - border-radius: 5px; - overflow: hidden; - z-index: 5; - border: 1px solid #D8D8D8; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink { - border-top: 1px solid #D8D8D8; - color: #505050; - text-decoration: none; - font-size: 1.1rem; - padding: 1rem 1.5rem; - background: white; - white-space: nowrap; - text-align: center; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { - background-color: #D8D8D8; } - @media (hover: hover) and (pointer: fine) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink:hover { - background-color: #D8D8D8; } } - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, - #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { - display: none; } - @media only screen and (max-width: 750px) { - #root .mainContainer .dropdown-hover:hover .dropdown-content .watchlist-menu { - display: none; } - #root .mainContainer .dropdown-hover:hover .dropdown-content .recommended-menu, - #root .mainContainer .dropdown-hover:hover .dropdown-content .explore-menu { - display: block; } } - #root .container.post-login { - background: white; - color: black; } - #root .container.post-login header { - margin: 0% auto; - text-align: center; } - #root .container.post-login header h1 { - font-size: 4rem; - margin-top: 2.75%; } - #root .container.post-login header p { - font-size: 1.75rem; - margin: 2.24% auto; - line-height: 2.15rem; - width: 100%; - max-width: 425px; - height: 68; - text-align: center; } - #root .container.post-login .choice-selection-container { - text-align: center; } - #root .container.post-login .choice-selection-container h2 { - font-size: 2.5rem; - margin: 2% 0% 4.25% 0%; } - #root .container.post-login .choice-selection-container .choice-selection { - margin: auto; - width: 71%; - display: flex; - justify-content: space-around; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box { - width: 35%; - max-width: 287px; - height: 550px; - display: flex; - flex-direction: column; - justify-content: space-between; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box h4 { - font-size: 1.75rem; - font-weight: bold; - margin-bottom: 27px; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .img-box { - width: 100%; - max-width: 285; - height: auto; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn { - width: 100%; - max-width: 287px; - height: 51px; - margin-top: 32px; - justify-content: flex-end; - border: none; - font-size: 1.75rem; - color: white; - background: #21242c; } - #root .container.post-login .choice-selection-container .choice-selection .choice-box .select-btn:hover { - color: #21242c; - background: white; - border: 1px solid grey; } - #root .container.post-login .hidden, - #root .container.post-login .setup-wizard.choice-box.hidden { - display: none; } - #root .DataUploadPage { - display: flex; - justify-content: center; - font-family: "Work Sans", sans-serif; } - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 4em; - margin-top: 4%; - margin-bottom: 2%; - font-weight: 700; - text-align: center; } - #root .textholder1 h2, - #root .textholder1 h3 { - width: 60%; - text-align: center; - margin: 3.5% auto; - display: flex; - justify-content: center; - font-weight: 400; - font-size: 1.7em; } - @media only screen and (max-width: 500px) { - #root .textholder1 { - text-align: center; - padding-top: 25px; } - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 180%; - margin-top: 4%; } - #root .textholder1 h2, - #root .textholder1 h3 { - margin-top: 15px; - display: flex; - justify-content: center; - padding: 0 35px 0 35px; } } - @media only screen and (max-width: 375px) { - #root .textholder1 h1 { - display: flex; - justify-content: center; - font-size: 180%; } - #root .textholder1 h2, - #root .textholder1 h3 { - margin-top: 25px; - display: flex; - justify-content: center; - padding: 0 13px 0 13px; } } - #root .ptext { - font-size: 14px; } - @media only screen and (max-width: 375px) { - #root .ptext { - padding-top: 25px; - font-size: 10px; } } - #root .DboxContainer { - display: flex; - justify-content: space-around; - margin-top: 6%; } - #root .DboxContainer .DboxLeft, - #root .DboxContainer .DboxRight { - width: 290px; - height: 250px; - padding-top: 15px; } - #root .DboxContainer .textContainer p { - font-size: 20px; } - #root .DboxContainer .textContainer p a#pLink { - color: #2477e5; - font-weight: 700; - text-decoration: none; } - @media only screen and (max-width: 500px) { - #root .DboxContainer .DboxLeft { - display: flex; } - #root .DboxContainer .DboxLeft img { - width: 100px; - height: auto; } - #root .DboxContainer .DboxRight { - margin-top: 72%; - display: flex; - width: 360px; } - #root .DboxContainer .DboxRight img { - width: 100px; - height: auto; } } - #root .dropdown { - display: flex; - position: relative; - flex-direction: column; - width: 290px; } - #root .dropdown .centerBtn { - margin: auto; } - #root .dropdown img { - width: 100%; - max-width: 164px; - height: auto; } - #root .dropdown .dropBtn { - width: 220px; - height: 102px; - background-color: #00b392; - color: #ffffff; - padding: 0 35px 0 35px; - font-size: 20px; - border: none; - border-radius: 6px; - cursor: pointer; - outline: inherit; } - #root .dropdown .dropdown-content { - display: none; - height: 310px; } - #root .dropdown .dropdown-content p { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; } - #root .dropdown .dropBtn:hover, - #root .dropdown .dropBtn:focus { - background-color: #00b392; } - #root .dropdown .dropdown a:hover { - background-color: #ddd; } - #root .dropdown .show { - display: block; } - @media only screen and (max-width: 500px) { - #root .dropdown .dropBtn { - width: 197px; - height: 80px; - background-color: #00b392; - color: #ffffff; - padding: 0 39px 0 39px; - font-size: 16px; - border: none; - border-radius: 6px; - cursor: pointer; - outline: inherit; } - #root .dropdown .dropdown-content { - height: 280px; } } - @media only screen and (max-width: 375px) { - #root .dropdown .dropdown-content { - height: 320px; } } - #root .dropdown-content-Empty { - display: block; - height: 310px; - position: relative; } - @media only screen and (max-width: 500px) { - #root .dropdown-content-Empty { - display: block; - height: 280px; - position: relative; } } - @media only screen and (max-width: 375px) { - #root .dropdown-content-Empty { - display: block; - height: 320px; - position: relative; } } - #root .show2 { - display: none; } - #root .UploadContainer { - display: flex; - justify-content: center; - align-content: center; - position: relative; } - #root .UploadContainer .inputholder input[type="file"] { - font-size: 100px; - position: absolute; - left: 0; - top: 0; - opacity: 0; - max-width: 100%; } - #root .UploadContainer label#uploadLabel { - width: 420px; - text-align: center; - margin: auto; - padding: 7% 0; - cursor: pointer; - font-size: 16px; - font-weight: 700; - display: inline-block; - border: 2px dashed #2477e5; - border-radius: 3px; - color: #2477e5; } - #root .UploadContainer label#uploadLabel img { - margin-top: 4.3%; } - @media only screen and (max-width: 500px) { - #root .UploadContainer .inputholder { - display: flex; - justify-content: center; - padding: 10px; - width: 232px; - height: 66px; } - #root .UploadContainer .inputholder .uploadData { - margin-top: 25px; - height: 50px; } } - #root .textholder2 { - width: 44%; - margin: 3.3% auto; - text-align: center; - font-size: 14px; - display: flex; - justify-content: center; } - @media only screen and (max-width: 500px) { - #root .textholder2 { - width: 80%; - margin: 6.6% auto; } } - #root .container.loading-screen { - background: #000A12; - display: flex; - flex-direction: column; - justify-content: center; - height: 100vh; - font-family: "Work Sans", sans-serif; } - #root .container.loading-screen h4, - #root .container.loading-screen p, - #root .container.loading-screen .loading-component { - margin: 4.5% auto; } - #root .container.loading-screen h4 { - font-size: 2.5rem; - color: #ffffff; - text-align: center; - font-weight: 700; } - #root .container.loading-screen p { - font-size: 1.4rem; - text-align: center; - line-height: 2rem; - color: #ffffff; } From e526674f46e1ac0fcaebc38b8bf7c7a6441c48c1 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 30 Apr 2020 18:51:39 -0400 Subject: [PATCH 535/822] preitter linter run --- src/components/movies/MovieCard.js | 208 ++++++++++++++--------------- 1 file changed, 101 insertions(+), 107 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index bbeee09..7b22175 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -40,29 +40,28 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(8), - display:'flex', - flexDirection:'row', + display: "flex", + flexDirection: "row", // paddingLeft: theme.spacing(8), // paddingRight: theme.spacing(8), // width: "100%" // justify:'center', - }, card: { - height: '100%', - display: 'flex', - flexDirection: 'column', + height: "100%", + display: "flex", + flexDirection: "column", border: "1px solid #5B7648", - width:'100%', + width: "100%", // margin:0, // justifyContent:'center', - '&:hover':{ - background:'black', + "&:hover": { + background: "black", // opacity: 0.3, }, - moreInfo:{ - display: 'flex', - flexDirection: 'row', + moreInfo: { + display: "flex", + flexDirection: "row", }, }, // cardMedia: { @@ -73,62 +72,61 @@ const useStyles = makeStyles((theme) => ({ // }, cardContent: { // flexGrow: 1, - padding:0, - textAlign:'center', + padding: 0, + textAlign: "center", + }, + + // name:{ + // width: '100%' + // }, + cardActions: { + // display:'flex', + // flexDirection:'column' + // margin:'auto', + fontSize: "10px", }, - -// name:{ -// width: '100%' -// }, - cardActions:{ -// display:'flex', -// flexDirection:'column' -// margin:'auto', -fontSize:'10px' - }, - stars:{ - fontSize: '2.5vw', - alignContent:'center' - }, -// middle:{ -// transition:' .5s ease', -// opacity: 0, -// position: 'absolute', -// transform: 'translate(-50%, -50%)', -// -msTransform:' translate(-50%, -50%)', -// textAlign: 'center', -// '&:hover':{ -// opacity: 1, -// } -// }, - text:{ - backgroundColor: '#4CAF50', - color: 'white', - fontSize: '16px', - opacity: 0, - visibility: 'hidden', - transition: 'opacity .2s, visibility .2s', - '&:hover':{ - opacity: 5, + stars: { + fontSize: "2.5vw", + alignContent: "center", + }, + // middle:{ + // transition:' .5s ease', + // opacity: 0, + // position: 'absolute', + // transform: 'translate(-50%, -50%)', + // -msTransform:' translate(-50%, -50%)', + // textAlign: 'center', + // '&:hover':{ + // opacity: 1, + // } + // }, + text: { + backgroundColor: "#4CAF50", + color: "white", + fontSize: "16px", + opacity: 0, + visibility: "hidden", + transition: "opacity .2s, visibility .2s", + "&:hover": { + opacity: 5, + }, }, - }, - - movieImg:{ - width:'100%', - opacity: 1, - display: 'block', - // height: 'auto', - // transition: '5s ease', - backfaceVisibility: 'hidden', - // '&:hover':{ - // opacity: 0.3, - // } - }, -watchList:{ - fontSize:'8px' -} + movieImg: { + width: "100%", + opacity: 1, + display: "block", + // height: 'auto', + // transition: '5s ease', + backfaceVisibility: "hidden", + // '&:hover':{ + // opacity: 0.3, + // } + }, + watchList: { + fontSize: "8px", + }, })); // more fields will be appearing according to the Figma file @@ -160,7 +158,6 @@ function MovieCard({ const classes = useStyles(); // const [spacing, setSpacing] = React.useState(2); - /* Used to format the movie object for action calls */ let movie = { movie_id: movie_id, @@ -188,44 +185,44 @@ function MovieCard({ }; return ( + // + +
+ {/* */} + Random Movie poster as a placeholder. + {/* */} - - // + {/*
Description:
*/} -
- - {/* */} - Random Movie poster as a placeholder. - {/* */} - - {/*
Description:
*/} - - - - - {name} - - - {year} - + + + {name} + + {year} + + + + - - - - - - - - + - -
- - - + /> + +
); } const mapStateToProps = (state) => { @@ -254,4 +248,4 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps, { ratingAction, addToWatchlistAction })( MovieCard -); \ No newline at end of file +); From 5e7d236839b27100e24c537a996943a50a83c9ae Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 30 Apr 2020 18:51:52 -0400 Subject: [PATCH 536/822] sets responsive col change --- src/components/dashboard/Watchlist.js | 51 ++++++++++++--------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6060892..dd8f99a 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -7,31 +7,26 @@ import { getWatchlistAction, setFilter, } from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; + // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; //for grid -import CssBaseline from '@material-ui/core/CssBaseline'; -import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; // import Container from '@material-ui/core/Container'; -import GridList from "@material-ui/core/GridList"; -import GridListTile from "@material-ui/core/GridListTile"; //reactstrap // import { Container, Row, Col } from 'reactstrap'; - const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(2), paddingBottom: theme.spacing(8), }, - gridlist:{ - - } - })); function Watchlist({ userid, @@ -49,6 +44,8 @@ function Watchlist({ const classes = useStyles(); const [spacing, setSpacing] = React.useState(2); + const screenWidth = widthFinder(window.innerWidth); + useEffect(() => { setFilter(""); // Returns the users watchlist from the database @@ -58,22 +55,26 @@ function Watchlist({ function handleClick(id) { removeFromWatchlistAction(userid, id); } + console.log("this is suppose to be true or false", screenWidth); if (isFetching) return ; else if (isDeleting) return ; else return ( - - // /* */} // {/* */} // {/* */} // {/* */} // {/* */} - // + //
- - {/* // + + {/* // // */} {watchlist .filter((movie) => @@ -85,19 +86,14 @@ function Watchlist({ : true ) .map((movie, index) => { - let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
setDeleteMode(!deleteMode)} - > - {/* */} - {/* */} +
setDeleteMode(!deleteMode)}> + {/* */} + {/* */} - {/* */} + {/* */} {/* */} {deleteMode && (
+ +
); } From ed436d2a0f1e516c31508f7373c71842bbc3fd30 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 30 Apr 2020 15:56:09 -0700 Subject: [PATCH 537/822] update movie card grid - 3 col created on mobile --- src/components/dashboard/Navigation.js | 291 +++++++++++++------------ src/components/dashboard/Ratings.js | 68 +++--- src/components/dashboard/Watchlist.js | 44 ++-- src/components/movies/MovieCard.js | 200 ++++++++--------- 4 files changed, 302 insertions(+), 301 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 67eae46..391e096 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -63,21 +63,21 @@ const drawerWidth = 240; const useStyles = makeStyles(theme => ({ searchContainer: { width: "40%", - margin:'auto', - backgroundColor:'#505050', + margin: 'auto', + backgroundColor: '#505050', }, [theme.breakpoints.down("xs")]: { - searchContainer:{ - width:"90%", + searchContainer: { + width: "90%", + }, + userIcon: { + display: 'none', + }, + groaLogo: { + flex: 'display', + justifyContent: 'center', }, - userIcon:{ - display:'none', - }, - groaLogo:{ - flex:'display', - justifyContent:'center', - }, }, search: { // display:'flex', @@ -87,7 +87,7 @@ const useStyles = makeStyles(theme => ({ backgroundColor: '#ffffff', "&:hover": { backgroundColor: '#5c5b5b', - color:'#ffffff', + color: '#ffffff', }, width: "100%", [theme.breakpoints.down("sm")]: { @@ -105,13 +105,13 @@ const useStyles = makeStyles(theme => ({ color: '#505050', "&:hover": { // backgroundColor: '#5c5b5b', - color:'#D8D8D8', + color: '#D8D8D8', }, }, inputRoot: { color: "#505050", "&:hover": { - color:'#ffffff', + color: '#ffffff', }, }, inputInput: { @@ -125,7 +125,7 @@ const useStyles = makeStyles(theme => ({ //for nav bar root: { display: 'flex', - flexDirection:'column' + flexDirection: 'column' }, appBar: { transition: theme.transitions.create(['margin', 'width'], { @@ -178,29 +178,29 @@ const useStyles = makeStyles(theme => ({ }), marginLeft: 0, }, - toolBar:{ - backgroundColor:'#505050', - display:'flex', - justifyContent:'space-between' + toolBar: { + backgroundColor: '#505050', + display: 'flex', + justifyContent: 'space-between' }, - appBar:{ - backgroundColor:'#5c5b5b' + appBar: { + backgroundColor: '#5c5b5b' }, groaLogo: { - height:'2rem', + height: '2rem', width: 'auto', }, - - drawerContainer:{ - display:'flex', - flexDirection:'column', - + + drawerContainer: { + display: 'flex', + flexDirection: 'column', + }, - -// [theme.breakpoints.down("xs")]: { -// margin:0, - -// }, + + // [theme.breakpoints.down("xs")]: { + // margin:0, + + // }, })); @@ -210,35 +210,36 @@ const Navigation = props => { const [open, setOpen] = React.useState(false); // for side bar menu const linkAttributes = [{ - id:0, + id: 0, name: "Upload", - icon: + icon: }, { - id:1, + id: 1, name: "Explore", - icon: + icon: }, { - id:2, + id: 2, name: "Recommendations", - icon: + icon: }, { - id:3, + id: 3, name: "Watchlist", - icon: + icon: }, { - id:4, + id: 4, name: "Ratings", icon: }, - {id:5, - name:'Log Out', - icon: + { + id: 5, + name: 'Log Out', + icon: }, -]; + ]; const handleDrawerOpen = () => { setOpen(true); @@ -295,95 +296,95 @@ const Navigation = props => { return (
- - - - - - - - Groa Logo - - - - - Ratings - Upload - Logout - - - - - - - - -
-
-
- -
- + + + + + + + + Groa Logo + + + + + Ratings + Upload + Logout + + + + + + + + +
+
+
+
- -
- - - -
- - {theme.direction === 'ltr' ? : } - -
- - - {linkAttributes.map((linkObject, index) => ( - - {linkObject.icon} - - - ))} - - - {/* + +
+ +
+ + + +
+ + {theme.direction === 'ltr' ? : } + +
+ + + {linkAttributes.map((linkObject, index) => ( + + {linkObject.icon} + + + ))} + + + {/* {['All mail', 'Trash', 'Spam'].map((text, index) => ( {index % 2 === 0 ? : } @@ -391,19 +392,19 @@ const Navigation = props => { ))} */} - -
-
-
- -
- + + +
+
+ +
+
- +
); }; diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 48b6b2c..42817e2 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -17,7 +17,7 @@ const useStyles = makeStyles((theme) => ({ paddingTop: theme.spacing(2), paddingBottom: theme.spacing(8), }, - + })); function Ratings({ userid, @@ -41,46 +41,46 @@ function Ratings({ //
- {ratings - .filter((movie) => - searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + {ratings + .filter((movie) => + searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + + return ( - return ( - - - - - ); + ? unsplashUrl + : moviePoster + } + /> + + + ); - } - )} + } + )} {/*
*/}
diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6060892..0d3b2e1 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -28,10 +28,10 @@ const useStyles = makeStyles((theme) => ({ paddingTop: theme.spacing(2), paddingBottom: theme.spacing(8), }, - gridlist:{ - + gridlist: { + } - + })); function Watchlist({ userid, @@ -64,24 +64,24 @@ function Watchlist({ else return ( - + // /* */} // {/* */} // {/* */} // {/* */} // {/* */} - // + //
- - {/* // + + {/* // // */} {watchlist .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -93,27 +93,27 @@ function Watchlist({ return (
setDeleteMode(!deleteMode)} > - {/* */} - {/* */} + {/* */} + {/* */} - {/* */} + {/* */} {/* */} {deleteMode && (
+
+
); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index bbeee09..9af7d9d 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -40,8 +40,8 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(8), - display:'flex', - flexDirection:'row', + display: 'flex', + flexDirection: 'row', // paddingLeft: theme.spacing(8), // paddingRight: theme.spacing(8), // width: "100%" @@ -53,14 +53,14 @@ const useStyles = makeStyles((theme) => ({ display: 'flex', flexDirection: 'column', border: "1px solid #5B7648", - width:'100%', - // margin:0, + width: '100%', + margin:'1%', // justifyContent:'center', - '&:hover':{ - background:'black', + '&:hover': { + background: 'black', // opacity: 0.3, }, - moreInfo:{ + moreInfo: { display: 'flex', flexDirection: 'row', }, @@ -73,61 +73,61 @@ const useStyles = makeStyles((theme) => ({ // }, cardContent: { // flexGrow: 1, - padding:0, - textAlign:'center', + padding: 0, + textAlign: 'center', + }, + + // name:{ + // width: '100%' + // }, + cardActions: { + // display:'flex', + // flexDirection:'column' + // margin:'auto', + fontSize: '10px' + }, + stars: { + fontSize: '2.5vw', + alignContent: 'center' + }, + // middle:{ + // transition:' .5s ease', + // opacity: 0, + // position: 'absolute', + // transform: 'translate(-50%, -50%)', + // -msTransform:' translate(-50%, -50%)', + // textAlign: 'center', + // '&:hover':{ + // opacity: 1, + // } + // }, + text: { + backgroundColor: '#4CAF50', + color: 'white', + fontSize: '16px', + opacity: 0, + visibility: 'hidden', + transition: 'opacity .2s, visibility .2s', + '&:hover': { + opacity: 5, + }, }, - -// name:{ -// width: '100%' -// }, - cardActions:{ -// display:'flex', -// flexDirection:'column' -// margin:'auto', -fontSize:'10px' - }, - stars:{ - fontSize: '2.5vw', - alignContent:'center' - }, -// middle:{ -// transition:' .5s ease', -// opacity: 0, -// position: 'absolute', -// transform: 'translate(-50%, -50%)', -// -msTransform:' translate(-50%, -50%)', -// textAlign: 'center', -// '&:hover':{ -// opacity: 1, -// } -// }, - text:{ - backgroundColor: '#4CAF50', - color: 'white', - fontSize: '16px', - opacity: 0, - visibility: 'hidden', - transition: 'opacity .2s, visibility .2s', - '&:hover':{ - opacity: 5, + + movieImg: { + width: '100%', + opacity: 1, + display: 'block', + // height: 'auto', + // transition: '5s ease', + backfaceVisibility: 'hidden', + // '&:hover':{ + // opacity: 0.3, + // } }, - }, - - movieImg:{ - width:'100%', - opacity: 1, - display: 'block', - // height: 'auto', - // transition: '5s ease', - backfaceVisibility: 'hidden', - // '&:hover':{ - // opacity: 0.3, - // } - }, -watchList:{ - fontSize:'8px' -} + watchList: { + fontSize: '8px' + } })); @@ -189,43 +189,43 @@ function MovieCard({ return ( - - // -
- - {/* */} - Random Movie poster as a placeholder. - {/* */} - - {/*
Description:
*/} - - - - - {name} - - - {year} - + // - - - - - - - - + + {/* */} + Random Movie poster as a placeholder. + {/* */} + + {/*
Description:
*/} + + + + + {name} + + + {year} + + + + + + + + + + - -
- - - + /> + +
+ + + ); } const mapStateToProps = (state) => { From 2614ba20c40760277287f5dc85447db1c417ab0c Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 30 Apr 2020 19:25:10 -0700 Subject: [PATCH 538/822] clean up code, remove what not needed --- src/components/dashboard/Explore.js | 32 +++--- src/components/dashboard/Navigation.js | 60 ++--------- src/components/dashboard/Ratings.js | 31 +++--- src/components/dashboard/Recommendations.js | 2 - src/components/dashboard/Watchlist.js | 111 ++++++++------------ src/components/movies/MovieCard.js | 68 +----------- 6 files changed, 87 insertions(+), 217 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index e731cd8..b5891f1 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -1,20 +1,20 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { ifDev } from "../../utils/removeAttribute.js"; import { getMoviesAction, setFilter, recommendationAction, } from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; + // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid -import CssBaseline from '@material-ui/core/CssBaseline'; -import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; -import Container from '@material-ui/core/Container'; +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -33,6 +33,9 @@ function Explore({ setFilter, ratings, }) { + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); + useEffect(() => { setFilter(""); // Returns the movies @@ -42,16 +45,15 @@ function Explore({ }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); // How many movies render const cardAmount = 25; - const classes = useStyles(); - if (isFetching) return ; else return ( - //
- //
- - + {movies .filter((movie) => !ratings.includes( @@ -80,10 +82,7 @@ function Explore({ let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - - - ); })} - {/*
-
*/} -
+ ); } diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 391e096..1a7ffd8 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -1,5 +1,4 @@ import React, { useState } from "react"; -import { NavLink } from "react-router-dom"; import { connect } from "react-redux"; import { loginAction, @@ -7,26 +6,15 @@ import { recommendationAction } from "../../store/actions"; // import debounce from "../../utils/debounce"; -import { - // faSearch, - faUserCircle, - faAngleDown, - faBars, - faSync, - // faBackspace -} from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { ifDev } from "../../utils/removeAttribute.js"; import GroaLogo from "../../img/groa-logo-nav.png"; //for search bar -import { makeStyles, fade, useTheme } from "@material-ui/core/styles"; +import { makeStyles, useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; //for the navbar import clsx from 'clsx'; -// import { makeStyles, useTheme } from '@material-ui/core/styles'; import Drawer from '@material-ui/core/Drawer'; import CssBaseline from '@material-ui/core/CssBaseline'; import AppBar from '@material-ui/core/AppBar'; @@ -41,8 +29,6 @@ import ChevronRightIcon from '@material-ui/icons/ChevronRight'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; -import InboxIcon from '@material-ui/icons/MoveToInbox'; -import MailIcon from '@material-ui/icons/Mail'; //for user toggle menu import Button from '@material-ui/core/Button'; import Menu from '@material-ui/core/Menu'; @@ -80,8 +66,6 @@ const useStyles = makeStyles(theme => ({ }, }, search: { - // display:'flex', - // alignItems:'center', position: "relative", borderRadius: theme.shape.borderRadius, backgroundColor: '#ffffff', @@ -183,24 +167,14 @@ const useStyles = makeStyles(theme => ({ display: 'flex', justifyContent: 'space-between' }, - appBar: { - backgroundColor: '#5c5b5b' - }, groaLogo: { height: '2rem', width: 'auto', }, - drawerContainer: { display: 'flex', flexDirection: 'column', - }, - - // [theme.breakpoints.down("xs")]: { - // margin:0, - - // }, })); @@ -277,27 +251,26 @@ const Navigation = props => { if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); }; - const clearInput = e => { - setQuery({ query: "" }); - props.setFilter(""); - }; + // const clearInput = e => { + // setQuery({ query: "" }); + // props.setFilter(""); + // }; const logout = () => { localStorage.removeItem("token"); localStorage.removeItem("state"); }; - const getNewRecommendations = id => { - // Gets new recommendations for account, if applicible - props.recommendationAction(id); - }; - + // const getNewRecommendations = id => { + // Gets new recommendations for account, if applicible + // props.recommendationAction(id); + // }; return (
- { Groa Logo - @@ -331,12 +303,6 @@ const Navigation = props => { Upload Logout - - - - - -
@@ -356,10 +322,8 @@ const Navigation = props => { onKeyDown={handleSubmit} />
-
- { ))} */} -
{ })} >
-
-
-
); }; diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 42817e2..b82a381 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -1,16 +1,15 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { ifDev } from "../../utils/removeAttribute.js"; import { getRatingAction, setFilter } from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid -import CssBaseline from '@material-ui/core/CssBaseline'; -import Grid from '@material-ui/core/Grid'; import { makeStyles } from '@material-ui/core/styles'; -import Container from '@material-ui/core/Container'; +import { GridList } from "@material-ui/core/"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -27,20 +26,24 @@ function Ratings({ searchTerm, setFilter, }) { + //for sizing of the movie cards + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); useEffect(() => { setFilter(""); // Returns the ratings getRatingAction(userid); }, [getRatingAction, userid, setFilter]); - const classes = useStyles(); + if (isFetching) return ; else return ( - //
- //
- - + {ratings .filter((movie) => searchTerm !== "" @@ -55,10 +58,7 @@ function Ratings({ let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - - - - ); - } )} - {/*
-
*/} -
+ ); } diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index bd79356..58d22fe 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,7 +1,6 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { ifDev } from "../../utils/removeAttribute.js"; import { recommendationAction, toggleIsUploaded, @@ -11,7 +10,6 @@ import { import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; //for grid -import CssBaseline from '@material-ui/core/CssBaseline'; import Grid from '@material-ui/core/Grid'; import { makeStyles } from '@material-ui/core/styles'; import Container from '@material-ui/core/Container'; diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index bff0550..60217cf 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -1,7 +1,6 @@ import React, { useState, useEffect } from "react"; // tools import { connect } from "react-redux"; -import { ifDev } from "../../utils/removeAttribute.js"; import { removeFromWatchlistAction, getWatchlistAction, @@ -17,10 +16,6 @@ import MovieCard from "../movies/MovieCard.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; -// import Container from '@material-ui/core/Container'; - -//reactstrap -// import { Container, Row, Col } from 'reactstrap'; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -42,8 +37,6 @@ function Watchlist({ const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui const classes = useStyles(); - const [spacing, setSpacing] = React.useState(2); - const screenWidth = widthFinder(window.innerWidth); useEffect(() => { @@ -55,71 +48,59 @@ function Watchlist({ function handleClick(id) { removeFromWatchlistAction(userid, id); } - console.log("this is suppose to be true or false", screenWidth); + // console.log("this is suppose to be true or false", screenWidth); if (isFetching) return ; else if (isDeleting) return ; else return ( - - - - {/* // - // */} - {watchlist - .filter((movie) => - searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( - -
setDeleteMode(!deleteMode)}> - - {/* */} - {/* */} - - {/* */} - {/* */} - {deleteMode && ( - - )} -
- ); - })}; + )} +
+ ); + })}; - ); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 0a726f1..41f0b2b 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -4,87 +4,44 @@ import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid -import CssBaseline from "@material-ui/core/CssBaseline"; -import Grid from "@material-ui/core/Grid"; import { makeStyles } from "@material-ui/core/styles"; - -import Container from "@material-ui/core/Container"; -import Link from "@material-ui/core/Link"; -import AppBar from "@material-ui/core/AppBar"; import Button from "@material-ui/core/Button"; -import CameraIcon from "@material-ui/icons/PhotoCamera"; -import Card from "@material-ui/core/Card"; import CardActions from "@material-ui/core/CardActions"; import CardContent from "@material-ui/core/CardContent"; -import CardMedia from "@material-ui/core/CardMedia"; -import Toolbar from "@material-ui/core/Toolbar"; import Typography from "@material-ui/core/Typography"; const useStyles = makeStyles((theme) => ({ - // root:{ - // flexGrow:1, - // }, control: { padding: theme.spacing(2), }, - // icon: { - // marginRight: theme.spacing(2), - // }, - // heroContent: { - // backgroundColor: theme.palette.background.paper, - // padding: theme.spacing(8, 0, 6), - // }, - // heroButtons: { - // marginTop: theme.spacing(4), - // }, cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(8), display: "flex", flexDirection: "row", - // paddingLeft: theme.spacing(8), - // paddingRight: theme.spacing(8), - // width: "100%" - // justify:'center', }, card: { height: "100%", display: "flex", flexDirection: "column", border: "1px solid #5B7648", - width: '100%', - margin:'1%', - // justifyContent:'center', + width: '50%', + margin: '1%', '&:hover': { background: 'black', - // opacity: 0.3, }, moreInfo: { display: 'flex', flexDirection: 'row', - }, }, - // cardMedia: { - // '&:hover':{ - // opacity: 5, - // } - // }, cardContent: { // flexGrow: 1, padding: 0, textAlign: "center", }, - - // name:{ - // width: '100%' - // }, cardActions: { - // display:'flex', - // flexDirection:'column' - // margin:'auto', - fontSize: "10px", }, stars: { @@ -118,8 +75,6 @@ const useStyles = makeStyles((theme) => ({ width: "100%", opacity: 1, display: "block", - // height: 'auto', - // transition: '5s ease', backfaceVisibility: "hidden", // '&:hover':{ // opacity: 0.3, @@ -129,7 +84,6 @@ const useStyles = makeStyles((theme) => ({ fontSize: "8px", }, })); - // more fields will be appearing according to the Figma file function MovieCard({ userid, @@ -157,15 +111,12 @@ function MovieCard({ ); //material-ui const classes = useStyles(); - // const [spacing, setSpacing] = React.useState(2); - /* Used to format the movie object for action calls */ let movie = { movie_id: movie_id, name: name, year: year, }; - const handleChange = (event, newValue) => { /* Sets rating for the star value */ setRating(newValue); @@ -178,28 +129,18 @@ function MovieCard({ ratingAction(userid, newRating); setYourRating(true); }; - const handleClick = () => { /* Adds movie to the POST request */ addToWatchlistAction(userid, movie); setAdded(true); }; - return ( - // -
- {/* */} Random Movie poster as a placeholder. - {/* */} - - - {/*
Description:
*/} - {name} @@ -217,11 +158,10 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} - Date: Thu, 30 Apr 2020 23:11:57 -0700 Subject: [PATCH 539/822] all pages have grid system - mobile and desktop --- src/components/dashboard/Explore.js | 10 +-- src/components/dashboard/Navigation.js | 5 +- src/components/dashboard/Ratings.js | 16 +++-- src/components/dashboard/Recommendations.js | 74 ++++++++++----------- src/components/dashboard/Watchlist.js | 3 +- src/components/movies/MovieCard.js | 5 +- 6 files changed, 60 insertions(+), 53 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index b5891f1..e74b933 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -50,10 +50,10 @@ function Explore({ else return ( + className={classes.cardGrid} + cols={screenWidth ? 3 : 5} + cellHeight="auto" + > {movies .filter((movie) => !ratings.includes( @@ -83,6 +83,7 @@ function Explore({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( +
+
); })}
diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 1a7ffd8..8d2b0e4 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -78,6 +78,9 @@ const useStyles = makeStyles(theme => ({ width: "auto" } }, + appBarTop: { + backgroundColor: '#5c5b5b' + }, searchIcon: { width: theme.spacing(7), height: "100%", @@ -270,7 +273,7 @@ const Navigation = props => {
- ({ cardGrid: { @@ -26,22 +27,23 @@ function Ratings({ searchTerm, setFilter, }) { - //for sizing of the movie cards - const classes = useStyles(); - const screenWidth = widthFinder(window.innerWidth); + //for sizing of the movie cards + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); useEffect(() => { setFilter(""); // Returns the ratings getRatingAction(userid); }, [getRatingAction, userid, setFilter]); - + console.log(`here + ${screenWidth}`); + console.log(classes); if (isFetching) return ; else return ( {ratings @@ -59,6 +61,7 @@ function Ratings({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( +
+
); } )} diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 58d22fe..ad27508 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -9,17 +9,18 @@ import { // children components import LoadingScreen from "../layout/LoadingScreen.js"; import MovieCard from "../movies/MovieCard.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; //for grid -import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; -import Container from '@material-ui/core/Container'; +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(8), paddingBottom: theme.spacing(8), }, - + })); function Recommendations({ @@ -41,35 +42,32 @@ function Recommendations({ // Returns the most recent recommendations from the database }, [userid, isUploaded, recommendationAction, setFilter]); const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); if (isFetching) return ; else return ( - //
- //
- - - {recommendations - .filter((movie) => - searchTerm !== "" - ? movie.title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - - return ( - - + + {recommendations + .filter((movie) => + searchTerm !== "" + ? movie.title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
- - ); - })} - {/*
-
*/} - +
+ ); + })} +
); } diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 60217cf..92ef262 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -39,6 +39,7 @@ function Watchlist({ const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); + console.log(classes); useEffect(() => { setFilter(""); // Returns the users watchlist from the database @@ -55,7 +56,7 @@ function Watchlist({ else return ( diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 41f0b2b..d127043 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -24,11 +24,12 @@ const useStyles = makeStyles((theme) => ({ height: "100%", display: "flex", flexDirection: "column", - border: "1px solid #5B7648", - width: '50%', + // border: "1px solid #5B7648", + width: '100%', margin: '1%', '&:hover': { background: 'black', + opacity:'0.3', }, moreInfo: { display: 'flex', From 756aa7b7c0a2cab358e4c44ba54a64c46e7d4396 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 30 Apr 2020 23:37:20 -0700 Subject: [PATCH 540/822] adjust padding on cards --- src/components/dashboard/Explore.js | 80 +++++++++++---------- src/components/dashboard/Ratings.js | 43 +++++------ src/components/dashboard/Recommendations.js | 7 +- src/components/dashboard/Watchlist.js | 7 +- src/components/movies/MovieCard.js | 12 ++-- 5 files changed, 79 insertions(+), 70 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index e74b933..3e1531e 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -18,10 +18,12 @@ import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ cardGrid: { - paddingTop: theme.spacing(8), - paddingBottom: theme.spacing(8), + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), }, - + })); function Explore({ isFetching, @@ -54,36 +56,36 @@ function Explore({ cols={screenWidth ? 3 : 5} cellHeight="auto" > - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { return ( -
+ film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
-
- ); - })} +
+ ); + })}
); } diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 376bd59..04d089b 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -10,12 +10,13 @@ import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { makeStyles } from '@material-ui/core/styles'; import { GridList } from "@material-ui/core/"; -import Grid from '@material-ui/core/Grid' const useStyles = makeStyles((theme) => ({ cardGrid: { - paddingTop: theme.spacing(2), - paddingBottom: theme.spacing(8), + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), }, })); @@ -42,8 +43,8 @@ function Ratings({ else return ( {ratings @@ -62,22 +63,22 @@ function Ratings({ let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return (
- +
); } diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index ad27508..078215b 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -17,10 +17,11 @@ import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ cardGrid: { - paddingTop: theme.spacing(8), - paddingBottom: theme.spacing(8), + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), }, - })); function Recommendations({ diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 92ef262..4e981b1 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -19,8 +19,10 @@ import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ cardGrid: { - paddingTop: theme.spacing(2), - paddingBottom: theme.spacing(8), + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), }, })); function Watchlist({ @@ -59,6 +61,7 @@ function Watchlist({ className={classes.cardGrid} cols={screenWidth ? 3 : 5} cellHeight="auto" + > {watchlist .filter((movie) => diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index d127043..6679279 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -26,7 +26,6 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", // border: "1px solid #5B7648", width: '100%', - margin: '1%', '&:hover': { background: 'black', opacity:'0.3', @@ -40,10 +39,11 @@ const useStyles = makeStyles((theme) => ({ cardContent: { // flexGrow: 1, padding: 0, - textAlign: "center", + }, cardActions: { fontSize: "10px", + padding:0, }, stars: { fontSize: "2.5vw", @@ -82,7 +82,9 @@ const useStyles = makeStyles((theme) => ({ // } }, watchList: { - fontSize: "8px", + fontSize: "10px", + textAlign:'left', + padding:0, }, })); // more fields will be appearing according to the Figma file @@ -143,12 +145,12 @@ function MovieCard({ alt="Random Movie poster as a placeholder." /> - + {name} {year} - +
) +} + +const Onboarding = () => { + const showOnboarding = () => { + const config = { + steps: [ + { + title: 'Welcome to the platform', + description: 'Navigate around the UI to start using it', + }, + { + title: 'Add your profile details', + description: 'We use this information in order to tailor your experience', + }, + { + title: 'Who are you?', + description: 'Help the community identify you', + type: 'form', + fields: [ + { + label: 'First Name', + name: 'first_name', + type: 'text', + placeholder: 'John', + validation: '[a-zA-Z]', + value: 'John' + }, + { + label: 'Last Name', + name: 'last_name', + type: 'text', + placeholder: 'Doe', + validation: '', + value: 'Doe' + }, + ], + + }, + { + type: 'component', + component: CustomComponent, + } + ], + overlayClose: false + }; + reactOnboardingPro(config); + } + return ( +
+ +
+ ) +}; + +const mapStateToProps = (state) => { + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; -export default onBoarding \ No newline at end of file +export default connect(mapStateToProps, { + getMoviesAction, + recommendationAction, + setFilter, +})(Onboarding); + //ratings on users account + //get ratings from ratings enpoint to send to database and after questionaire submitted send to page + //sort movies + //pagination? \ No newline at end of file diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index bd8d8d8..3c1fa8c 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -79,7 +79,7 @@ const Register = (props) => { email: users.email, password: users.password, }; - console.log("user before register button", user); + // console.log("user before register button", user); props.registerAction(user, props.history); }; diff --git a/src/components/auth/Tester.js b/src/components/auth/Tester.js new file mode 100644 index 0000000..da804b1 --- /dev/null +++ b/src/components/auth/Tester.js @@ -0,0 +1,8 @@ +import React from 'react'; +const Tester = props => { + return ( +
+

tester

+
) +}; +export default Tester \ No newline at end of file diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index d4122a9..23b5d50 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -17,6 +17,7 @@ import MovieCard from "../movies/MovieCard.js"; import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; + const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), @@ -62,6 +63,7 @@ function Watchlist({ cellHeight="auto" > + {/*
*/} {watchlist .filter((movie) => searchTerm !== "" @@ -103,6 +105,7 @@ function Watchlist({
); })}; + {/*
*/} ); } diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 534b1ce..8ea7078 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -22,7 +22,7 @@ export function registerAction(userCreds, history) { type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); - history.push(`/${res.data.user_id}/explore`); + history.push(`/${res.data.user_id}/onboarding`); }).catch(err => { console.log(err) }); From 1887f9aa81d16a71a864872b77bf707ac75588cf Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 5 May 2020 09:58:35 -0700 Subject: [PATCH 562/822] route change to show onboarding after signup --- src/App.js | 19 +- src/components/auth/Onboarding.js | 334 +++++++++++++++++++++-------- src/components/auth/Onboarding2.js | 136 ++++++++++++ src/components/auth/SearchBar.js | 126 +++++++++++ 4 files changed, 527 insertions(+), 88 deletions(-) create mode 100644 src/components/auth/Onboarding2.js create mode 100644 src/components/auth/SearchBar.js diff --git a/src/App.js b/src/App.js index f2c4523..20038f9 100644 --- a/src/App.js +++ b/src/App.js @@ -12,6 +12,8 @@ import Watchlist from "./components/dashboard/Watchlist.js"; import Ratings from './components/dashboard/Ratings'; import Explore from "./components/dashboard/Explore.js"; import Onboarding from './components/auth/Onboarding'; +import Onboarding2 from './components/auth/Onboarding2'; +import SearchBar from './components/auth/SearchBar'; // for testing import { ifDev } from "./utils/removeAttribute.js"; @@ -99,16 +101,27 @@ function App() { path="/:user_id/watchlist" component={Watchlist} /> + + - + - {/* */} - + {/* this could be a modal */} {/* */} diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 80a6937..c25ca25 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,97 +1,261 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; // import Onboarding from '../lib'; -import reactOnboardingPro from "react-onboarding-pro"; -import "react-onboarding-pro/build/index.css"; -//for customcomponent +// import reactOnboardingPro from "react-onboarding-pro"; +// import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; import { - getMoviesAction, - setFilter, - recommendationAction, + getMoviesAction, + setFilter, + recommendationAction, } from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; +// children components +import MovieCard from "../movies/MovieCard.js"; +import LoadingScreen from "../layout/LoadingScreen.js"; +//for grid +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; +//for Link +import { ifDev } from "../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; +//for search bar +import { useTheme } from "@material-ui/core/styles"; +import SearchIcon from "@material-ui/icons/Search"; +import InputBase from "@material-ui/core/InputBase"; -const CustomComponent = ({ - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, -}) => { - // setOnSubmit(() => { - // console.log('Custom component action completed'); - // }); - useEffect(() => { - // setFilter(""); - // Returns the movies - getMoviesAction(userid); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; - return ( -
-

I'm a custom CustomComponent with id

- -
- ) -} -const Onboarding = () => { - const showOnboarding = () => { - const config = { - steps: [ - { - title: 'Welcome to the platform', - description: 'Navigate around the UI to start using it', - }, - { - title: 'Add your profile details', - description: 'We use this information in order to tailor your experience', - }, - { - title: 'Who are you?', - description: 'Help the community identify you', - type: 'form', - fields: [ - { - label: 'First Name', - name: 'first_name', - type: 'text', - placeholder: 'John', - validation: '[a-zA-Z]', - value: 'John' - }, - { - label: 'Last Name', - name: 'last_name', - type: 'text', - placeholder: 'Doe', - validation: '', - value: 'Doe' - }, - ], - - }, - { - type: 'component', - component: CustomComponent, - } - ], - overlayClose: false - }; - reactOnboardingPro(config); - } +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), + }, + searchIcon: { + width: theme.spacing(7), + height: "100%", + position: "absolute", + pointerEvents: "none", + display: "flex", + alignItems: "center", + justifyContent: "center", + color: '#505050', + "&:hover": { + // backgroundColor: '#5c5b5b', + color: '#D8D8D8', + }, +}, + search: { + position: "relative", + borderRadius: theme.shape.borderRadius, + backgroundColor: '#5c5b5b', + "&:hover": { + backgroundColor: '#5c5b5b', + color: '#ffffff', + }, + width: "100%", + [theme.breakpoints.down("sm")]: { + width: "auto" + } + }, + searchContainer: { + width: "40%", + margin: 'auto', + // backgroundColor: '#505050', + paddingTop:'4%', + }, + [theme.breakpoints.down("xs")]: { + searchContainer: { + width: "90%", + }, + }, +})); +function Onboarding({ + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, + +}, props) { + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); +//for search bar + const handleSubmit = e => { + if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + }; + const [query, setQuery] = useState({ + query: "" + }); + + const sendChange = query => { + props.setFilter(query); + }; + + const handleChange = e => { + setQuery({ query: e.target.value }); + sendChange(e.target.value.trim()); + }; + + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid); + // returns a list of recommendations to start the recommendations page + recommendationAction(userid); + }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + // How many movies render + const cardAmount = 25; + + if (isFetching) return ; + else + + + // return ( + //
+ //

I'm a custom CustomComponent with id

+ // + //
+ // ) + +// const Onboarding = () => { +// const showOnboarding = () => { +// const config = { +// steps: [ +// { +// title: 'Welcome to the platform', +// description: 'Navigate around the UI to start using it', +// }, +// { +// title: 'Add your profile details', +// description: 'We use this information in order to tailor your experience', +// }, +// { +// title: 'Who are you?', +// description: 'Help the community identify you', +// type: 'form', +// fields: [ +// { +// label: 'First Name', +// name: 'first_name', +// type: 'text', +// placeholder: 'John', +// validation: '[a-zA-Z]', +// value: 'John' +// }, +// { +// label: 'Last Name', +// name: 'last_name', +// type: 'text', +// placeholder: 'Doe', +// validation: '', +// value: 'Doe' +// }, +// ], + +// }, +// { +// type: 'component', +// component: CustomComponent, +// } +// ], +// overlayClose: false +// }; +// reactOnboardingPro(config); +// } return ( -
- -
- ) + //
+ // + //
+
+ {/*
+
+
+ +
+ +
+
*/} + + + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} + +
+ + Next + +
+ ); }; const mapStateToProps = (state) => { diff --git a/src/components/auth/Onboarding2.js b/src/components/auth/Onboarding2.js new file mode 100644 index 0000000..e56a0b5 --- /dev/null +++ b/src/components/auth/Onboarding2.js @@ -0,0 +1,136 @@ +import React, { useEffect } from 'react'; +// import Onboarding from '../lib'; +// import reactOnboardingPro from "react-onboarding-pro"; +// import "react-onboarding-pro/build/index.css"; +import { connect } from "react-redux"; +import { + getMoviesAction, + setFilter, + recommendationAction, +} from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; + +// children components +import MovieCard from "../movies/MovieCard.js"; +import LoadingScreen from "../layout/LoadingScreen.js"; +//for grid +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; +//for Link +import { ifDev } from "../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; + + +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), + }, + +})); +function Onboarding2({ + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, +}, props) { + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); + + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid); + // returns a list of recommendations to start the recommendations page + recommendationAction(userid); + }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + // How many movies render + const cardAmount = 25; + + if (isFetching) return ; + else + return ( + + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} + {/* + +
+ ); +} +const mapStateToProps = (state) => { + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; +}; +export default connect(mapStateToProps, { + setFilter, +})(OnboardingPlateform); \ No newline at end of file diff --git a/src/img/happy-running-person.png b/src/img/happy-running-person.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bb4e93829e132290aa478e2db793ba89920f1c GIT binary patch literal 7479 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 { console.log(err) }); From 0fc84a5d72a9e9fb64f853d79bdf902d7ccdf8ec Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 5 May 2020 14:07:32 -0400 Subject: [PATCH 564/822] prettier linter ran --- src/components/auth/Onboarding.js | 347 ++++++++++----------- src/components/auth/Onboarding2.js | 77 +++-- src/components/auth/OnboardingPlateform.js | 62 ++-- src/components/movies/MovieCard.js | 32 +- 4 files changed, 252 insertions(+), 266 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 2d40fe2..1a288ad 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState } from "react"; // import Onboarding from '../lib'; // import reactOnboardingPro from "react-onboarding-pro"; // import "react-onboarding-pro/build/index.css"; @@ -20,13 +20,11 @@ import { makeStyles } from "@material-ui/core/styles"; //for Link import { ifDev } from "../../utils/removeAttribute.js"; import { Link } from "react-router-dom"; -//for search bar +//for search bar import { useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; - - const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), @@ -42,66 +40,68 @@ const useStyles = makeStyles((theme) => ({ display: "flex", alignItems: "center", justifyContent: "center", - color: '#505050', + color: "#505050", "&:hover": { // backgroundColor: '#5c5b5b', - color: '#D8D8D8', + color: "#D8D8D8", }, -}, - search: { - position: "relative", - borderRadius: theme.shape.borderRadius, - backgroundColor: '#5c5b5b', - "&:hover": { - backgroundColor: '#5c5b5b', - color: '#ffffff', - }, - width: "100%", - [theme.breakpoints.down("sm")]: { - width: "auto" - } - }, - searchContainer: { - width: "40%", - margin: 'auto', - // backgroundColor: '#505050', - paddingTop:'4%', - }, - [theme.breakpoints.down("xs")]: { - searchContainer: { - width: "90%", - }, + }, + search: { + position: "relative", + borderRadius: theme.shape.borderRadius, + backgroundColor: "#5c5b5b", + "&:hover": { + backgroundColor: "#5c5b5b", + color: "#ffffff", }, - Link:{ - marginBottom:'2%', + width: "100%", + [theme.breakpoints.down("sm")]: { + width: "auto", }, + }, + searchContainer: { + width: "40%", + margin: "auto", + // backgroundColor: '#505050', + paddingTop: "4%", + }, + [theme.breakpoints.down("xs")]: { + searchContainer: { + width: "90%", + }, + }, + Link: { + marginBottom: "2%", + }, })); -function Onboarding({ - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, - -}, props) { +function Onboarding( + { + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, + }, + props +) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); -//for search bar - const handleSubmit = e => { + //for search bar + const handleSubmit = (e) => { if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); }; const [query, setQuery] = useState({ - query: "" + query: "", }); - const sendChange = query => { + const sendChange = (query) => { props.setFilter(query); }; - const handleChange = e => { + const handleChange = (e) => { setQuery({ query: e.target.value }); sendChange(e.target.value.trim()); }; @@ -117,66 +117,62 @@ function Onboarding({ const cardAmount = 25; if (isFetching) return ; + // return ( + //
+ //

I'm a custom CustomComponent with id

+ // + //
+ // ) + // const Onboarding = () => { + // const showOnboarding = () => { + // const config = { + // steps: [ + // { + // title: 'Welcome to the platform', + // description: 'Navigate around the UI to start using it', + // }, + // { + // title: 'Add your profile details', + // description: 'We use this information in order to tailor your experience', + // }, + // { + // title: 'Who are you?', + // description: 'Help the community identify you', + // type: 'form', + // fields: [ + // { + // label: 'First Name', + // name: 'first_name', + // type: 'text', + // placeholder: 'John', + // validation: '[a-zA-Z]', + // value: 'John' + // }, + // { + // label: 'Last Name', + // name: 'last_name', + // type: 'text', + // placeholder: 'Doe', + // validation: '', + // value: 'Doe' + // }, + // ], + // }, + // { + // type: 'component', + // component: CustomComponent, + // } + // ], + // overlayClose: false + // }; + // reactOnboardingPro(config); + // } else - - - // return ( - //
- //

I'm a custom CustomComponent with id

- // - //
- // ) - -// const Onboarding = () => { -// const showOnboarding = () => { -// const config = { -// steps: [ -// { -// title: 'Welcome to the platform', -// description: 'Navigate around the UI to start using it', -// }, -// { -// title: 'Add your profile details', -// description: 'We use this information in order to tailor your experience', -// }, -// { -// title: 'Who are you?', -// description: 'Help the community identify you', -// type: 'form', -// fields: [ -// { -// label: 'First Name', -// name: 'first_name', -// type: 'text', -// placeholder: 'John', -// validation: '[a-zA-Z]', -// value: 'John' -// }, -// { -// label: 'Last Name', -// name: 'last_name', -// type: 'text', -// placeholder: 'Doe', -// validation: '', -// value: 'Doe' -// }, -// ], - -// }, -// { -// type: 'component', -// component: CustomComponent, -// } -// ], -// overlayClose: false -// }; -// reactOnboardingPro(config); -// } return ( - //
- // - //
-
+ //
+ // + //
+
{/*
@@ -196,88 +192,81 @@ function Onboarding({ />
*/} - - - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { + + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- + -
- ); - })} - -
- - Next - + ? unsplashUrl + : moviePoster + } + /> +
+ ); + })} + + + Next +
); -}; +} const mapStateToProps = (state) => { - return { - userid: state.login.userid, - isFetching: state.movie.isFetching, - movies: state.movie.movies, - moviesError: state.movie.error, - searchTerm: state.filter.searchTerm, - watchlist: state.watchlist.movies, - ratings: state.rating.movies, - }; + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; export default connect(mapStateToProps, { - getMoviesAction, - recommendationAction, - setFilter, + getMoviesAction, + recommendationAction, + setFilter, })(Onboarding); - //ratings on users account - //get ratings from ratings enpoint to send to database and after questionaire submitted send to page - //sort movies - //pagination? \ No newline at end of file +//ratings on users account +//get ratings from ratings enpoint to send to database and after questionaire submitted send to page +//sort movies +//pagination? diff --git a/src/components/auth/Onboarding2.js b/src/components/auth/Onboarding2.js index e56a0b5..edb25c1 100644 --- a/src/components/auth/Onboarding2.js +++ b/src/components/auth/Onboarding2.js @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React, { useEffect } from "react"; // import Onboarding from '../lib'; // import reactOnboardingPro from "react-onboarding-pro"; // import "react-onboarding-pro/build/index.css"; @@ -21,7 +21,6 @@ import { makeStyles } from "@material-ui/core/styles"; import { ifDev } from "../../utils/removeAttribute.js"; import { Link } from "react-router-dom"; - const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), @@ -29,18 +28,20 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - })); -function Onboarding2({ - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, -}, props) { +function Onboarding2( + { + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, + }, + props +) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -57,11 +58,7 @@ function Onboarding2({ if (isFetching) return ; else return ( - + {movies .filter((movie) => !ratings.includes( @@ -70,9 +67,9 @@ function Onboarding2({ film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -100,10 +97,10 @@ function Onboarding2({ rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } @@ -111,26 +108,26 @@ function Onboarding2({
); })} - {/* - -
- ); + return ( +
+ +

You're Almost There

+

+ Help Groa personalize your recommendations! Groa works better when you + tell us what you like. +

+

+ Rate six movies on a scale from 1 to 5 and we’ll get you your + personalized recommendations in no time! Train Groa to be your personal + movie AI! +

+ + + +
+ ); } const mapStateToProps = (state) => { - return { - userid: state.login.userid, - isFetching: state.movie.isFetching, - movies: state.movie.movies, - moviesError: state.movie.error, - searchTerm: state.filter.searchTerm, - watchlist: state.watchlist.movies, - ratings: state.rating.movies, - }; + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; export default connect(mapStateToProps, { - setFilter, -})(OnboardingPlateform); \ No newline at end of file + setFilter, +})(OnboardingPlateform); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index b67c1b8..32fd78c 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -24,25 +24,23 @@ const useStyles = makeStyles((theme) => ({ height: "100%", display: "flex", flexDirection: "column", - width: '100%', - '&:hover': { - background: 'black', - opacity:'0.3', - + width: "100%", + "&:hover": { + background: "black", + opacity: "0.3", }, moreInfo: { - display: 'flex', - flexDirection: 'row', + display: "flex", + flexDirection: "row", }, }, cardContent: { padding: 0, - }, cardActions: { fontSize: "10px", - padding:0, + padding: 0, }, stars: { fontSize: "2.5vw", @@ -65,15 +63,15 @@ const useStyles = makeStyles((theme) => ({ opacity: 1, display: "block", backfaceVisibility: "hidden", - borderRadius: '11px', + borderRadius: "11px", // '&:hover':{ // opacity: 0.3, // } }, watchList: { fontSize: "10px", - textAlign:'left', - padding:0, + textAlign: "left", + padding: 0, }, })); // more fields will be appearing according to the Figma file @@ -134,12 +132,10 @@ function MovieCard({ alt="Random Movie poster as a placeholder." /> - - {name} - + {name} {year} - + + + +
+ Random Movie poster as a placeholder. + + {name} + + {year} +
+
+
); } From 5617364ee24be7f3b02c51b9633467a70f6081fc Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 5 May 2020 14:55:57 -0700 Subject: [PATCH 568/822] create placeholder for trailers, add desciption --- src/components/auth/Onboarding.js | 383 +++++++++++----------------- src/components/dashboard/Explore.js | 1 + src/components/movies/MovieCard.js | 128 +++++----- 3 files changed, 223 insertions(+), 289 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 1a288ad..8f85231 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -4,9 +4,9 @@ import React, { useEffect, useState } from "react"; // import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; import { - getMoviesAction, - setFilter, - recommendationAction, + getMoviesAction, + setFilter, + recommendationAction, } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -26,247 +26,174 @@ import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; const useStyles = makeStyles((theme) => ({ - cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), - }, - searchIcon: { - width: theme.spacing(7), - height: "100%", - position: "absolute", - pointerEvents: "none", - display: "flex", - alignItems: "center", - justifyContent: "center", - color: "#505050", - "&:hover": { - // backgroundColor: '#5c5b5b', - color: "#D8D8D8", + cardGrid: { + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), }, - }, - search: { - position: "relative", - borderRadius: theme.shape.borderRadius, - backgroundColor: "#5c5b5b", - "&:hover": { - backgroundColor: "#5c5b5b", - color: "#ffffff", + searchIcon: { + width: theme.spacing(7), + height: "100%", + position: "absolute", + pointerEvents: "none", + display: "flex", + alignItems: "center", + justifyContent: "center", + color: "#505050", + "&:hover": { + // backgroundColor: '#5c5b5b', + color: "#D8D8D8", + }, }, - width: "100%", - [theme.breakpoints.down("sm")]: { - width: "auto", + search: { + position: "relative", + borderRadius: theme.shape.borderRadius, + backgroundColor: "#5c5b5b", + "&:hover": { + backgroundColor: "#5c5b5b", + color: "#ffffff", + }, + width: "100%", + [theme.breakpoints.down("sm")]: { + width: "auto", + }, }, - }, - searchContainer: { - width: "40%", - margin: "auto", - // backgroundColor: '#505050', - paddingTop: "4%", - }, - [theme.breakpoints.down("xs")]: { searchContainer: { - width: "90%", + width: "40%", + margin: "auto", + // backgroundColor: '#505050', + paddingTop: "4%", + }, + [theme.breakpoints.down("xs")]: { + searchContainer: { + width: "90%", + }, + }, + Link: { + marginBottom: "2%", }, - }, - Link: { - marginBottom: "2%", - }, })); function Onboarding( - { - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, - }, - props + { + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, + }, + props ) { - const classes = useStyles(); - const screenWidth = widthFinder(window.innerWidth); - //for search bar - const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); - }; - const [query, setQuery] = useState({ - query: "", - }); + console.log('movies', movies) + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); + //for search bar + const handleSubmit = (e) => { + if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + }; + const [query, setQuery] = useState({ + query: "", + }); - const sendChange = (query) => { - props.setFilter(query); - }; + const sendChange = (query) => { + props.setFilter(query); + }; - const handleChange = (e) => { - setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; + const handleChange = (e) => { + setQuery({ query: e.target.value }); + sendChange(e.target.value.trim()); + }; - useEffect(() => { - setFilter(""); - // Returns the movies - getMoviesAction(userid); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid); + // returns a list of recommendations to start the recommendations page + recommendationAction(userid); + }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + // How many movies render + const cardAmount = 25; - if (isFetching) return ; - // return ( - //
- //

I'm a custom CustomComponent with id

- // - //
- // ) - // const Onboarding = () => { - // const showOnboarding = () => { - // const config = { - // steps: [ - // { - // title: 'Welcome to the platform', - // description: 'Navigate around the UI to start using it', - // }, - // { - // title: 'Add your profile details', - // description: 'We use this information in order to tailor your experience', - // }, - // { - // title: 'Who are you?', - // description: 'Help the community identify you', - // type: 'form', - // fields: [ - // { - // label: 'First Name', - // name: 'first_name', - // type: 'text', - // placeholder: 'John', - // validation: '[a-zA-Z]', - // value: 'John' - // }, - // { - // label: 'Last Name', - // name: 'last_name', - // type: 'text', - // placeholder: 'Doe', - // validation: '', - // value: 'Doe' - // }, - // ], - // }, - // { - // type: 'component', - // component: CustomComponent, - // } - // ], - // overlayClose: false - // }; - // reactOnboardingPro(config); - // } - else - return ( - //
- // - //
-
- {/*
-
-
- -
- -
-
*/} - - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} -
- - Next + if (isFetching) return ; + else + return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ + Next -
- ); +
+ ); } const mapStateToProps = (state) => { - return { - userid: state.login.userid, - isFetching: state.movie.isFetching, - movies: state.movie.movies, - moviesError: state.movie.error, - searchTerm: state.filter.searchTerm, - watchlist: state.watchlist.movies, - ratings: state.rating.movies, - }; + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; export default connect(mapStateToProps, { - getMoviesAction, - recommendationAction, - setFilter, + getMoviesAction, + recommendationAction, + setFilter, })(Onboarding); -//ratings on users account -//get ratings from ratings enpoint to send to database and after questionaire submitted send to page -//sort movies -//pagination? diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 7687c0d..1210a80 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -91,6 +91,7 @@ function Explore({ name={movie.primary_title} year={movie.start_year} movie_id={movie.movie_id} + trailer={movie.trailer_url} rated={rated ? rated.rating : null} image={ !posterURI || diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 65e66aa..abef6a5 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -73,12 +73,12 @@ const useStyles = makeStyles((theme) => ({ // } }, movieImgModal: { - width: "50%", + width: "30%", opacity: 1, display: "block", backfaceVisibility: "hidden", borderRadius: "11px", - margin:'auto', + margin: 'auto', // '&:hover':{ // opacity: 0.3, // } @@ -96,7 +96,7 @@ const useStyles = makeStyles((theme) => ({ }, paper: { // backgroundColor: theme.palette.background.paper, - background:'white', + background: 'white', border: '2px solid #000', boxShadow: theme.shadows[5], padding: theme.spacing(2, 4, 3), @@ -114,7 +114,10 @@ function MovieCard({ addToWatchlistAction, rated, ratings, + trailer, + description, }) { + // console.log('trailer',trailer) const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); @@ -143,6 +146,7 @@ function MovieCard({ movie_id: movie_id, name: name, year: year, + // trailer:trailer, }; const handleChange = (event, newValue) => { /* Sets rating for the star value */ @@ -164,67 +168,69 @@ function MovieCard({ return (
- + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + className={classes.modal} + open={open} + onClose={handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }}> +
- Random Movie poster as a placeholder. - - {name} - - {year} - - - - - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - /> - + Random Movie poster as a placeholder. + + {name} + + {year} + {description} + + + + + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + /> + +
From 8d61a49abb6b80704d19dca3ff8465f023e0cb42 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 5 May 2020 21:24:17 -0700 Subject: [PATCH 569/822] simplify onboarding moviecard --- src/components/auth/Onboarding.js | 5 +++-- src/components/dashboard/Explore.js | 4 +++- src/components/dashboard/Watchlist.js | 7 ++++++- src/components/movies/MovieCard.js | 11 ++++++++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 8f85231..c82d2bf 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -155,8 +155,9 @@ function Onboarding( { setFilter(""); // Returns the users watchlist from the database @@ -84,6 +87,8 @@ function Watchlist({ key={index} name={movie.primary_title} year={movie.start_year} + trailer={movie.trailer_url} + description={movie.description} image={ !posterURI || posterURI === "None" || diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index abef6a5..1ae5332 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -100,6 +100,7 @@ const useStyles = makeStyles((theme) => ({ border: '2px solid #000', boxShadow: theme.shadows[5], padding: theme.spacing(2, 4, 3), + color: 'black', }, })); // more fields will be appearing according to the Figma file @@ -116,6 +117,7 @@ function MovieCard({ ratings, trailer, description, + page }) { // console.log('trailer',trailer) const [yourRating, setYourRating] = useState(false); @@ -146,7 +148,7 @@ function MovieCard({ movie_id: movie_id, name: name, year: year, - // trailer:trailer, + description: description, }; const handleChange = (event, newValue) => { /* Sets rating for the star value */ @@ -197,7 +199,7 @@ function MovieCard({ alt="Random Movie poster as a placeholder." /> - {name} +

{name}

{year} {description} @@ -230,7 +232,10 @@ function MovieCard({ onChange={handleChange} /> - + {console.log("The page is " + page)} + {page !== "Onboarding" ? : ""} + {/* */} + {/* */}
From 3db7f1bbd99f78d4129f79154664a98360ccba65 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 6 May 2020 00:50:59 -0700 Subject: [PATCH 570/822] update movie cards for onboarding --- src/components/movies/MovieCard.js | 121 ++++++++++++++++++----------- 1 file changed, 77 insertions(+), 44 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 1ae5332..4886d03 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -15,6 +15,14 @@ import Backdrop from '@material-ui/core/Backdrop'; import Fade from '@material-ui/core/Fade'; const useStyles = makeStyles((theme) => ({ + nameModal:{ + fontSize:'20px', + // textAlign:'center', + paddingBottom:'5%', + }, + descriptionModal:{ +color:'black', + }, control: { padding: theme.spacing(2), }, @@ -73,7 +81,7 @@ const useStyles = makeStyles((theme) => ({ // } }, movieImgModal: { - width: "30%", + width: "50%", opacity: 1, display: "block", backfaceVisibility: "hidden", @@ -93,6 +101,7 @@ const useStyles = makeStyles((theme) => ({ display: 'flex', alignItems: 'center', justifyContent: 'center', + }, paper: { // backgroundColor: theme.palette.background.paper, @@ -101,6 +110,25 @@ const useStyles = makeStyles((theme) => ({ boxShadow: theme.shadows[5], padding: theme.spacing(2, 4, 3), color: 'black', + // display: 'flex' + }, + movieInfoModal: { + display: 'flex', + // flexDirection:'row', + }, + watchStarsModal:{ + justifyContent: 'center', + display: 'flex', + + }, + cardActionsModal:{ + justifyContent: 'center', + display: 'flex', + }, + starsModal:{ + justifyContent: 'center', + display: 'flex', + fontSize: "9vw", }, })); // more fields will be appearing according to the Figma file @@ -193,50 +221,55 @@ function MovieCard({ }}>
- Random Movie poster as a placeholder. - -

{name}

-
- {year} - {description} - - - - - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} +
+ Random Movie poster as a placeholder. - - {console.log("The page is " + page)} - {page !== "Onboarding" ? : ""} - {/* */} - {/* */} -
+ +

{name}

+ + {year} +

{description}

+
+
+ {page !== "Onboarding" ? + + + : ""} + {/* */} + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + /> + {/* */} + {/* {console.log("The page is " + page)} */} + {page !== "Onboarding" ? : ""} + {/* */} + {/* */} +
+ {/*
*/}
From 4a0bca703fe235bc28b5cb48881340bb2c168e1d Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 6 May 2020 09:30:51 -0700 Subject: [PATCH 571/822] update font size --- src/components/movies/MovieCard.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 4886d03..f64e615 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -16,12 +16,13 @@ import Fade from '@material-ui/core/Fade'; const useStyles = makeStyles((theme) => ({ nameModal:{ - fontSize:'20px', + fontSize:'25px', // textAlign:'center', paddingBottom:'5%', }, descriptionModal:{ color:'black', +fontSize:'20px', }, control: { padding: theme.spacing(2), @@ -128,7 +129,7 @@ color:'black', starsModal:{ justifyContent: 'center', display: 'flex', - fontSize: "9vw", + fontSize: "7vw", }, })); // more fields will be appearing according to the Figma file From 1c26098f7ff0af785c59880f9da3c029e06aa183 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Wed, 6 May 2020 18:57:03 -0400 Subject: [PATCH 572/822] updated movie card layout --- src/components/auth/Onboarding.js | 312 ++++++++++----------- src/components/auth/OnboardingPlateform.js | 6 +- src/components/dashboard/Explore.js | 16 +- src/components/dashboard/Watchlist.js | 31 +- src/components/movies/MovieCard.js | 263 +++++++++++------ 5 files changed, 353 insertions(+), 275 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index c82d2bf..1d9a1b5 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -3,11 +3,7 @@ import React, { useEffect, useState } from "react"; // import reactOnboardingPro from "react-onboarding-pro"; // import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; -import { - getMoviesAction, - setFilter, - recommendationAction, -} from "../../store/actions/index.js"; +import { getMoviesAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -26,175 +22,175 @@ import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; const useStyles = makeStyles((theme) => ({ - cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), + cardGrid: { + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), + }, + searchIcon: { + width: theme.spacing(7), + height: "100%", + position: "absolute", + pointerEvents: "none", + display: "flex", + alignItems: "center", + justifyContent: "center", + color: "#505050", + "&:hover": { + // backgroundColor: '#5c5b5b', + color: "#D8D8D8", }, - searchIcon: { - width: theme.spacing(7), - height: "100%", - position: "absolute", - pointerEvents: "none", - display: "flex", - alignItems: "center", - justifyContent: "center", - color: "#505050", - "&:hover": { - // backgroundColor: '#5c5b5b', - color: "#D8D8D8", - }, + }, + search: { + position: "relative", + borderRadius: theme.shape.borderRadius, + backgroundColor: "#5c5b5b", + "&:hover": { + backgroundColor: "#5c5b5b", + color: "#ffffff", }, - search: { - position: "relative", - borderRadius: theme.shape.borderRadius, - backgroundColor: "#5c5b5b", - "&:hover": { - backgroundColor: "#5c5b5b", - color: "#ffffff", - }, - width: "100%", - [theme.breakpoints.down("sm")]: { - width: "auto", - }, + width: "100%", + [theme.breakpoints.down("sm")]: { + width: "auto", }, + }, + searchContainer: { + width: "40%", + margin: "auto", + // backgroundColor: '#505050', + paddingTop: "4%", + }, + [theme.breakpoints.down("xs")]: { searchContainer: { - width: "40%", - margin: "auto", - // backgroundColor: '#505050', - paddingTop: "4%", - }, - [theme.breakpoints.down("xs")]: { - searchContainer: { - width: "90%", - }, - }, - Link: { - marginBottom: "2%", + width: "90%", }, + }, + Link: { + marginBottom: "2%", + }, })); function Onboarding( - { - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, - }, - props + { + isFetching, + movies, + userid, + getMoviesAction, + searchTerm, + setFilter, + ratings, + }, + props ) { - console.log('movies', movies) - const classes = useStyles(); - const screenWidth = widthFinder(window.innerWidth); - //for search bar - const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); - }; - const [query, setQuery] = useState({ - query: "", - }); + console.log("movies", movies); + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); + //for search bar + const handleSubmit = (e) => { + if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + }; + const [query, setQuery] = useState({ + query: "", + }); - const sendChange = (query) => { - props.setFilter(query); - }; + const sendChange = (query) => { + props.setFilter(query); + }; - const handleChange = (e) => { - setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; + const handleChange = (e) => { + setQuery({ query: e.target.value }); + sendChange(e.target.value.trim()); + }; - useEffect(() => { - setFilter(""); - // Returns the movies - getMoviesAction(userid); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid); + }, [getMoviesAction, userid, ratings, setFilter]); + // How many movies render + const cardAmount = 25; - if (isFetching) return ; - else - return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} -
- - Next + if (isFetching) return ; + else + return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ + Next -
- ); +
+ ); } const mapStateToProps = (state) => { - return { - userid: state.login.userid, - isFetching: state.movie.isFetching, - movies: state.movie.movies, - moviesError: state.movie.error, - searchTerm: state.filter.searchTerm, - watchlist: state.watchlist.movies, - ratings: state.rating.movies, - }; + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; export default connect(mapStateToProps, { - getMoviesAction, - recommendationAction, - setFilter, + getMoviesAction, + setFilter, })(Onboarding); diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlateform.js index c325281..18a1093 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlateform.js @@ -1,10 +1,6 @@ import React from "react"; import { connect } from "react-redux"; -import { - loginAction, - setFilter, - recommendationAction, -} from "../../store/actions"; +import { setFilter } from "../../store/actions"; import { Link } from "react-router-dom"; //img import OnboardingImg from "../../img/happy-running-person.png"; diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 090fb4e..04e677f 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -53,7 +53,7 @@ function Explore({ return ( {movies @@ -64,9 +64,9 @@ function Explore({ film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -97,10 +97,10 @@ function Explore({ rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 525b3ba..6b34ceb 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -17,7 +17,6 @@ import MovieCard from "../movies/MovieCard.js"; import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; - const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), @@ -38,7 +37,7 @@ function Watchlist({ setFilter, movies, }) { - console.log('movies', movies) + console.log("movies", movies); const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui @@ -64,16 +63,15 @@ function Watchlist({ className={classes.cardGrid} cols={screenWidth ? 3 : 5} cellHeight="auto" - > - {/*
*/} + {/*
*/} {watchlist .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -88,13 +86,14 @@ function Watchlist({ name={movie.primary_title} year={movie.start_year} trailer={movie.trailer_url} - description={movie.description} + description={movie.description} + page="Onboarding" image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } @@ -105,13 +104,13 @@ function Watchlist({ onClick={() => handleClick(movie.id)} > x - + )}
); - })}; - {/*
*/} -
+ })} + ;{/*
*/} + ); } diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index f64e615..3a892d1 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -4,25 +4,63 @@ import { ratingAction, addToWatchlistAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid -import { makeStyles } from "@material-ui/core/styles"; -import Button from "@material-ui/core/Button"; -import CardActions from "@material-ui/core/CardActions"; -import CardContent from "@material-ui/core/CardContent"; -import Typography from "@material-ui/core/Typography"; -//for modal -import Modal from '@material-ui/core/Modal'; -import Backdrop from '@material-ui/core/Backdrop'; -import Fade from '@material-ui/core/Fade'; +import { makeStyles, withStyles } from "@material-ui/core/styles"; +import { + Button, + CardActions, + CardContent, + Typography, + Modal, + Backdrop, + Fade, + IconButton, +} from "@material-ui/core"; +import CloseIcon from "@material-ui/icons/Close"; + +const styles = (theme) => ({ + closeBtn: { + display: "flex", + justifyContent: "space-between", + }, + closeButton: { + paddingLeft: "200px", + color: theme.palette.grey[500], + }, +}); + +const DialogTitle = withStyles(styles)((props) => { + const { children, classes, onClose, ...other } = props; + return ( +
+ {children} + {onClose ? ( + + + + ) : null} +
+ ); +}); const useStyles = makeStyles((theme) => ({ - nameModal:{ - fontSize:'25px', - // textAlign:'center', - paddingBottom:'5%', + nameModal: { + fontSize: "25px", + paddingBottom: "2%", }, - descriptionModal:{ -color:'black', -fontSize:'20px', + year: { + fontSize: "18px", + paddingBottom: "1%", + }, + descriptionModal: { + color: "white", + fontSize: "15px", + }, + span: { + fontWeight: "bold", }, control: { padding: theme.spacing(2), @@ -82,12 +120,11 @@ fontSize:'20px', // } }, movieImgModal: { - width: "50%", opacity: 1, display: "block", backfaceVisibility: "hidden", borderRadius: "11px", - margin: 'auto', + margin: "auto", // '&:hover':{ // opacity: 0.3, // } @@ -99,39 +136,56 @@ fontSize:'20px', }, //modal modal: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - + display: "flex", + alignItems: "center", + justifyContent: "center", + overflow: "scroll", }, paper: { // backgroundColor: theme.palette.background.paper, - background: 'white', - border: '2px solid #000', + background: "rgb(23, 23, 23, .96)", + marginTop: "auto", + width: "55rem", boxShadow: theme.shadows[5], - padding: theme.spacing(2, 4, 3), - color: 'black', - // display: 'flex' + padding: theme.spacing(0, 4, 3), + color: "white", }, movieInfoModal: { - display: 'flex', - // flexDirection:'row', + display: "flex", }, - watchStarsModal:{ - justifyContent: 'center', - display: 'flex', - + watchStarsModal: { + justifyContent: "center", + display: "flex", + }, + cardActionsModal: { + justifyContent: "center", + display: "flex", }, - cardActionsModal:{ - justifyContent: 'center', - display: 'flex', + starsModal: { + justifyContent: "center", + display: "flex", + fontSize: "3vw", }, - starsModal:{ - justifyContent: 'center', - display: 'flex', - fontSize: "7vw", + actionBtn: { + padding: "1rem", + display: "flex", + flexDirection: "column", + justifyContent: "space-evenly", + }, + [theme.breakpoints.down("xs")]: { + movieInfoModal: { + flexDirection: "column", + }, + nameModal: {}, + paper: { + width: "17rem", + }, + starsModal: { + fontSize: "3vw", + }, }, })); + // more fields will be appearing according to the Figma file function MovieCard({ userid, @@ -146,7 +200,7 @@ function MovieCard({ ratings, trailer, description, - page + page, }) { // console.log('trailer',trailer) const [yourRating, setYourRating] = useState(false); @@ -207,7 +261,6 @@ function MovieCard({ {name} - + }} + >
+ + <> +
- Random Movie poster as a placeholder. - -

{name}

- - {year} -

{description}

-
-
- {page !== "Onboarding" ? - - - : ""} - {/* */} - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} +
+ Random Movie poster as a placeholder. - {/* */} - {/* {console.log("The page is " + page)} */} - {page !== "Onboarding" ? : ""} - {/* */} - {/* */} +
+
+ +

{name}

+ {year} +

+ Description: + Lorem Ipsum is simply dummy text of the printing and + typesetting industry. Lorem Ipsum has been the industry's + standard dummy text ever since the 1500s, when an unknown + printer took a galley of type and scrambled it to make a + type specimen book. It has survived not only five centuries, + but also the leap +

+
+
+ {page !== "Onboarding" ? ( + + + + ) : ( + "" + )} + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + /> +
+
+ + {page !== "Onboarding" ? ( + // eslint-disable-next-line jsx-a11y/iframe-has-title + + ) : ( + "" + )} + {/* */} + {/* */} +
{/*
*/} From 1a166e522b42ec6c1f65c53e4aef72caf7c6d1ef Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 6 May 2020 16:24:57 -0700 Subject: [PATCH 573/822] can clickoutside --- src/components/dashboard/Navigation.js | 64 +++++++++++++++----------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index ca649a0..bee0e7c 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -29,6 +29,8 @@ import ChevronRightIcon from '@material-ui/icons/ChevronRight'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; +import ClickAwayListener from '@material-ui/core/ClickAwayListener'; + //for user toggle menu import Button from '@material-ui/core/Button'; import Menu from '@material-ui/core/Menu'; @@ -125,7 +127,7 @@ const useStyles = makeStyles(theme => ({ marginLeft: drawerWidth, transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.enteringScreen, + // duration: theme.transitions.duration.enteringScreen, }), }, menuButton: { @@ -268,6 +270,10 @@ const Navigation = props => { // Gets new recommendations for account, if applicible // props.recommendationAction(id); // }; + //for click away + const handleClickAway = () => { + setOpen(false); + }; return (
@@ -327,31 +333,36 @@ const Navigation = props => {
- -
- - {theme.direction === 'ltr' ? : } - -
- - - {linkAttributes.map((linkObject, index) => ( - - {linkObject.icon} - - - ))} - - - {/* + +
+ + {theme.direction === 'ltr' ? : } + +
+ + + {linkAttributes.map((linkObject, index) => ( + + {linkObject.icon} + + + ))} + + + {/* {['All mail', 'Trash', 'Spam'].map((text, index) => ( {index % 2 === 0 ? : } @@ -359,7 +370,8 @@ const Navigation = props => { ))} */} -
+
+
Date: Thu, 7 May 2020 09:21:05 -0700 Subject: [PATCH 574/822] fix margin of movie card pop up --- src/components/auth/Onboarding.js | 2 +- src/components/movies/MovieCard.js | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 1d9a1b5..114fb62 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -155,7 +155,7 @@ function Onboarding( page={"Onboarding"} // year={movie.start_year} // trailer={movie.trailer_url} - description={movie.description} + // description={movie.description} movie_id={movie.movie_id} rated={rated ? rated.rating : null} image={ diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 3a892d1..b952db5 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -144,7 +144,8 @@ const useStyles = makeStyles((theme) => ({ paper: { // backgroundColor: theme.palette.background.paper, background: "rgb(23, 23, 23, .96)", - marginTop: "auto", + margin: "auto", + // marginBottom:'auto', width: "55rem", boxShadow: theme.shadows[5], padding: theme.spacing(0, 4, 3), @@ -173,12 +174,15 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "space-evenly", }, [theme.breakpoints.down("xs")]: { - movieInfoModal: { - flexDirection: "column", + movieImgModal:{ + width:'80%', }, - nameModal: {}, paper: { width: "17rem", + // marginTop: "1%", + }, + movieInfoModal: { + flexDirection: "column", }, starsModal: { fontSize: "3vw", @@ -292,13 +296,8 @@ function MovieCard({

{name}

{year}

- Description: - Lorem Ipsum is simply dummy text of the printing and - typesetting industry. Lorem Ipsum has been the industry's - standard dummy text ever since the 1500s, when an unknown - printer took a galley of type and scrambled it to make a - type specimen book. It has survived not only five centuries, - but also the leap + {/* Description: */} + {description}

From 5fdfbb6b632dc5093733d748752670ef6eb6607e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 7 May 2020 12:13:07 -0700 Subject: [PATCH 575/822] attempt to add alert to movie cards --- src/components/movies/MovieCard.js | 74 +++++++++++++++++------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index b952db5..c53bad1 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -16,7 +16,13 @@ import { IconButton, } from "@material-ui/core"; import CloseIcon from "@material-ui/icons/Close"; +//to rate and get an alert +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +function Alert(props) { + return ; +} const styles = (theme) => ({ closeBtn: { display: "flex", @@ -174,8 +180,8 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "space-evenly", }, [theme.breakpoints.down("xs")]: { - movieImgModal:{ - width:'80%', + movieImgModal: { + width: '80%', }, paper: { width: "17rem", @@ -185,7 +191,7 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", }, starsModal: { - fontSize: "3vw", + fontSize: "5vw", }, }, })); @@ -206,6 +212,7 @@ function MovieCard({ description, page, }) { + console.log('movies', trailer) // console.log('trailer',trailer) const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ @@ -294,7 +301,7 @@ function MovieCard({

{name}

- {year} +

{year}

{/* Description: */} {description} @@ -315,44 +322,47 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - /> + "" + )} + + + + + You rated this movie + +

{page !== "Onboarding" ? ( // eslint-disable-next-line jsx-a11y/iframe-has-title - + + ) : ( - "" - )} + "" + )} {/* */} {/* */}
From f909b16e161dbe1a79eb4b34dae97c577de8824f Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 7 May 2020 12:26:34 -0700 Subject: [PATCH 576/822] added trailer --- src/components/dashboard/Explore.js | 2 +- src/components/dashboard/Watchlist.js | 1 - src/components/movies/MovieCard.js | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 04e677f..9568d9a 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -93,7 +93,7 @@ function Explore({ year={movie.start_year} movie_id={movie.movie_id} description={movie.description} - trailer={movie.trailer} + trailer={movie.trailer_url} rated={rated ? rated.rating : null} image={ !posterURI || diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6b34ceb..144f871 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -37,7 +37,6 @@ function Watchlist({ setFilter, movies, }) { - console.log("movies", movies); const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index c53bad1..b766fc1 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -212,8 +212,6 @@ function MovieCard({ description, page, }) { - console.log('movies', trailer) - // console.log('trailer',trailer) const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); From b368e84d18f1f414f66a2cecfbbf5c4018173772 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 7 May 2020 15:34:57 -0700 Subject: [PATCH 577/822] update onboading, add alert snackbar --- src/components/auth/Onboarding.js | 34 +++++++++--- src/components/auth/OnboardingPlateform.js | 42 ++++++++++---- src/components/movies/ConfirmationAlert.js | 30 ++++++++++ src/components/movies/MovieCard.js | 64 +++++++++++----------- 4 files changed, 117 insertions(+), 53 deletions(-) create mode 100644 src/components/movies/ConfirmationAlert.js diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 114fb62..0330095 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -20,6 +20,8 @@ import { Link } from "react-router-dom"; import { useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; +//for alert confirmation +import ConfirmationAlert from '../movies/ConfirmationAlert'; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -84,6 +86,7 @@ function Onboarding( ) { console.log("movies", movies); const classes = useStyles(); + const [openAlert, setOpenAlert] = useState(false); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -101,6 +104,16 @@ function Onboarding( setQuery({ query: e.target.value }); sendChange(e.target.value.trim()); }; + const handleClickStar = () => { + setOpenAlert(true); + console.log('openalert') + }; + const handleCloseStar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + setOpenAlert(false); + }; useEffect(() => { setFilter(""); @@ -109,7 +122,7 @@ function Onboarding( }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render const cardAmount = 25; - + console.log("open alert is now +" + openAlert) if (isFetching) return ; else return ( @@ -127,9 +140,9 @@ function Onboarding( film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -160,13 +173,17 @@ function Onboarding( rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } + openAlert={openAlert} + handleClickStar={handleClickStar} + handleCloseStar={handleCloseStar} + />
); @@ -175,6 +192,7 @@ function Onboarding( Next + {openAlert ? : ("")}
); } diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlateform.js index 18a1093..3c3493a 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlateform.js @@ -4,23 +4,41 @@ import { setFilter } from "../../store/actions"; import { Link } from "react-router-dom"; //img import OnboardingImg from "../../img/happy-running-person.png"; +//material-ui +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + }, + [theme.breakpoints.down("xs")]: { + root: { + flexDirection:'column' + }, + }, +})); + function OnboardingPlateform({ userid }) { + const classes = useStyles(); + return ( -
+
onboarding girl jumping -

You're Almost There

-

- Help Groa personalize your recommendations! Groa works better when you - tell us what you like. +

+

You're Almost There

+

+ Help Groa personalize your recommendations! Groa works better when you + tell us what you like.

-

- Rate six movies on a scale from 1 to 5 and we’ll get you your - personalized recommendations in no time! Train Groa to be your personal - movie AI! +

+ Rate six movies on a scale from 1 to 5 and we’ll get you your + personalized recommendations in no time! Train Groa to be your personal + movie AI!

- - - + + + +
); } diff --git a/src/components/movies/ConfirmationAlert.js b/src/components/movies/ConfirmationAlert.js new file mode 100644 index 0000000..4f071e4 --- /dev/null +++ b/src/components/movies/ConfirmationAlert.js @@ -0,0 +1,30 @@ +import React, { useState } from 'react'; +import Button from '@material-ui/core/Button'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import { makeStyles } from '@material-ui/core/styles'; + +function Alert(props) { + return ; +} + +const useStyles = makeStyles((theme) => ({ + root: { + width: '100%', + '& > * + *': { + marginTop: theme.spacing(2), + }, + }, +})); +const ConfirmationAlert = ({ openAlert, handleCloseStar }) => { + console.log('confirmation alert'); + return ( + + + This is a success message! + + + ) +}; + +export default ConfirmationAlert \ No newline at end of file diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index b766fc1..0cddf0c 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -16,13 +16,7 @@ import { IconButton, } from "@material-ui/core"; import CloseIcon from "@material-ui/icons/Close"; -//to rate and get an alert -import Snackbar from '@material-ui/core/Snackbar'; -import MuiAlert from '@material-ui/lab/Alert'; -function Alert(props) { - return ; -} const styles = (theme) => ({ closeBtn: { display: "flex", @@ -52,6 +46,7 @@ const DialogTitle = withStyles(styles)((props) => { ); }); + const useStyles = makeStyles((theme) => ({ nameModal: { fontSize: "25px", @@ -211,6 +206,7 @@ function MovieCard({ trailer, description, page, + handleClickStar, }) { const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ @@ -250,15 +246,22 @@ function MovieCard({ movie_id: movie.movie_id, rating: newValue, }; - console.log(newRating); + // console.log(newRating); ratingAction(userid, newRating); setYourRating(true); + }; const handleClick = () => { /* Adds movie to the POST request */ addToWatchlistAction(userid, movie); setAdded(true); }; + + const multiFunctions = () => { + handleClose(); + handleClickStar(); + }; + return (
- - - - You rated this movie - - + + + + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + onClick={multiFunctions} + /> +
- {page !== "Onboarding" ? ( // eslint-disable-next-line jsx-a11y/iframe-has-title - - + ) : ( "" )} From 921422e8fb3ea82f0fdebefc0bf67c979ee820d8 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 7 May 2020 19:04:40 -0400 Subject: [PATCH 578/822] creates snack bar for confirmation of rating --- src/components/auth/Onboarding.js | 44 ++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 0330095..4dc5f64 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -20,8 +20,10 @@ import { Link } from "react-router-dom"; import { useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; -//for alert confirmation -import ConfirmationAlert from '../movies/ConfirmationAlert'; + +//testing snackbar +import Snackbar from "@material-ui/core/Snackbar"; +import MuiAlert from "@material-ui/lab/Alert"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -72,6 +74,11 @@ const useStyles = makeStyles((theme) => ({ marginBottom: "2%", }, })); + +function Alert(props) { + return ; +} + function Onboarding( { isFetching, @@ -106,10 +113,10 @@ function Onboarding( }; const handleClickStar = () => { setOpenAlert(true); - console.log('openalert') + console.log("openalert"); }; const handleCloseStar = (event, reason) => { - if (reason === 'clickaway') { + if (reason === "clickaway") { return; } setOpenAlert(false); @@ -122,7 +129,7 @@ function Onboarding( }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render const cardAmount = 25; - console.log("open alert is now +" + openAlert) + console.log("open alert is now ", openAlert); if (isFetching) return ; else return ( @@ -140,9 +147,9 @@ function Onboarding( film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -173,17 +180,14 @@ function Onboarding( rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } - openAlert={openAlert} handleClickStar={handleClickStar} - handleCloseStar={handleCloseStar} - />
); @@ -192,7 +196,15 @@ function Onboarding( Next - {openAlert ? : ("")} + + + This is a success message! + +
); } From c5150505fe8323c02a2d810235cc4e3808ba32f7 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 7 May 2020 19:05:00 -0400 Subject: [PATCH 579/822] removes unneeded component --- src/components/movies/ConfirmationAlert.js | 30 ---------------------- 1 file changed, 30 deletions(-) delete mode 100644 src/components/movies/ConfirmationAlert.js diff --git a/src/components/movies/ConfirmationAlert.js b/src/components/movies/ConfirmationAlert.js deleted file mode 100644 index 4f071e4..0000000 --- a/src/components/movies/ConfirmationAlert.js +++ /dev/null @@ -1,30 +0,0 @@ -import React, { useState } from 'react'; -import Button from '@material-ui/core/Button'; -import Snackbar from '@material-ui/core/Snackbar'; -import MuiAlert from '@material-ui/lab/Alert'; -import { makeStyles } from '@material-ui/core/styles'; - -function Alert(props) { - return ; -} - -const useStyles = makeStyles((theme) => ({ - root: { - width: '100%', - '& > * + *': { - marginTop: theme.spacing(2), - }, - }, -})); -const ConfirmationAlert = ({ openAlert, handleCloseStar }) => { - console.log('confirmation alert'); - return ( - - - This is a success message! - - - ) -}; - -export default ConfirmationAlert \ No newline at end of file From e1e0541d40db69eaa3cf70747e85469174a1b809 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 7 May 2020 19:05:20 -0400 Subject: [PATCH 580/822] prettier linter --- src/components/movies/MovieCard.js | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 0cddf0c..67cf346 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -29,7 +29,7 @@ const styles = (theme) => ({ }); const DialogTitle = withStyles(styles)((props) => { - const { children, classes, onClose, ...other } = props; + const { children, classes, onClose } = props; return (
{children} @@ -46,7 +46,6 @@ const DialogTitle = withStyles(styles)((props) => { ); }); - const useStyles = makeStyles((theme) => ({ nameModal: { fontSize: "25px", @@ -176,7 +175,7 @@ const useStyles = makeStyles((theme) => ({ }, [theme.breakpoints.down("xs")]: { movieImgModal: { - width: '80%', + width: "80%", }, paper: { width: "17rem", @@ -249,7 +248,6 @@ function MovieCard({ // console.log(newRating); ratingAction(userid, newRating); setYourRating(true); - }; const handleClick = () => { /* Adds movie to the POST request */ @@ -323,15 +321,13 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} - - + "" + )} -
{page !== "Onboarding" ? ( // eslint-disable-next-line jsx-a11y/iframe-has-title - + ) : ( - "" - )} + "" + )} {/* */} {/* */}
From 9c5ce6dbcbc25e6a3d5e8bad70bb65dde524f4f2 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 7 May 2020 21:55:50 -0400 Subject: [PATCH 581/822] OKTA Authentication *Axios with auth modified to work with accessToken from okta api *Every instance of AxiosWithAuth has been given an AccessToken as parameter in actions *login page needs to be edited to redirect to okta login screen *login page code commented out, needs to be taken out and replace with okta redirect --- package-lock.json | 278 +++++++++++++++----- package.json | 3 +- src/App.js | 35 ++- src/Test.js | 32 +++ src/components/auth/DataUpload.js | 7 +- src/components/auth/Login.js | 87 ++++-- src/components/dashboard/Explore.js | 8 +- src/components/dashboard/Ratings.js | 6 +- src/components/dashboard/Recommendations.js | 7 +- src/components/dashboard/Watchlist.js | 9 +- src/components/movies/MovieCard.js | 9 +- src/config/GetOktaToken.js | 12 + src/config/oktaConfig.js | 17 ++ src/store/actions/loginAction.js | 15 +- src/store/actions/movieAction.js | 4 +- src/store/actions/ratingAction.js | 8 +- src/store/actions/recommendationActions.js | 4 +- src/store/actions/uploadAction.js | 4 +- src/store/actions/watchlistActions.js | 12 +- src/utils/axiosWithAuth.js | 29 +- 20 files changed, 446 insertions(+), 140 deletions(-) create mode 100644 src/Test.js create mode 100644 src/config/GetOktaToken.js create mode 100644 src/config/oktaConfig.js diff --git a/package-lock.json b/package-lock.json index 34fb96b..e961ea4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1446,6 +1446,35 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@okta/configuration-validation": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@okta/configuration-validation/-/configuration-validation-0.4.2.tgz", + "integrity": "sha512-0mXoHST7KnpZR5kO3i9OKidALjUIT7y3nQ5yFG7Jo3/p953YPyt3nKGvL8uFsDybucO/v57KxGEp4aAZKxsl/A==" + }, + "@okta/okta-auth-js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@okta/okta-auth-js/-/okta-auth-js-3.1.1.tgz", + "integrity": "sha512-ojAyTaLrdS5x2BolXOGnOnFhyuuEX+J8RL721Kb0Nu4oWnPOYHEbEPKRrd3P5MB+A3ykCp3Gi4U9Tp75KbaZ2g==", + "requires": { + "Base64": "0.3.0", + "cross-fetch": "^3.0.0", + "js-cookie": "2.2.0", + "node-cache": "^4.2.0", + "tiny-emitter": "1.1.0", + "xhr2": "0.1.3" + } + }, + "@okta/okta-react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@okta/okta-react/-/okta-react-3.0.1.tgz", + "integrity": "sha512-t6eE4OJgdfmxbkjmQNYVoTJAuXgJ6sYkD49QCk7p2TPzrRQCk5aSNc3802zEBV583ahtZUzvA1q3wRAV6GQGmw==", + "requires": { + "@okta/configuration-validation": "^0.4.1", + "@okta/okta-auth-js": "^3.0.0", + "babel-runtime": "^6.26.0", + "prop-types": "^15.5.10" + } + }, "@sheerun/mutationobserver-shim": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", @@ -2198,6 +2227,11 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "Base64": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.3.0.tgz", + "integrity": "sha1-baJhpOgNT6D1xoQlTlvM0Wu9zp8=" + }, "abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", @@ -3592,15 +3626,60 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, "clone-deep": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", @@ -3937,6 +4016,15 @@ "warning": "^4.0.3" } }, + "cross-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz", + "integrity": "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==", + "requires": { + "node-fetch": "2.6.0", + "whatwg-fetch": "3.0.0" + } + }, "cross-spawn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", @@ -6640,9 +6728,9 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indent-string": { "version": "4.0.0", @@ -6789,11 +6877,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -8244,9 +8327,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -8415,6 +8498,11 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" }, + "js-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", + "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8675,14 +8763,6 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -9382,6 +9462,20 @@ "tslib": "^1.10.0" } }, + "node-cache": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", + "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", + "requires": { + "clone": "2.x", + "lodash": "^4.17.15" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -9501,9 +9595,9 @@ } }, "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -9519,7 +9613,7 @@ "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", - "sass-graph": "^2.2.4", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -9855,14 +9949,6 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -12418,14 +12504,14 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" + "yargs": "^13.3.2" } }, "sass-loader": { @@ -13709,6 +13795,11 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-emitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-1.1.0.tgz", + "integrity": "sha1-q0BaIf/tgUp2wZc5ZICT1wZU/ss=" + }, "tiny-invariant": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", @@ -15745,9 +15836,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", @@ -15979,6 +16070,11 @@ "async-limiter": "~1.0.0" } }, + "xhr2": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.3.tgz", + "integrity": "sha1-y/xHWaabSoiOeM9PILBRA4dXvRE=" + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -16013,44 +16109,88 @@ } }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" }, "dependencies": { - "camelcase": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" } } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { - "camelcase": "^3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } }, diff --git a/package.json b/package.json index 09fec47..ef466e5 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,13 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.46", "@material-ui/styles": "^4.9.10", + "@okta/okta-react": "^3.0.1", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.1.2", "acorn": "^7.1.1", "axios": "^0.19.2", - "node-sass": "^4.13.1", + "node-sass": "^4.14.1", "puppeteer": "^2.1.1", "react": "^16.13.1", "react-dom": "^16.13.1", diff --git a/src/App.js b/src/App.js index 2b50693..ab6a3cf 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,9 @@ import React, { useEffect } from "react"; import { Route } from "react-router-dom"; +import { Security, SecureRoute, LoginCallback } from '@okta/okta-react'; +import Test from './Test'; + // local imports import PrivateRoute from "./utils/privateRoute.js"; import Recommendations from "./components/dashboard/Recommendations.js"; @@ -14,6 +17,9 @@ import Explore from "./components/dashboard/Explore.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; +import oktaConfig from './config/oktaConfig'; +import { useOktaAuth } from '@okta/okta-react'; + // config imports import reactGAinitialization from "./config/analytics.js"; @@ -31,6 +37,10 @@ import { loadState, saveState } from "./store/localStorage.js"; import { createMuiTheme } from "@material-ui/core/styles"; import { ThemeProvider } from "@material-ui/core/styles"; + + + + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const store = createStore( reducer, @@ -48,6 +58,8 @@ store.subscribe(() => { }); function App() { + + useEffect(() => reactGAinitialization(), []); const theme = React.useMemo( () => @@ -71,10 +83,13 @@ function App() { -
- - + + +
+ {/* this is fine as a route because all of the routes that will have display their component will only be avalible on a private route */} + + - - + {/* this could be a modal */} {/* */} - - + +
+
diff --git a/src/Test.js b/src/Test.js new file mode 100644 index 0000000..1ea7982 --- /dev/null +++ b/src/Test.js @@ -0,0 +1,32 @@ +import React, { useEffect, useState } from 'react'; +import { useOktaAuth } from '@okta/okta-react'; +import AxiosWithAuth from './utils/axiosWithAuth'; + + +const Test = () => { + const { authState } = useOktaAuth(); + const { accessToken } = authState; + const [testing, setTesting] = useState(null); + +// fetch messages + useEffect(() => { + if (authState.isAuthenticated) { + AxiosWithAuth(accessToken) + .get(`http://localhost:8080/`) + .then(res => { + console.log('SUCCESS TEST COMPONENT OOOOOOOOOOOOOOO', res) + setTesting(res.data) + }) + .catch(err => console.log('ERROR in TEST COMPONENT', err)) + + } + }, [testing]); + + + return ( +
+ {testing === null ?

This Hasn't Fetched Anything

:

{testing}

} +
+ ) +}; +export default Test; \ No newline at end of file diff --git a/src/components/auth/DataUpload.js b/src/components/auth/DataUpload.js index 8e5adff..92206ee 100644 --- a/src/components/auth/DataUpload.js +++ b/src/components/auth/DataUpload.js @@ -9,10 +9,15 @@ import fileAlt from "../../img/file-alt.svg"; // children components import Congratulations from "./Congratulations.js"; import LoadingScreen from "../layout/LoadingScreen.js"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { const [uploadSuccess, setUploadSuccess] = useState(false); + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const {accessToken} = authState; + useEffect(() => { setFilter("") }) @@ -48,7 +53,7 @@ const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { const handleChange = file => { let data = new FormData(); data.append("movies", file, file.name); - uploadAction(userid, data, setUploadSuccess); + uploadAction(userid, data, setUploadSuccess, accessToken); data = new FormData(); }; diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index 1db3a60..bcc8fd7 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -1,8 +1,11 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; +//OKTA +import { useOktaAuth } from '@okta/okta-react'; + // styling imports import Picture1 from "../../img/watching-tv.png"; import { TextField } from "@material-ui/core"; @@ -48,6 +51,37 @@ const RegisterSchema = Yup.object().shape({ }); const LoginPage = (props) => { + + //OKTA useOKTA AUTH + const { authState, authService } = useOktaAuth(); + const [userInfo, setUserInfo] = useState(null); + + // console.log('AUTHOKTA', authState); + // console.log('AUTHOKTASERVICE', authService); + + + //Okta Login/Logout redirects + const login = async () => authService.login('/'); + const logout = async () => authService.logout('/'); + + useEffect(() => { + // if(authState.isAuthenticated){ + // props.loginAction(authState.accessToken, props.history); + // } + if (authState.isAuthenticated) { + authService.getUser() + .then((info) => { + console.log('USERINFO', info.sub) + props.loginAction(authState.accessToken, info.sub, props.history) + + }) + .catch(err => console.log("Error fetching User info in UseEffect", err)) + } + }, []); + + + + const [user, setUser] = useState({ user_name: "", password: "", @@ -57,17 +91,17 @@ const LoginPage = (props) => { }); const classes = useStyles(); - const handleChange = (e) => { - setUser({ - ...user, - [e.target.name]: e.target.value, - }); - console.log(user); - }; + // const handleChange = (e) => { + // setUser({ + // ...user, + // [e.target.name]: e.target.value, + // }); + // console.log(user); + // }; - const onSubmit = () => { - props.loginAction(user, props.history); - }; + // const onSubmit = () => { + // props.loginAction(user, props.history); + // }; return (
{
{/* FORM START */} -
+ {/*
{ Sign in with Facebook

- {/* Sign in with Facebook */} + {/* Sign in with Facebook
@@ -178,14 +212,29 @@ const LoginPage = (props) => {

+ {/* Test + +
+

IIIIIIIIIIIIII

+ {!authState.isAuthenticated &&

TEST PAGE/REDIRECT

} +
+ + +
- {/*
- -
T e r m s and C o n d i t i on s
-
P r i v a c y
-
*/} -
+ +
*/} {/* FORM ENDS */} + +
+

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

+ {/* {!authState.isAuthenticated &&

Please Login

} + {authState.isAuthenticated &&

You are Logged in

} */} + + {!authState.isAuthenticated ?

Please Login

:

You are Logged in Logout

} + + +
{/* END OF MAIN CONTENT */} diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 3e1531e..acb2f3d 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -15,6 +15,7 @@ import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -37,13 +38,16 @@ function Explore({ }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); + const { authState, authService } = useOktaAuth(); + const {accessToken} = authState; + // console.log("|||||||||||||||||||||||",accessToken); useEffect(() => { setFilter(""); // Returns the movies - getMoviesAction(userid); + getMoviesAction(userid, accessToken); // returns a list of recommendations to start the recommendations page - recommendationAction(userid); + recommendationAction(userid, accessToken); }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); // How many movies render const cardAmount = 25; diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 04d089b..d895529 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -10,6 +10,7 @@ import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { makeStyles } from '@material-ui/core/styles'; import { GridList } from "@material-ui/core/"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -28,13 +29,16 @@ function Ratings({ searchTerm, setFilter, }) { + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const {accessToken} = authState; //for sizing of the movie cards const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); useEffect(() => { setFilter(""); // Returns the ratings - getRatingAction(userid); + getRatingAction(userid, accessToken); }, [getRatingAction, userid, setFilter]); console.log(`here + ${screenWidth}`); console.log(classes); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 078215b..f3e255c 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,4 +1,5 @@ import React, { useEffect } from "react"; +import { useOktaAuth } from '@okta/okta-react'; // tools import { connect } from "react-redux"; import { @@ -33,10 +34,14 @@ function Recommendations({ isUploaded, setFilter, }) { + + const { authState } = useOktaAuth(); + const { accessToken } = authState; + useEffect(() => { setFilter(""); if (isUploaded === true) { - recommendationAction(userid); + recommendationAction(userid, accessToken); toggleIsUploaded(); } recommendationAction(userid); diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index d4122a9..288db1f 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -16,6 +16,7 @@ import MovieCard from "../movies/MovieCard.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -36,6 +37,10 @@ function Watchlist({ removeFromWatchlistAction, setFilter, }) { + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const {accessToken} = authState; + const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui const classes = useStyles(); @@ -45,11 +50,11 @@ function Watchlist({ useEffect(() => { setFilter(""); // Returns the users watchlist from the database - getWatchlistAction(userid); + getWatchlistAction(userid, accessToken); }, [getWatchlistAction, userid, isDeleting, setFilter]); function handleClick(id) { - removeFromWatchlistAction(userid, id); + removeFromWatchlistAction(userid, id, accessToken); } if (isFetching) return ; diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index b67c1b8..3749b3f 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -9,6 +9,7 @@ import Button from "@material-ui/core/Button"; import CardActions from "@material-ui/core/CardActions"; import CardContent from "@material-ui/core/CardContent"; import Typography from "@material-ui/core/Typography"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ control: { @@ -89,6 +90,10 @@ function MovieCard({ rated, ratings, }) { + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const {accessToken} = authState; + const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); @@ -118,12 +123,12 @@ function MovieCard({ rating: newValue, }; console.log(newRating); - ratingAction(userid, newRating); + ratingAction(userid, newRating, accessToken); setYourRating(true); }; const handleClick = () => { /* Adds movie to the POST request */ - addToWatchlistAction(userid, movie); + addToWatchlistAction(userid, movie, accessToken); setAdded(true); }; return ( diff --git a/src/config/GetOktaToken.js b/src/config/GetOktaToken.js new file mode 100644 index 0000000..10f1ad5 --- /dev/null +++ b/src/config/GetOktaToken.js @@ -0,0 +1,12 @@ +import React, { useEffect, useState } from 'react'; +import { useOktaAuth } from '@okta/okta-react'; + +const GetOktaToken = () => { + + const { authState, authService } = useOktaAuth(); + const { accessToken } = authState; + + return [ accessToken, authService ] +} + +export default GetOktaToken; \ No newline at end of file diff --git a/src/config/oktaConfig.js b/src/config/oktaConfig.js new file mode 100644 index 0000000..cf50799 --- /dev/null +++ b/src/config/oktaConfig.js @@ -0,0 +1,17 @@ +const CLIENT_ID = `${process.env.CLIENT_ID}`; +const ISSUER = `${process.env.ISSUER}`; +const OKTA_TESTING_DISABLEHTTPSCHECK = process.env.OKTA_TESTING_DISABLEHTTPSCHECK || false; + +export default { + oidc: { + clientId: '0oaap4ry7yG1neZhz4x6', + issuer: 'https://dev-568768.okta.com/oauth2/default', + redirectUri: 'http://localhost:3000/implicit/callback', + scopes: ['openid', 'profile', 'email'], + pkce: true, + disableHttpsCheck: OKTA_TESTING_DISABLEHTTPSCHECK, + }, + resourceServer: { + messagesUrl: 'http://localhost:3000/api/messages', + }, +}; diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 6eff633..cc15a83 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -4,17 +4,18 @@ import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const FETCHING_USER_LOGIN_SUCCESS = "FETCHING_USER_LOGIN_SUCCESS"; export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; + // LOGIN -export function loginAction(userCreds, history) { - console.log(userCreds) +export function loginAction(token, okta_id, history) { + console.log('okta ID in loginAction',okta_id) return dispatch => { - axiosWithAuth() - .post("/login", userCreds) + axiosWithAuth(token) + .post("/login", {id:okta_id}) .then(res => { - console.log(res) - localStorage.setItem("token", res.data.token); + console.log("loginAction res",res) + // localStorage.setItem("token", res.data.token); dispatch({ - type: FETCHING_USER_LOGIN_SUCCESS, + type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); dispatch({ type: FETCHING_RATINGS_SUCCESS, diff --git a/src/store/actions/movieAction.js b/src/store/actions/movieAction.js index cc2c147..03323be 100644 --- a/src/store/actions/movieAction.js +++ b/src/store/actions/movieAction.js @@ -3,12 +3,12 @@ export const FETCHING_MOVIES_START = "FETCHING_MOVIES_START"; export const FETCHING_MOVIES_SUCCESS = "FETCHING_MOVIES_SUCCESS"; export const FETCHING_MOVIES_FAIL = "FETCHING_MOVIES_FAIL"; //GET MOVIES -export function getMoviesAction(id) { +export function getMoviesAction(id, token) { return dispatch => { dispatch({ type: FETCHING_MOVIES_START }); - axiosWithAuth() + axiosWithAuth(token) .get(`/${id}/get-movies`) .then(res => { dispatch({ diff --git a/src/store/actions/ratingAction.js b/src/store/actions/ratingAction.js index a4bcb12..cdcf741 100644 --- a/src/store/actions/ratingAction.js +++ b/src/store/actions/ratingAction.js @@ -8,12 +8,12 @@ export const FETCHING_RATINGS_SUCCESS = "FETCHING_RATINGS_SUCCESS"; export const FETCHING_RATINGS_FAIL = "FETCHING_RATINGS_FAIL"; // RATINGS -export function ratingAction(id, rating) { +export function ratingAction(id, rating, token) { return dispatch => { dispatch({ type: ADDING_RATING_START }); - axiosWithAuth() + axiosWithAuth(token) .post(`/${id}/add-movie-rating`, rating) .then(res => { dispatch({ @@ -32,12 +32,12 @@ export function ratingAction(id, rating) { } //GET RATINGS -export function getRatingAction(id) { +export function getRatingAction(id, token) { return dispatch => { dispatch({ type: FETCHING_RATINGS_START }); - axiosWithAuth() + axiosWithAuth(token) .get(`/${id}/get-ratings`) .then(res => { dispatch({ diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index 3dfe217..a9dedbd 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -6,12 +6,12 @@ export const FETCHING_RECOMMENDATIONS_FAIL = "FETCHING_RECOMMENDATIONS_FAIL"; // RECOMMENDATIONS // this call requests new recommendations be inserted into the database, then returns latest -export function recommendationAction(id) { +export function recommendationAction(id, accessToken) { return (dispatch) => { dispatch({ type: FETCHING_RECOMMENDATIONS_START, }); - axiosWithAuth() + axiosWithAuth(accessToken) .get(`/${id}/recommendations`) .then((res) => { console.log(res); diff --git a/src/store/actions/uploadAction.js b/src/store/actions/uploadAction.js index 318457c..0ff2874 100644 --- a/src/store/actions/uploadAction.js +++ b/src/store/actions/uploadAction.js @@ -5,10 +5,10 @@ export const UPLOADING_FILE_FAIL = "UPLOADING_FILE_FAIL"; export const UPLOADED_SUCCESSFUL = "UPLOADED_SUCCESSFUL"; // UPLOADING -export function uploadAction(userid, data, setUploadSuccess) { +export function uploadAction(userid, data, setUploadSuccess, token) { return dispatch => { dispatch({ type: UPLOADING_FILE_START }); - axiosWithAuth() + axiosWithAuth(token) // this is insantiated when a file is added to input .post(`/${userid}/uploading`, data, { headers: { diff --git a/src/store/actions/watchlistActions.js b/src/store/actions/watchlistActions.js index 46d28be..84910c2 100644 --- a/src/store/actions/watchlistActions.js +++ b/src/store/actions/watchlistActions.js @@ -12,12 +12,12 @@ export const FETCHING_WATCHLIST_SUCCESS = "FETCHING_WATCHLIST_SUCCESS"; export const FETCHING_WATCHLIST_FAIL = "FETCHING_WATCHLIST_FAIL"; // ADD TO WATCHLIST -export function addToWatchlistAction(id, movie) { +export function addToWatchlistAction(id, movie, token) { return dispatch => { dispatch({ type: ADDING_WATCHLIST_START }); - axiosWithAuth() + axiosWithAuth(token) .post(`/${id}/add-to-watchlist`, movie) .then(res => { dispatch({ @@ -35,12 +35,12 @@ export function addToWatchlistAction(id, movie) { } // GET WATCHLIST -export function getWatchlistAction(id) { +export function getWatchlistAction(id, token) { return dispatch => { dispatch({ type: FETCHING_WATCHLIST_START }); - axiosWithAuth() + axiosWithAuth(token) .get(`/${id}/get-watchlist`) .then(res => { dispatch({ @@ -58,12 +58,12 @@ export function getWatchlistAction(id) { } // DELETE FROM WATCHLIST -export function removeFromWatchlistAction(user_id, watchlist_id) { +export function removeFromWatchlistAction(user_id, watchlist_id, token) { return dispatch => { dispatch({ type: REMOVING_FROM_WATCHLIST_START }); - axiosWithAuth() + axiosWithAuth(token) .delete(`/${user_id}/remove-from-watchlist/${watchlist_id}`) .then(res => { console.log(res); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 9f654c9..2347379 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -1,14 +1,19 @@ -import axios from "axios"; - -const axiosWithAuth = () => { - const token = localStorage.getItem("token"); - - return axios.create({ - baseURL: "https://dev.groa.us/api/users", - headers: { - Authorization: token, - }, - }); -}; +import axios from 'axios'; +// import GetOktaToken from '../config/GetOktaToken'; + + +//baseURL needs to be properly implement once endpoints for login are available + +const axiosWithAuth = (accessToken) => { + + // const [ accessToken ] = GetOktaToken(); + + return axios.create({ + headers: { + Authorization: `Bearer ${accessToken}` + }, + baseURL: "http://localhost:8080/api/users" + }) +} export default axiosWithAuth; \ No newline at end of file From 349dabb4b57967d4540c8447288fda172766663d Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 7 May 2020 22:31:54 -0400 Subject: [PATCH 582/822] navbar logout button logs you out of okta --- src/components/dashboard/Navigation.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 8d2b0e4..cb36471 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -41,6 +41,7 @@ import ThumbUpRoundedIcon from '@material-ui/icons/ThumbUpRounded'; import PlaylistAddCheckRoundedIcon from '@material-ui/icons/PlaylistAddCheckRounded'; import GradeRoundedIcon from '@material-ui/icons/GradeRounded'; import ExitToAppRoundedIcon from '@material-ui/icons/ExitToAppRounded'; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const drawerWidth = 240; @@ -182,6 +183,13 @@ const useStyles = makeStyles(theme => ({ const Navigation = props => { + + //OKTA useOKTA AUTH + const { authState, authService } = useOktaAuth(); + const [userInfo, setUserInfo] = useState(null); + + const logout = async () => authService.logout('/'); + //for nav bar const theme = useTheme(); const [open, setOpen] = React.useState(false); @@ -259,10 +267,10 @@ const Navigation = props => { // props.setFilter(""); // }; - const logout = () => { - localStorage.removeItem("token"); - localStorage.removeItem("state"); - }; + // const logout = () => { + // localStorage.removeItem("token"); + // localStorage.removeItem("state"); + // }; // const getNewRecommendations = id => { // Gets new recommendations for account, if applicible @@ -304,7 +312,7 @@ const Navigation = props => { > Ratings Upload - Logout + Logout
From 67289db7537a0312b89b99d052de942fb1ab7622 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 7 May 2020 23:10:59 -0400 Subject: [PATCH 583/822] user rerouted to dashboard if authenticated inside the /register component --- src/App.js | 1 + src/components/auth/Login.js | 26 +++++++++----------------- src/components/auth/Register.js | 27 +++++++++++++++++++++++---- src/store/actions/loginAction.js | 2 -- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/App.js b/src/App.js index ab6a3cf..c6f204e 100644 --- a/src/App.js +++ b/src/App.js @@ -58,6 +58,7 @@ store.subscribe(() => { }); function App() { + useEffect(() => reactGAinitialization(), []); diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index bcc8fd7..c31f888 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -54,10 +54,7 @@ const LoginPage = (props) => { //OKTA useOKTA AUTH const { authState, authService } = useOktaAuth(); - const [userInfo, setUserInfo] = useState(null); - // console.log('AUTHOKTA', authState); - // console.log('AUTHOKTASERVICE', authService); //Okta Login/Logout redirects @@ -65,15 +62,10 @@ const LoginPage = (props) => { const logout = async () => authService.logout('/'); useEffect(() => { - // if(authState.isAuthenticated){ - // props.loginAction(authState.accessToken, props.history); - // } if (authState.isAuthenticated) { authService.getUser() .then((info) => { - console.log('USERINFO', info.sub) - props.loginAction(authState.accessToken, info.sub, props.history) - + props.loginAction(authState.accessToken, info.sub, props.history) }) .catch(err => console.log("Error fetching User info in UseEffect", err)) } @@ -82,14 +74,14 @@ const LoginPage = (props) => { - const [user, setUser] = useState({ - user_name: "", - password: "", - }); - const { register, handleSubmit, errors } = useForm({ - validationSchema: RegisterSchema, - }); - const classes = useStyles(); + // const [user, setUser] = useState({ + // user_name: "", + // password: "", + // }); + // const { register, handleSubmit, errors } = useForm({ + // validationSchema: RegisterSchema, + // }); + // const classes = useStyles(); // const handleChange = (e) => { // setUser({ diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index bd8d8d8..7e67780 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,8 +1,9 @@ -import React, { useState } from "react"; +import React, { useState, useEffect} from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; +import { Link, useHistory } from "react-router-dom"; + //For validation import { useForm } from "react-hook-form"; @@ -17,6 +18,8 @@ import Box from '@material-ui/core/Box'; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; +//OKTA +import { useOktaAuth } from '@okta/okta-react'; function Copyright() { return ( @@ -55,6 +58,23 @@ const RegisterSchema = Yup.object().shape({ }); const Register = (props) => { + const history = useHistory(); + const { authState, authService } = useOktaAuth(); + const login = async () => authService.login('/'); + const logout = async () => authService.logout('/'); + + //if user already Authenticated, loginAction redirects to to explore page + useEffect(() => { + console.log('))))))))))))))))))))))))))))))))))))))))))))))',authState.isAuthenticated) + authService.getUser() + .then((info) => { + props.loginAction(authState.accessToken, info.sub, history) + }) + .catch(err => console.log("Error fetching User info in UseEffect", err)) + }, [authState]); + + + const [users, setUsers] = useState({ email: "", user_name: "", @@ -206,9 +226,8 @@ const Register = (props) => {

Login

Already have an account?

diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index cc15a83..92e9b28 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -7,13 +7,11 @@ export const FETCHING_USER_LOGIN_FAIL = "FETCHING_USER_LOGIN_FAIL"; // LOGIN export function loginAction(token, okta_id, history) { - console.log('okta ID in loginAction',okta_id) return dispatch => { axiosWithAuth(token) .post("/login", {id:okta_id}) .then(res => { console.log("loginAction res",res) - // localStorage.setItem("token", res.data.token); dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); From 219d69b552f89bf34bd2b077cf5eab5bb52250f6 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 8 May 2020 12:26:48 -0700 Subject: [PATCH 584/822] trailer sizes adjusted --- src/components/auth/OnboardingPlateform.js | 15 +++++++++--- src/components/dashboard/Explore.js | 1 + src/components/dashboard/Ratings.js | 2 ++ src/components/movies/MovieCard.js | 27 +++++++++++++++++----- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlateform.js index 3c3493a..2b6bbb1 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlateform.js @@ -11,6 +11,15 @@ const useStyles = makeStyles((theme) => ({ root: { display: 'flex', }, + onboardingText:{ + display:'flex', + justifyContent:'center', + flexDirection:'column', + }, + onboardingBut:{ + display:'flex', + alignItems:'center', + }, [theme.breakpoints.down("xs")]: { root: { flexDirection:'column' @@ -24,7 +33,7 @@ function OnboardingPlateform({ userid }) { return (
onboarding girl jumping -
+

You're Almost There

Help Groa personalize your recommendations! Groa works better when you @@ -35,8 +44,8 @@ function OnboardingPlateform({ userid }) { personalized recommendations in no time! Train Groa to be your personal movie AI!

- - + +
diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 9568d9a..2222643 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -34,6 +34,7 @@ function Explore({ searchTerm, setFilter, ratings, + handleClickStar, }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 04d089b..4df1a64 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -69,6 +69,8 @@ function Ratings({ movie_id={movie.movie_id} year={movie.start_year} rated={movie.rating} + description={movie.description} + trailer={movie.trailer_url} image={ !posterURI || posterURI === "None" || diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 67cf346..f5d20f0 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -125,6 +125,7 @@ const useStyles = makeStyles((theme) => ({ backfaceVisibility: "hidden", borderRadius: "11px", margin: "auto", + paddingBottom:'1%', // '&:hover':{ // opacity: 0.3, // } @@ -173,6 +174,11 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", justifyContent: "space-evenly", }, + videoWrapper:{ + position:'relative', + height:0, + paddingBottom:'56.25%', + }, [theme.breakpoints.down("xs")]: { movieImgModal: { width: "80%", @@ -187,6 +193,10 @@ const useStyles = makeStyles((theme) => ({ starsModal: { fontSize: "5vw", }, + // trailerModal:{ + // width:'auto', + // height:'auto', + // }, }, })); @@ -306,9 +316,9 @@ function MovieCard({ {description}

-
+
{page !== "Onboarding" ? ( - + //
+
+ {/*
*/} {page !== "Onboarding" ? ( // eslint-disable-next-line jsx-a11y/iframe-has-title - */} {/* */}
From 272a614a1c3c2ccf2821f28ad97a6208913a786f Mon Sep 17 00:00:00 2001 From: Luis PM Date: Fri, 8 May 2020 17:32:54 -0400 Subject: [PATCH 585/822] okta auth implementation --- src/config/oktaConfig.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/oktaConfig.js b/src/config/oktaConfig.js index cf50799..0bbb3d1 100644 --- a/src/config/oktaConfig.js +++ b/src/config/oktaConfig.js @@ -1,5 +1,5 @@ -const CLIENT_ID = `${process.env.CLIENT_ID}`; -const ISSUER = `${process.env.ISSUER}`; +const CLIENT_ID = process.env.CLIENT_ID; +const ISSUER = process.env.ISSUER; const OKTA_TESTING_DISABLEHTTPSCHECK = process.env.OKTA_TESTING_DISABLEHTTPSCHECK || false; export default { From 6ea847475f243e3af65571664a684ae251e090a2 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Fri, 8 May 2020 18:41:23 -0400 Subject: [PATCH 586/822] registration component --- src/components/auth/Register.js | 82 +++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 7e67780..819f520 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -49,12 +49,9 @@ const useStyles = makeStyles((theme) => ({ // Validation Schema const RegisterSchema = Yup.object().shape({ - user_name: Yup.string().required("Username is required"), + firstName: Yup.string().required("firstName is required"), + lastName: Yup.string().required("lastName is required"), email: Yup.string().email().required("Email is required"), - password: Yup.string().min(6).required("Password is required"), - confirmpassword: Yup.string() - .oneOf([Yup.ref("password"), null], "Passwords must match") - .required(), }); const Register = (props) => { @@ -77,9 +74,8 @@ const Register = (props) => { const [users, setUsers] = useState({ email: "", - user_name: "", - password: "", - confirmpassword: "", + firstName: "", + lastName: "", }); const { register, handleSubmit, errors } = useForm({ validationSchema: RegisterSchema, @@ -95,9 +91,9 @@ const Register = (props) => { const onSubmit = () => { let user = { - user_name: users.user_name, + firstName: users.firstName, + lastName:users.lastName, email: users.email, - password: users.password, }; console.log("user before register button", user); props.registerAction(user, props.history); @@ -139,35 +135,51 @@ const Register = (props) => { > {/* */} {/* */} + + {errors.email && errors.email.type === "required" && ( +

An email is required

+ )} + {/*
*/} + {/* */} - {errors.email && errors.email.type === "required" && ( -

An email is required

- )} - {/*
*/} - {/* */} + {errors.firstName && errors.firstName.type === "required" && ( +

First Name is required

+ )} - {errors.user_name && errors.user_name.type === "required" && ( -

Username is required

- )} + {errors.lastName && errors.lastName.type === "required" && ( +

Last Name is required

+ )} + + {errors.email && errors.email.type === "required" && ( +

Email is required

+ )} {/*
*/} {/* */} - { label="Password" variant="outlined" inputRef={register} - /> - {errors.password && errors.password.type === "required" && ( -

Password required

- )} - {errors.password && errors.password.type === "min" && ( + /> */} + {/* {errors.password && errors.password.type === "required" && ( +

Password required

*/} + + {/* {errors.password && errors.password.type === "min" && (

Password must be at least 6 characters long

- )} + )} */} {/*
*/} {/* */} - { label="Confirm Password" variant="outlined" inputRef={register} - /> - {errors.confirmpassword && + /> */} + {/* {errors.confirmpassword && errors.confirmpassword.type === "required" && (

Password Confirmation Required

)} {errors.confirmpassword && errors.confirmpassword.type === "oneOf" && (

Password does not match

- )} + )} */} {/*
*/} {/*
*/}
From 50c7b7f53138fbdcacbc2b0db9476e4e29d94a1a Mon Sep 17 00:00:00 2001 From: Luis PM Date: Fri, 8 May 2020 18:45:12 -0400 Subject: [PATCH 587/822] registration action creator console.log to see if it works --- src/store/actions/registerAction.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 534b1ce..7510a19 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -18,6 +18,7 @@ export function registerAction(userCreds, history) { .post("/login", user) .then(res => { localStorage.setItem("token", res.data.token); + console.log("THIS IS WORKING BOIIIIII") dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id From 5688c98772cc6e6af44a0f82419496ed823d0862 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Fri, 8 May 2020 19:03:33 -0400 Subject: [PATCH 588/822] updated okta config urls --- src/config/oktaConfig.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config/oktaConfig.js b/src/config/oktaConfig.js index 0bbb3d1..5ac305c 100644 --- a/src/config/oktaConfig.js +++ b/src/config/oktaConfig.js @@ -6,12 +6,9 @@ export default { oidc: { clientId: '0oaap4ry7yG1neZhz4x6', issuer: 'https://dev-568768.okta.com/oauth2/default', - redirectUri: 'http://localhost:3000/implicit/callback', + redirectUri: 'https://www.groa.us/implicit/callback', scopes: ['openid', 'profile', 'email'], pkce: true, disableHttpsCheck: OKTA_TESTING_DISABLEHTTPSCHECK, }, - resourceServer: { - messagesUrl: 'http://localhost:3000/api/messages', - }, }; From 04658b5fd68bde0df2b7148a0519ab256e815dbf Mon Sep 17 00:00:00 2001 From: Luis PM Date: Fri, 8 May 2020 19:12:35 -0400 Subject: [PATCH 589/822] axios with auth fix --- src/utils/axiosWithAuth.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 2347379..db558f7 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -12,8 +12,9 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "http://localhost:8080/api/users" + baseURL: "https://dev.groa.us/api/users" }) } + export default axiosWithAuth; \ No newline at end of file From 908ff569cc370a6072c3b067e372ed4247ddc813 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 8 May 2020 16:40:46 -0700 Subject: [PATCH 590/822] sucess snackbar message edit --- src/components/auth/Onboarding.js | 2 +- src/components/movies/MovieCard.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 4dc5f64..fb37777 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -202,7 +202,7 @@ function Onboarding( onClose={handleCloseStar} > - This is a success message! + You have successfully rated this movie!
diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index f5d20f0..8823e13 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -316,7 +316,7 @@ function MovieCard({ {description}

-
+ {/*
*/} {page !== "Onboarding" ? ( //
+ {/*
*/}
@@ -364,7 +364,7 @@ function MovieCard({ // eslint-disable-next-line jsx-a11y/iframe-has-title */} - {/* */}
- {/*
*/}
From 21bee232084e4f3610643f1184034356538c02f7 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Tue, 12 May 2020 08:48:21 -0700 Subject: [PATCH 596/822] updated App.js with route to privacy-policy page --- src/App.js | 2 + src/components/layout/privacy-policy.js | 94 +++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/components/layout/privacy-policy.js diff --git a/src/App.js b/src/App.js index c6f204e..496c9c2 100644 --- a/src/App.js +++ b/src/App.js @@ -14,6 +14,7 @@ import DataUpload from "./components/auth/DataUpload"; import Watchlist from "./components/dashboard/Watchlist.js"; import Ratings from './components/dashboard/Ratings'; import Explore from "./components/dashboard/Explore.js"; +import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; @@ -118,6 +119,7 @@ function App() { path="/test" component={Test} /> + diff --git a/src/components/layout/privacy-policy.js b/src/components/layout/privacy-policy.js new file mode 100644 index 0000000..266bf5d --- /dev/null +++ b/src/components/layout/privacy-policy.js @@ -0,0 +1,94 @@ +import React from "react"; + +import widthFinder from "../../utils/widthFinder.js"; +import { makeStyles } from "@material-ui/core/styles"; + +function PrivacyPolicy() { + + return( +
+

Groa Privacy Policy

+ +

This privacy policy has been compiled to better serve those who are concerned with how their 'Personally identifiable information' (PII) is being used online. PII, as used in US privacy law and information security, is information that can be used on its own or with other information to identify, contact, or locate a single person, or to identify an individual in context. Please read our privacy policy carefully to get a clear understanding of how we collect, use, protect or otherwise handle your Personally Identifiable Information in accordance with our website. +

+

What personal information do we collect from the people that visit our blog, website or app? +

+

When ordering or registering on our site, as appropriate, you may be asked to enter your name, email address, Preferences or other details to help you with your experience. +

+

When do we collect information? +

+

We collect information from you when you register on our site, subscribe to a newsletter, fill out a form or enter information on our site. +

+

How do we use your information?

+

We may use the information we collect from you when you register, make a purchase, sign up for our newsletter, respond to a survey or marketing communication, surf the website, or use certain other site features in the following ways: + To personalize user's experience and to allow us to deliver the type of content and product offerings in which you are most interested + To ask for ratings and reviews of services or products + To follow up with them after correspondence (live chat, email or phone inquiries) +

+

How do we protect visitor information? +

+

We do not use vulnerability scanning and/or scanning to PCI standards. + We use regular Malware Scanning. + Your personal information is contained behind secured networks and is only accessible by a limited number of persons who have special access rights to such systems, and are required to keep the information confidential. In addition, all sensitive/credit information you supply is encrypted via Secure Socket Layer (SSL) technology. + We implement a variety of security measures when a user enters, submits, or accesses their information to maintain the safety of your personal information. + All transactions are processed through a gateway provider and are not stored or processed on our servers. +

+

Do we use 'cookies'? +

+

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow) that enables the site's or service provider's systems to recognize your browser and capture and remember certain information. For instance, we use cookies to help us remember and process the items in your shopping cart. They are also used to help us understand your preferences based on previous or current site activity, which enables us to provide you with improved services. We also use cookies to help us compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. + We use cookies to: + Understand and save user's preferences for future visits + Compile aggregate data about site traffic and site interactions in order to offer better site experiences and tools in the future. We may also use trusted third-party services that track this information on our behalf. + You can choose to have your computer warn you each time a cookie is being sent, or you can choose to turn off all cookies. You do this through your browser (like Internet Explorer) settings. Each browser is a little different, so look at your browser's Help menu to learn the correct way to modify your cookies. + If you disable cookies off, some features will be disabled It won't affect the user's experience that make your site experience more efficient and some of our services will not function properly. +

+

Third-party disclosure

+

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information unless we provide users with advance notice. This does not include website hosting partners and other parties who assist us in operating our website, conducting our business, or serving our users, so long as those parties agree to keep this information confidential. We may also release information when it's release is appropriate to comply with the law, enforce our site policies, or protect ours or others' rights, property or safety. + However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses. +

+

Third-party links

+

Occasionally, at our discretion, we may include or offer third-party products or services on our website. These third-party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites. +

+

Google

+

Google's advertising requirements can be summed up by Google's Advertising Principles. They are put in place to provide a positive experience for users. https://support.google.com/adwordspolicy/answer/1316548?hl=en + We have not enabled Google AdSense on our site but we may do so in the future. +

+

California Online Privacy Protection Act

+

CalOPPA is the first state law in the nation to require commercial websites and online services to post a privacy policy. The law's reach stretches well beyond California to require a person or company in the United States (and conceivably the world) that operates websites collecting personally identifiable information from California consumers to post a conspicuous privacy policy on its website stating exactly the information being collected and those individuals with whom it is being shared, and to comply with this policy. - See more at: http://consumercal.org/california-online-privacy-protection-act-caloppa/#sthash.0FdRbT51.dpuf + According to CalOPPA we agree to the following: + Users can visit our site anonymously. + Once this privacy policy is created, we will add a link to it on our home page or as a minimum on the first significant page after entering our website. + Our Privacy Policy link includes the word 'Privacy' and can be easily be found on the page specified above. + Users will be notified of any privacy policy changes: + On our Privacy Policy Page + Users are able to change their personal information: + By logging in to their account + How does our site handle do not track signals? + We honor do not track signals and do not track, plant cookies, or use advertising when a Do Not Track (DNT) browser mechanism is in place. + Does our site allow third-party behavioral tracking? + It's also important to note that we do not allow third-party behavioral tracking +

+

COPPA (Children Online Privacy Protection Act)

+

When it comes to the collection of personal information from children under 13, the Children's Online Privacy Protection Act (COPPA) puts parents in control. The Federal Trade Commission, the nation's consumer protection agency, enforces the COPPA Rule, which spells out what operators of websites and online services must do to protect children's privacy and safety online. + We do not specifically market to children under 13. +

+

Fair Information Practices

+

The Fair Information Practices Principles form the backbone of privacy law in the United States and the concepts they include have played a significant role in the development of data protection laws around the globe. Understanding the Fair Information Practice Principles and how they should be implemented is critical to comply with the various privacy laws that protect personal information. + In order to be in line with Fair Information Practices we will take the following responsive action, should a data breach occur, We will notify the users via email within 14 business days + We also agree to the Individual Redress Principle, which requires that individuals have a right to pursue legally enforceable rights against data collectors and processors who fail to adhere to the law. This principle requires not only that individuals have enforceable rights against data users, but also that individuals have recourse to courts or government agencies to investigate and/or prosecute non-compliance by data processors. +

+

CAN SPAM Act

+

The CAN-SPAM Act is a law that sets the rules for commercial email, establishes requirements for commercial messages, gives recipients the right to have emails stopped from being sent to them, and spells out tough penalties for violations. + We collect your email address in order to: + To be in accordance with CANSPAM we agree to the following: + If at any time you would like to unsubscribe from receiving future emails, you can email us at contact@groa.us and we will promptly remove you from ALL correspondence. + Contacting Us + If there are any questions regarding this privacy policy you may contact us at contact@groa.us. +

+
+ ); + + +} + +export default PrivacyPolicy; \ No newline at end of file From a6ebccb26d5ea29331dbf29653392c797d29e201 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Tue, 12 May 2020 09:21:06 -0700 Subject: [PATCH 597/822] privacy-policy initial formatting --- src/components/layout/privacy-policy.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/layout/privacy-policy.js b/src/components/layout/privacy-policy.js index 266bf5d..510eefc 100644 --- a/src/components/layout/privacy-policy.js +++ b/src/components/layout/privacy-policy.js @@ -2,11 +2,13 @@ import React from "react"; import widthFinder from "../../utils/widthFinder.js"; import { makeStyles } from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; function PrivacyPolicy() { return( -
+

Groa Privacy Policy

This privacy policy has been compiled to better serve those who are concerned with how their 'Personally identifiable information' (PII) is being used online. PII, as used in US privacy law and information security, is information that can be used on its own or with other information to identify, contact, or locate a single person, or to identify an individual in context. Please read our privacy policy carefully to get a clear understanding of how we collect, use, protect or otherwise handle your Personally Identifiable Information in accordance with our website. From 5e811dd798bb0b095f2167fae5be03e3676c2f42 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Tue, 12 May 2020 09:59:02 -0700 Subject: [PATCH 598/822] worked text of privacy policy --- src/components/layout/privacy-policy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/privacy-policy.js b/src/components/layout/privacy-policy.js index 510eefc..840071f 100644 --- a/src/components/layout/privacy-policy.js +++ b/src/components/layout/privacy-policy.js @@ -15,7 +15,7 @@ function PrivacyPolicy() {

What personal information do we collect from the people that visit our blog, website or app?

-

When ordering or registering on our site, as appropriate, you may be asked to enter your name, email address, Preferences or other details to help you with your experience. +

When using or registering on our site, as appropriate, you may be asked to enter your name, email address, Preferences or other details to help you with your experience.

When do we collect information?

From c11409233c6229bbbc284c98b8120a48e8a2d724 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Tue, 12 May 2020 11:16:32 -0700 Subject: [PATCH 599/822] added links to privacy policy in register and login pages --- src/components/auth/Login.js | 3 +++ src/components/auth/Register.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index c31f888..55e3520 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -27,6 +27,9 @@ function Copyright() { return ( {"© 2020 by GROÁ, All rights reserved"} + + GROÁ Privacy Policy + ); } diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 819f520..091cdaa 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -30,6 +30,9 @@ function Copyright() { {' '} 2020 {'.'} + + GROÁ Privacy Policy + ); } From 3b06ca8b839a28a693a0acb8a1e45169b7310680 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 12 May 2020 12:06:21 -0700 Subject: [PATCH 600/822] start work on rating new movies in onboarding --- src/components/auth/Onboarding.js | 158 +++++++++++++++-------------- src/components/movies/MovieCard.js | 11 +- 2 files changed, 88 insertions(+), 81 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 51c2863..dce0872 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -6,7 +6,8 @@ import { connect } from "react-redux"; import { getMoviesAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; - +// PostOnboarding +import PostOnboarding from './PostOnboarding'; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; @@ -27,6 +28,7 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; +import { SecureRoute } from '@okta/okta-react'; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -101,6 +103,7 @@ function Onboarding( const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); + // const [numRatings, setNumRatings] = useState(0); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -137,86 +140,89 @@ function Onboarding( // How many movies render const cardAmount = 25; // console.log("open alert is now ", openAlert); + console.log("ratings length " + ratings.length); + console.log("ratings " + ratings); if (isFetching) return ; - else - return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + // else if (ratings.length >= 6) return + else return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { return ( -
- -
+ film.primary_title === movie.primary_title && + film.start_year === movie.start_year ); - })} -
- {/* - Next - */} - - - You have successfully rated this movie! - - -
- ); -} + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ {/* + Next + */} + + + You have successfully rated this movie! + + +
+ ); + } const mapStateToProps = (state) => { + console.log("state rating movies " + state.rating.movies) return { userid: state.login.userid, isFetching: state.movie.isFetching, diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 5130a00..61cc82a 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -174,11 +174,11 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", justifyContent: "space-evenly", }, - videoWrapper:{ - position:'relative', - height:0, - paddingBottom:'56.25%', - }, + // videoWrapper:{ + // position:'relative', + // height:0, + // paddingBottom:'56.25%', + // }, [theme.breakpoints.down("xs")]: { movieImgModal: { width: "80%", @@ -386,6 +386,7 @@ function MovieCard({ height="315vh" margin-left= 'auto' margin-right= 'auto' + padding='2%' src={trailer} frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" From e9df18ff350e357e386ba444f9a85b55a689d670 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 12 May 2020 15:30:06 -0400 Subject: [PATCH 601/822] edit okta config to handle both login/registration --- package.json | 1 + src/App.js | 2 +- src/config/oktaConfig.js | 10 +++++----- src/store/actions/registerAction.js | 2 +- src/utils/axiosWithAuth.js | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ef466e5..f3eba60 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@testing-library/user-event": "^7.1.2", "acorn": "^7.1.1", "axios": "^0.19.2", + "dotenv": "^8.2.0", "node-sass": "^4.14.1", "puppeteer": "^2.1.1", "react": "^16.13.1", diff --git a/src/App.js b/src/App.js index c6f204e..8923dca 100644 --- a/src/App.js +++ b/src/App.js @@ -37,7 +37,7 @@ import { loadState, saveState } from "./store/localStorage.js"; import { createMuiTheme } from "@material-ui/core/styles"; import { ThemeProvider } from "@material-ui/core/styles"; - +// import dotenv from 'dotenv'; diff --git a/src/config/oktaConfig.js b/src/config/oktaConfig.js index 5ac305c..7485fe2 100644 --- a/src/config/oktaConfig.js +++ b/src/config/oktaConfig.js @@ -1,12 +1,12 @@ -const CLIENT_ID = process.env.CLIENT_ID; -const ISSUER = process.env.ISSUER; +const CLIENT_ID = process.env.REACT_APP_CLIENT_ID; +const ISSUER = process.env.REACT_APP_ISSUER; const OKTA_TESTING_DISABLEHTTPSCHECK = process.env.OKTA_TESTING_DISABLEHTTPSCHECK || false; export default { oidc: { - clientId: '0oaap4ry7yG1neZhz4x6', - issuer: 'https://dev-568768.okta.com/oauth2/default', - redirectUri: 'https://www.groa.us/implicit/callback', + clientId: CLIENT_ID, + issuer: ISSUER, + redirectUri: window.location.origin + '/implicit/callback', scopes: ['openid', 'profile', 'email'], pkce: true, disableHttpsCheck: OKTA_TESTING_DISABLEHTTPSCHECK, diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index 7510a19..e0a2e0c 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -17,7 +17,7 @@ export function registerAction(userCreds, history) { axiosWithAuth() .post("/login", user) .then(res => { - localStorage.setItem("token", res.data.token); + // localStorage.setItem("token", res.data.token); console.log("THIS IS WORKING BOIIIIII") dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index db558f7..b2d807c 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -12,7 +12,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "https://dev.groa.us/api/users" + baseURL: "http://localhost:8080/api/users" }) } From 8b7c7877d33c991edfab29e184f66604eaa315a7 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 12 May 2020 16:04:54 -0400 Subject: [PATCH 602/822] added dedicated login and register button in registration page --- src/App.js | 2 - src/components/auth/Register.js | 152 +++----------------------------- src/utils/axiosWithAuth.js | 8 +- 3 files changed, 13 insertions(+), 149 deletions(-) diff --git a/src/App.js b/src/App.js index 8923dca..11715c9 100644 --- a/src/App.js +++ b/src/App.js @@ -37,8 +37,6 @@ import { loadState, saveState } from "./store/localStorage.js"; import { createMuiTheme } from "@material-ui/core/styles"; import { ThemeProvider } from "@material-ui/core/styles"; -// import dotenv from 'dotenv'; - const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 819f520..9d78b4c 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -2,7 +2,7 @@ import React, { useState, useEffect} from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; -import { Link, useHistory } from "react-router-dom"; +import { Link, useHistory, Redirect } from "react-router-dom"; //For validation @@ -47,22 +47,18 @@ const useStyles = makeStyles((theme) => ({ }, })); -// Validation Schema -const RegisterSchema = Yup.object().shape({ - firstName: Yup.string().required("firstName is required"), - lastName: Yup.string().required("lastName is required"), - email: Yup.string().email().required("Email is required"), -}); - const Register = (props) => { const history = useHistory(); const { authState, authService } = useOktaAuth(); const login = async () => authService.login('/'); const logout = async () => authService.logout('/'); + const registerOkta = () => { + window.location.href = 'https://dev-568768.okta.com/signin/register'; + }; + //if user already Authenticated, loginAction redirects to to explore page - useEffect(() => { - console.log('))))))))))))))))))))))))))))))))))))))))))))))',authState.isAuthenticated) + useEffect(() => { authService.getUser() .then((info) => { props.loginAction(authState.accessToken, info.sub, history) @@ -71,34 +67,6 @@ const Register = (props) => { }, [authState]); - - const [users, setUsers] = useState({ - email: "", - firstName: "", - lastName: "", - }); - const { register, handleSubmit, errors } = useForm({ - validationSchema: RegisterSchema, - }); - const classes = useStyles(); - - const handleChange = (e) => { - setUsers({ - ...users, - [e.target.name]: e.target.value, - }); - }; - - const onSubmit = () => { - let user = { - firstName: users.firstName, - lastName:users.lastName, - email: users.email, - }; - console.log("user before register button", user); - props.registerAction(user, props.history); - }; - return (
{ {/* FORM STARTS */}
{/* */} -
- {/* */} - {/* */} - - {errors.email && errors.email.type === "required" && ( -

An email is required

- )} - {/*
*/} - {/* */} - - {errors.firstName && errors.firstName.type === "required" && ( -

First Name is required

- )} - - {errors.lastName && errors.lastName.type === "required" && ( -

Last Name is required

- )} - - {errors.email && errors.email.type === "required" && ( -

Email is required

- )} - {/*
*/} - {/* */} - {/* */} - {/* {errors.password && errors.password.type === "required" && ( -

Password required

*/} - {/* {errors.password && errors.password.type === "min" && ( -

Password must be at least 6 characters long

- )} */} - {/*
*/} - {/* */} - {/* */} - {/* {errors.confirmpassword && - errors.confirmpassword.type === "required" && ( -

Password Confirmation Required

- )} - {errors.confirmpassword && - errors.confirmpassword.type === "oneOf" && ( -

Password does not match

- )} */} - {/*
*/} - {/*
*/}
- + +

OR

@@ -235,22 +119,10 @@ const Register = (props) => {
-
- -

Login

-

Already have an account?

- -
- - {/* */} - {/* FORM ENDS */} +
-
{" "} - {/* PAGE CONTAINER */} +
+ diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index b2d807c..b41b8ab 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -1,20 +1,14 @@ import axios from 'axios'; -// import GetOktaToken from '../config/GetOktaToken'; - //baseURL needs to be properly implement once endpoints for login are available const axiosWithAuth = (accessToken) => { - // const [ accessToken ] = GetOktaToken(); - return axios.create({ headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "http://localhost:8080/api/users" + baseURL: "http://dev.groa.us/api/users" }) } - - export default axiosWithAuth; \ No newline at end of file From df77b7835aac94da40d415d3a8e5b8ea6c305588 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 12 May 2020 16:24:23 -0400 Subject: [PATCH 603/822] okta registration redirect changed to login implicit callback --- src/components/auth/Register.js | 9 ++------- src/store/actions/registerAction.js | 2 -- src/utils/axiosWithAuth.js | 2 -- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 9d78b4c..0ce4fd1 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -2,16 +2,11 @@ import React, { useState, useEffect} from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; -import { Link, useHistory, Redirect } from "react-router-dom"; +import { Link, useHistory} from "react-router-dom"; -//For validation -import { useForm } from "react-hook-form"; -import * as Yup from "yup"; - // styling imports import Picture3 from "../../img/couch-popcorn.png"; -import { TextField } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import Typography from '@material-ui/core/Typography'; import Box from '@material-ui/core/Box'; @@ -103,7 +98,7 @@ const Register = (props) => {
- +

OR

diff --git a/src/store/actions/registerAction.js b/src/store/actions/registerAction.js index e0a2e0c..e2a5bf7 100644 --- a/src/store/actions/registerAction.js +++ b/src/store/actions/registerAction.js @@ -17,8 +17,6 @@ export function registerAction(userCreds, history) { axiosWithAuth() .post("/login", user) .then(res => { - // localStorage.setItem("token", res.data.token); - console.log("THIS IS WORKING BOIIIIII") dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index b41b8ab..cab6d05 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -1,7 +1,5 @@ import axios from 'axios'; -//baseURL needs to be properly implement once endpoints for login are available - const axiosWithAuth = (accessToken) => { return axios.create({ From 41872c3e9537728fca62118b9dc140cede2bf252 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 12 May 2020 16:49:35 -0400 Subject: [PATCH 604/822] axiosWithAuth making https to groa be --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index cab6d05..3c4b71b 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "http://dev.groa.us/api/users" + baseURL: "https://dev.groa.us/api/users" }) } export default axiosWithAuth; \ No newline at end of file From 67cb3958c326bf423f921ece3d118461efd3d7b1 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 12 May 2020 15:08:05 -0700 Subject: [PATCH 605/822] onboarding flow functional, but does increments by 2 --- src/components/auth/Onboarding.js | 24 ++++++++++++++++-------- src/components/dashboard/Ratings.js | 3 ++- src/components/movies/MovieCard.js | 17 ++++++++++++++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index dce0872..5dfc46e 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react"; // import reactOnboardingPro from "react-onboarding-pro"; // import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; -import { getMoviesAction, setFilter } from "../../store/actions/index.js"; +import { getMoviesAction, getRatingAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; // PostOnboarding @@ -29,6 +29,8 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; import { SecureRoute } from '@okta/okta-react'; +import { Redirect } from 'react-router'; + const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -93,6 +95,7 @@ function Onboarding( searchTerm, setFilter, ratings, + getRatingAction, }, props ) { @@ -103,7 +106,7 @@ function Onboarding( const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - // const [numRatings, setNumRatings] = useState(0); + let [numRatings, setNumRatings] = useState({num:0}); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -123,7 +126,7 @@ function Onboarding( }; const handleClickStar = () => { setOpenAlert(true); - console.log("openalert"); + }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -136,14 +139,15 @@ function Onboarding( setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter]); + //get ratings + // getRatingAction(userid, accessToken); + }, [getMoviesAction, userid, ratings, setFilter, getRatingAction,]); // How many movies render const cardAmount = 25; + // console.log('state ', state ) // console.log("open alert is now ", openAlert); - console.log("ratings length " + ratings.length); - console.log("ratings " + ratings); if (isFetching) return ; - // else if (ratings.length >= 6) return + else if (numRatings.num >= 6) return else return (
); @@ -222,7 +228,7 @@ function Onboarding( } const mapStateToProps = (state) => { - console.log("state rating movies " + state.rating.movies) + // console.log(state.rating.movies.length) return { userid: state.login.userid, isFetching: state.movie.isFetching, @@ -231,9 +237,11 @@ const mapStateToProps = (state) => { searchTerm: state.filter.searchTerm, watchlist: state.watchlist.movies, ratings: state.rating.movies, + ratingsError: state.rating.error, }; }; export default connect(mapStateToProps, { getMoviesAction, setFilter, + getRatingAction })(Onboarding); diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 1a49ef4..6aff9f7 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -41,7 +41,8 @@ function Ratings({ getRatingAction(userid, accessToken); }, [getRatingAction, userid, setFilter]); console.log(`here + ${screenWidth}`); - console.log(classes); + // console.log(classes); + console.log("ratings length " + ratings.length); if (isFetching) return ; else diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 61cc82a..39f71f7 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -216,6 +216,8 @@ function MovieCard({ description, page, handleClickStar, + numRatings, + setNumRatings }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -271,10 +273,17 @@ function MovieCard({ }; const multiFunctions = () => { - handleClose(); - handleClickStar(); + // handleClose(); + // handleClickStar(); + onboaringRating(); }; + const onboaringRating = () => { + setNumRatings({...numRatings, num: numRatings.num + 1}); + console.log("number of ratings is " + numRatings.num); + console.log("openalert"); + } + return (
- - ) : ( + + + ) : ( "" )} - - {page === "Onboarding" ? ( + + {page === "Onboarding" ? ( = 6) return + // else if (newRatings >= 6) return onClick={multiFunctions} - /> - ) : ( + /> + ) : ( - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - /> - )} + className={classes.starsModal} + data-test="star" + precision={0.5} + size="large" + emptyIcon={ + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + /> + )}
{page !== "Onboarding" ? ( ) : ( - "" - )} + "" + )}
From 0debc633d0081f6e75e53e1cdf237fa6fc95d0a7 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 13 May 2020 13:50:33 -0700 Subject: [PATCH 611/822] move delete from watchlist button to moviecard --- src/components/dashboard/Watchlist.js | 15 ++++-------- src/components/movies/MovieCard.js | 33 ++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index e25dee9..306c08f 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -84,7 +84,7 @@ console.log('movies', movies) "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
setDeleteMode(!deleteMode)} + deleteMode={deleteMode} + setDeleteMode={setDeleteMode} + handleClick={handleClick} /> - {deleteMode && ( - - )} +
); })} diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index f45f881..c963514 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -126,7 +126,6 @@ const useStyles = makeStyles((theme) => ({ borderRadius: "11px", margin: "auto", paddingBottom: '1%', - width: "80%", // '&:hover':{ // opacity: 0.3, // } @@ -156,6 +155,11 @@ const useStyles = makeStyles((theme) => ({ padding: theme.spacing(0, 4, 3), color: "white", }, + DeleteMoviefromWatch: { + backgroundColor: 'white', + cursor: 'pointer', + + }, movieInfoModal: { display: "flex", }, @@ -226,7 +230,9 @@ function MovieCard({ page, handleClickStar, numRatings, - setNumRatings + setNumRatings, + deleteMode, + setDeleteMode }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -343,7 +349,7 @@ function MovieCard({

{/* < className={classes.bottomModal}> */} - {page !== "Onboarding" && "watchlist" ? ( + {page !== "Onboarding" && page !== "watchlist" ? ( + + )} + + + //
+ ) : ( + "" + )} + + {page === "Onboarding" ? ( Date: Wed, 13 May 2020 14:42:22 -0700 Subject: [PATCH 612/822] movie card design --- src/components/movies/MovieCard.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index c963514..54e3da0 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -111,6 +111,7 @@ const useStyles = makeStyles((theme) => ({ movieImg: { width: "100%", + height:'100%', opacity: 1, display: "block", backfaceVisibility: "hidden", @@ -158,7 +159,7 @@ const useStyles = makeStyles((theme) => ({ DeleteMoviefromWatch: { backgroundColor: 'white', cursor: 'pointer', - + }, movieInfoModal: { display: "flex", From 07eab4beaefd977a4299332457c481f20f4cc277 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 13 May 2020 14:53:42 -0700 Subject: [PATCH 613/822] streched button fixed on moviecards --- src/components/movies/MovieCard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 54e3da0..811da46 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -24,7 +24,7 @@ const styles = (theme) => ({ justifyContent: "space-between", }, closeButton: { - paddingLeft: "200px", + // paddingLeft: "200px", color: theme.palette.grey[500], }, }); From 3825fa247fd61cf227a2d93d03c6608788b6cdd8 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 13 May 2020 23:29:23 -0700 Subject: [PATCH 614/822] movie cards aligned in grid, all hold same height --- src/components/movies/MovieCard.js | 96 ++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 811da46..9193bae 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -50,7 +50,40 @@ const DialogTitle = withStyles(styles)((props) => { const useStyles = makeStyles((theme) => ({ nameModal: { fontSize: "25px", - paddingBottom: "2%", + // paddingBottom: "2%", + + }, + modalBtn: { + // backgroundColor: 'green', + height: '100%', + // paddingBottom: '2%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'column', + + + }, + cardContent: { + // paddingBottom: 0, + // display:'flex', + // justifyContent:'center', + // alignItems:'baseline' + // height: '90%', + // display: 'flex', + justifyContent: 'center', + // alignItems: 'center', + flexDirection: 'column', + }, + name: { + fontSize: "15px", + textAlign: 'center', + padding: '5%', + // display:'flex', + // justifyContent:'center', + // alignItems:'baseline' + // verticalAlign: 'middle', + }, year: { fontSize: "18px", @@ -67,19 +100,20 @@ const useStyles = makeStyles((theme) => ({ padding: theme.spacing(2), }, cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(8), + paddingTop: theme.spacing(2), + paddingBottom: theme.spacing(2), display: "flex", flexDirection: "row", }, card: { - height: "100%", + // height: "90%", display: "flex", flexDirection: "column", width: "100%", "&:hover": { - background: "black", + // background: "black", opacity: "0.3", + // border:'2px solid red', }, moreInfo: { display: "flex", @@ -87,9 +121,7 @@ const useStyles = makeStyles((theme) => ({ }, }, - cardContent: { - padding: 0, - }, + cardActions: { fontSize: "10px", padding: 0, @@ -111,11 +143,12 @@ const useStyles = makeStyles((theme) => ({ movieImg: { width: "100%", - height:'100%', + height: '80%', opacity: 1, display: "block", backfaceVisibility: "hidden", borderRadius: "11px", + objectFit: 'cover', // '&:hover':{ // opacity: 0.3, // } @@ -302,16 +335,19 @@ function MovieCard({ return (
- + {/* +
*/} +

{name}

+ {/*
*/} + {/*
*/} +
setDeleteMode(!deleteMode)}> - + {page === "watchlist" ? ( + //
setDeleteMode(!deleteMode)}> + setDeleteMode(!deleteMode)} > - {deleteMode && ( - - - )} - - //
+ )} + + + //
) : ( - "" - )} + "" + )} + - {page === "Onboarding" ? ( Date: Thu, 14 May 2020 10:42:22 -0400 Subject: [PATCH 615/822] Formatting Contributors --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index 35983d6..d3e6b7c 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,7 @@ more info on using badges [here](https://github.com/badges/shields) | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | | [](https://github.com/msinnema33) | [](https://github.com/jvillalp) | [](https://github.com/Steven-Matos) | [](https://github.com/azatecas) | | [ ](https://github.com/msinnema33) | [ ](https://github.com/jvillalp) | [ ](https://github.com/Steven-Matos) | [ ](https://github.com/azatecas) | -| [ ](https://www.linkedin.com/in/michael-sinnema-37ba733) | [ ](https://www.linkedin.com/in/juanavillalpando) | [ ](https://www.linkedin.com/in/steven-matosFED) | [ ](https://www.linkedin.com/in/luis-pepen-17bb3b196) | -| [Mary Streletska](https://www.linkedin.com/in/mstreletska/) | -| [](https://www.linkedin.com/in/mstreletska/) | - -|[ ](https://www.linkedin.com/in/mstreletska/) - +| [ ](https://www.linkedin.com/in/michael-sinnema-37ba733) | [ ](https://www.linkedin.com/in/juanavillalpando) | [ ](https://www.linkedin.com/in/steven-matosFED) | [ ](https://www.linkedin.com/in/luis-pepen-17bb3b196) | ## Project Overview [Trello Board](https://trello.com/b/ce1lYRW9/gr%C3%B3a) From 7a7a70997b91c1b5ff2696b7e5f65ee4873dbfab Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Thu, 14 May 2020 10:43:53 -0400 Subject: [PATCH 616/822] Updating the link formatting in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3e6b7c..f76e23c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Gróa -You can find the deployed project at [https://www.groa.us/](https://www.groa.us/). +[You can check out the live demo of Gróa here](http://www.groa.us/). ## Code Climate From 334ac2f0f11fa509b3466b26700b9cfeb5b93fb9 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Thu, 14 May 2020 10:44:34 -0400 Subject: [PATCH 617/822] Updating README Adding the banner image and removing the title text --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f76e23c..1392592 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Gróa + [You can check out the live demo of Gróa here](http://www.groa.us/). From 880c4dd4d8d895b8d31d8356eec86411b6797694 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 09:09:45 -0700 Subject: [PATCH 618/822] added .codeclimate.yml file --- .codeclimate.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..c07fd6e --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,22 @@ +# .codeclimate.yml +version: "2" +checks: + # Disable checks for similar code. + # Because this creates too many false positives. + similar-code: + enabled: false + # Increase the number of lines allowed for a method. + # Because this is more reasonable for JavaScript. + method-lines: + config: + threshold: 50 +exclude_patterns: + - "tests/" + - "spec/" + - "**/*.spec.js" + - "**/*.spec.jsx" + - "**/*.spec.ts" + - "**/*.spec.tsx" + - "**/vendor/" + - "**/node_modules/" + -"**/docs/*" \ No newline at end of file From 00eb481aa7ac821bc1811d9681ee7edc9e4ea2bb Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 14 May 2020 12:39:50 -0400 Subject: [PATCH 619/822] Facebook login button functional --- src/components/auth/Onboarding.js | 14 ++++------ src/components/auth/Register.js | 45 ++++++------------------------ src/components/movies/MovieCard.js | 10 ++----- src/store/actions/loginAction.js | 2 +- src/utils/axiosWithAuth.js | 2 +- 5 files changed, 19 insertions(+), 54 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 9f3ca47..e491f3d 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -106,7 +106,7 @@ function Onboarding( const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState({num:0}); + let [numRatings, setNumRatings] = useState(0); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -125,8 +125,7 @@ function Onboarding( sendChange(e.target.value.trim()); }; const handleClickStar = () => { - setOpenAlert(true); - + setOpenAlert(true); }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -140,14 +139,13 @@ function Onboarding( // Returns the movies getMoviesAction(userid, accessToken); //get ratings - // getRatingAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter,]); + + }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render const cardAmount = 25; - // console.log('state ', state ) - // console.log("open alert is now ", openAlert); + if (isFetching) return ; - else if (numRatings.num >= 13) return + else if (numRatings >= 6) return else return (
{ window.location.href = 'https://dev-568768.okta.com/signin/register'; }; + const facebookLogin = () => { + window.location.href = process.env.REACT_APP_FACEBOOK; + } + //if user already Authenticated, loginAction redirects to to explore page useEffect(() => { authService.getUser() @@ -64,32 +68,6 @@ const Register = (props) => { .catch(err => console.log("Error fetching User info in UseEffect", err)) }, [authState]); - // const [users, setUsers] = useState({ - // email: "", - // firstName: "", - // lastName: "", - // }); - // const { register, handleSubmit, errors } = useForm({ - // validationSchema: RegisterSchema, - // }); - // const classes = useStyles(); - - // const handleChange = (e) => { - // setUsers({ - // ...users, - // [e.target.name]: e.target.value, - // }); - // }; - - // const onSubmit = () => { - // let user = { - // firstName: users.firstName, - // lastName:users.lastName, - // email: users.email, - // }; - // console.log("user before register button", user); - // props.registerAction(user, props.history); - // }; return (
{
- - +

OR

-
-
- Google Icon -
-

Sign up with Google

-
-
-
+
+
Facebook Icon
-

Sign up with Facebook

+

Login with Facebook

diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 3f06139..7385970 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -277,14 +277,9 @@ function MovieCard({ const multiFunctions = () => { handleClose(); handleClickStar(); - onboardingRating(); + // onboardingRating(); }; - const onboardingRating = () => { - setNumRatings({...numRatings, num: numRatings.num + 1}); - console.log("number of ratings is " + numRatings.num); - console.log("openalert"); - } return (
@@ -364,7 +359,7 @@ function MovieCard({ emptyIcon={ } name={name} @@ -389,6 +384,7 @@ function MovieCard({ name={name} value={rated ? rated : rating} onChange={handleChange} + // onClick={onboardingRating} /> )}
diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index a5594a4..d8fa19f 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -11,7 +11,7 @@ export function loginAction(token, okta_id, history) { axiosWithAuth(token) .post("/login", {id:okta_id}) .then(res => { - console.log("loginAction res",res) + console.log("loginAction res {{{{{{{{{{{{{{{{{{{{{{{{{{",res) dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c4b71b..5013c91 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "https://dev.groa.us/api/users" + baseURL: "http://localhost:8080/api/users" }) } export default axiosWithAuth; \ No newline at end of file From 57518719f31275a9b9028f436ee97c672046151c Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 14 May 2020 12:56:11 -0400 Subject: [PATCH 620/822] removed /test component --- src/App.js | 5 ----- src/components/auth/Register.js | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 0f98078..568ef84 100644 --- a/src/App.js +++ b/src/App.js @@ -133,11 +133,6 @@ function App() { path='/:user_id/onboarding2' component={Onboarding2} /> - { useEffect(() => { authService.getUser() .then((info) => { - props.loginAction(authState.accessToken, info.sub, history) + props.loginAction(authState.accessToken, info.sub, history); + console.log("checking authentication") }) .catch(err => console.log("Error fetching User info in UseEffect", err)) }, [authState]); From 49bb6a486a43f40ec9e5261bc8c53e0f8999f62b Mon Sep 17 00:00:00 2001 From: Juana Villalpando <58449809+jvillalp@users.noreply.github.com> Date: Thu, 14 May 2020 10:01:34 -0700 Subject: [PATCH 621/822] Update Onboarding.js --- src/components/auth/Onboarding.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index e491f3d..06aaf45 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -106,7 +106,7 @@ function Onboarding( const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState(0); + let [numRatings, setNumRatings] = useState({num:0}); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -125,7 +125,8 @@ function Onboarding( sendChange(e.target.value.trim()); }; const handleClickStar = () => { - setOpenAlert(true); + setOpenAlert(true); + }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -139,13 +140,14 @@ function Onboarding( // Returns the movies getMoviesAction(userid, accessToken); //get ratings - - }, [getMoviesAction, userid, ratings, setFilter]); + // getRatingAction(userid, accessToken); + }, [getMoviesAction, userid, ratings, setFilter,]); // How many movies render const cardAmount = 25; - + // console.log('state ', state ) + // console.log("open alert is now ", openAlert); if (isFetching) return ; - else if (numRatings >= 6) return + else if (numRatings.num >= 13) return else return (
Date: Thu, 14 May 2020 10:04:58 -0700 Subject: [PATCH 622/822] Update MovieCard.js --- src/components/movies/MovieCard.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 7385970..0fc6ae3 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -277,9 +277,14 @@ function MovieCard({ const multiFunctions = () => { handleClose(); handleClickStar(); - // onboardingRating(); + onboardingRating(); }; +const onboardingRating = () => { + setNumRatings({ ...numRatings, num: numRatings.num + 1 }); + console.log("number of ratings is " + numRatings.num); + console.log("openalert"); + }; return (
@@ -384,7 +389,7 @@ function MovieCard({ name={name} value={rated ? rated : rating} onChange={handleChange} - // onClick={onboardingRating} + onClick={handleClose} /> )}
From 0bd0e4951f2d1263a8fe6d19823f6c31ea385244 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 14 May 2020 13:05:28 -0400 Subject: [PATCH 623/822] edit axios baseURL, removed numRatings settings --- src/components/auth/Onboarding.js | 4 ++-- src/components/movies/MovieCard.js | 9 +++++++-- src/store/actions/loginAction.js | 1 - src/utils/axiosWithAuth.js | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index e491f3d..6ac428d 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -106,7 +106,7 @@ function Onboarding( const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState(0); + let [numRatings, setNumRatings] = useState({num:0}); const screenWidth = widthFinder(window.innerWidth); //for search bar const handleSubmit = (e) => { @@ -145,7 +145,7 @@ function Onboarding( const cardAmount = 25; if (isFetching) return ; - else if (numRatings >= 6) return + else if (numRatings.num >= 13) return else return (
{ handleClose(); handleClickStar(); - // onboardingRating(); + onboardingRating(); }; + const onboardingRating = () => { + setNumRatings({...numRatings, num: numRatings.num + 1}); + console.log("number of ratings is " + numRatings.num); + console.log("openalert"); + } return (
@@ -359,7 +364,7 @@ function MovieCard({ emptyIcon={ } name={name} diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index d8fa19f..dfc3394 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -11,7 +11,6 @@ export function loginAction(token, okta_id, history) { axiosWithAuth(token) .post("/login", {id:okta_id}) .then(res => { - console.log("loginAction res {{{{{{{{{{{{{{{{{{{{{{{{{{",res) dispatch({ type: FETCHING_USER_LOGIN_SUCCESS, payload: res.data.user_id }); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 5013c91..3c4b71b 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "http://localhost:8080/api/users" + baseURL: "https://dev.groa.us/api/users" }) } export default axiosWithAuth; \ No newline at end of file From 4ec35ace852b5e71fbc6e143673ece55f126ff3f Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 14 May 2020 13:07:42 -0400 Subject: [PATCH 624/822] user able to login with facebook --- src/components/dashboard/Explore.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 717780f..0497900 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -42,7 +42,6 @@ function Explore({ const { authState, authService } = useOktaAuth(); const {accessToken} = authState; - // console.log("|||||||||||||||||||||||",accessToken); useEffect(() => { setFilter(""); // Returns the movies From bc4c61bb7520428c3d0d6449d319d9a782953eff Mon Sep 17 00:00:00 2001 From: Luis PM Date: Thu, 14 May 2020 15:11:20 -0400 Subject: [PATCH 625/822] add different link --- src/components/auth/Register.js | 8 ++------ src/config/oktaConfig.js | 4 ++-- src/utils/axiosWithAuth.js | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 87dc890..8d2b153 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -51,12 +51,8 @@ const Register = (props) => { const login = async () => authService.login('/'); const logout = async () => authService.logout('/'); - const registerOkta = () => { - window.location.href = 'https://dev-568768.okta.com/signin/register'; - }; - const facebookLogin = () => { - window.location.href = process.env.REACT_APP_FACEBOOK; + window.location.href = `https://dev-568768.okta.com/oauth2/v1/authorize?idp=0oabxx6bmXwAawmlZ4x6&client_id=${process.env.REACT_APP_CLIENT_ID}&response_type=id_token&response_mode=fragment&scope=openid%20email&redirect_uri=https%3A%2F%2Fgroa.us%2F&state=1234&nonce=groa1234` } //if user already Authenticated, loginAction redirects to to explore page @@ -107,7 +103,7 @@ const Register = (props) => {

OR

-
+
Facebook Icon
diff --git a/src/config/oktaConfig.js b/src/config/oktaConfig.js index fcfbfaa..7485fe2 100644 --- a/src/config/oktaConfig.js +++ b/src/config/oktaConfig.js @@ -1,5 +1,5 @@ -const CLIENT_ID = "0oaap4ry7yG1neZhz4x6"; -const ISSUER = "https://dev-568768.okta.com/oauth2/default"; +const CLIENT_ID = process.env.REACT_APP_CLIENT_ID; +const ISSUER = process.env.REACT_APP_ISSUER; const OKTA_TESTING_DISABLEHTTPSCHECK = process.env.OKTA_TESTING_DISABLEHTTPSCHECK || false; export default { diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c4b71b..3c6b489 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "https://dev.groa.us/api/users" + baseURL: process.env.REACT_APP_BASEURL }) } export default axiosWithAuth; \ No newline at end of file From f236bf32e286038d90db51a3635434788e309977 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 12:27:01 -0700 Subject: [PATCH 626/822] updating login --- .vscode/settings.json | 1 + src/components/auth/Login.js | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2cd8968 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +123,125 \ No newline at end of file diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js index c31f888..b1363bc 100644 --- a/src/components/auth/Login.js +++ b/src/components/auth/Login.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect } from "react"; import { connect } from "react-redux"; import { loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; @@ -8,7 +8,6 @@ import { useOktaAuth } from '@okta/okta-react'; // styling imports import Picture1 from "../../img/watching-tv.png"; -import { TextField } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import Typography from "@material-ui/core/Typography"; import Box from "@material-ui/core/Box"; @@ -17,12 +16,8 @@ import Box from "@material-ui/core/Box"; import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; //For validation -import { useForm } from "react-hook-form"; import * as Yup from "yup"; -//link to register -import { Link } from "react-router-dom"; - function Copyright() { return ( From 8ad8a282a1a25b818e9c948cc5ca765fc120f8a8 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 12:34:14 -0700 Subject: [PATCH 627/822] delete login.js --- src/components/auth/Login.js | 244 ----------------------------------- 1 file changed, 244 deletions(-) delete mode 100644 src/components/auth/Login.js diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js deleted file mode 100644 index 1f977c8..0000000 --- a/src/components/auth/Login.js +++ /dev/null @@ -1,244 +0,0 @@ -import React, { useEffect } from "react"; -import { connect } from "react-redux"; -import { loginAction } from "../../store/actions"; -import { ifDev } from "../../utils/removeAttribute.js"; - -//OKTA -import { useOktaAuth } from '@okta/okta-react'; - -// styling imports -import Picture1 from "../../img/watching-tv.png"; -import { makeStyles } from "@material-ui/core/styles"; -import Typography from "@material-ui/core/Typography"; -import Box from "@material-ui/core/Box"; - -// Navbar Login -import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; - -//For validation -import * as Yup from "yup"; - -function Copyright() { - return ( - - {"© 2020 by GROÁ, All rights reserved"} - - GROÁ Privacy Policy - - - ); -} -const useStyles = makeStyles((theme) => ({ - root: { - margin: theme.spacing(1), - }, - textField: { - display: "flex", - // justifyContent: "center", - marginBottom: "2%", - width: "100%", - padding: "0", - // display:'flex', - // justifyContent:'center' - }, -})); - -const RegisterSchema = Yup.object().shape({ - user_name: Yup.string().required("Username is required"), - password: Yup.string().required("Password is required"), -}); - -const LoginPage = (props) => { - - //OKTA useOKTA AUTH - const { authState, authService } = useOktaAuth(); - - - - //Okta Login/Logout redirects - const login = async () => authService.login('/'); - const logout = async () => authService.logout('/'); - - useEffect(() => { - if (authState.isAuthenticated) { - authService.getUser() - .then((info) => { - props.loginAction(authState.accessToken, info.sub, props.history) - }) - .catch(err => console.log("Error fetching User info in UseEffect", err)) - } - }, []); - - - - - // const [user, setUser] = useState({ - // user_name: "", - // password: "", - // }); - // const { register, handleSubmit, errors } = useForm({ - // validationSchema: RegisterSchema, - // }); - // const classes = useStyles(); - - // const handleChange = (e) => { - // setUser({ - // ...user, - // [e.target.name]: e.target.value, - // }); - // console.log(user); - // }; - - // const onSubmit = () => { - // props.loginAction(user, props.history); - // }; - - return ( -
- {/* NAVIGATION */} -
- -
-
-
-
-

- Welcome
back. -

-
- {" "} - Groa makes it easy to find a film you’ll love.
What new - favorite will you discover today? -
-
-
- Graphic -
-
- {/* FORM START */} - {/*
-
- - {errors.user_name && errors.user_name.type === "required" && ( -

A username is required

- )} - - {errors.password && errors.password.type === "required" && ( -

A password is required

- )} - -
-
-
- - -

- OR -

-
-
- Google icon -
-

- Sign in with Google -

-
-
-
- Facebook Icon -
-

- Sign in with Facebook -

-
- {/* Sign in with Facebook -
-
- -
-

- - - Don't have an account? -
Sign up -
- -

- {/* Test - -
-

IIIIIIIIIIIIII

- {!authState.isAuthenticated &&

TEST PAGE/REDIRECT

} -
- - - -
- -
*/} - {/* FORM ENDS */} - -
-

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

- {/* {!authState.isAuthenticated &&

Please Login

} - {authState.isAuthenticated &&

You are Logged in

} */} - - {!authState.isAuthenticated ?

Please Login

:

You are Logged in Logout

} - - -
-
- {/* END OF MAIN CONTENT */} - - - -
- // END LOGIN PAGE - ); -}; - -const mapStateToProps = (state) => { - return { - userid: state.login.userid, - errorStatus: state.login.error, - }; -}; -export default connect(mapStateToProps, { loginAction })(LoginPage); From 0d3f745abfc2593d8c1bb79a1e81c936a05d7880 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 12:41:10 -0700 Subject: [PATCH 628/822] updated privacy policy --- src/components/auth/Register.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 8d2b153..5e428ea 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,8 +1,8 @@ -import React, { useState, useEffect} from "react"; +import React, { useEffect } from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; -import { Link, useHistory} from "react-router-dom"; +import { Link, useHistory } from "react-router-dom"; // styling imports @@ -25,7 +25,7 @@ function Copyright() { {' '} 2020 {'.'} - + GROƁ Privacy Policy
@@ -95,18 +95,15 @@ const Register = (props) => { {/* FORM STARTS */}
{/* */} -
- +

OR

-
- Facebook Icon -
+
+ Facebook Icon +

Login with Facebook

From 3f5fc30cf7e501c22e40b1338084e591d6790a4b Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 12:52:49 -0700 Subject: [PATCH 629/822] updated onboarding --- src/components/auth/Onboarding.js | 192 ++++++++---------- src/components/auth/Onboarding2.js | 133 ------------ .../layout/nav-layouts/RegisterNavLinks.js | 2 +- 3 files changed, 81 insertions(+), 246 deletions(-) delete mode 100644 src/components/auth/Onboarding2.js diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 06aaf45..24e16ce 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,26 +1,19 @@ import React, { useEffect, useState } from "react"; -// import Onboarding from '../lib'; -// import reactOnboardingPro from "react-onboarding-pro"; -// import "react-onboarding-pro/build/index.css"; + import { connect } from "react-redux"; -import { getMoviesAction, getRatingAction, setFilter } from "../../store/actions/index.js"; +import { + getMoviesAction, + getRatingAction, + setFilter, +} from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; -// PostOnboarding -import PostOnboarding from './PostOnboarding'; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; -//for Link -import { ifDev } from "../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; -//for search bar -import { useTheme } from "@material-ui/core/styles"; -import SearchIcon from "@material-ui/icons/Search"; -import InputBase from "@material-ui/core/InputBase"; //testing snackbar import Snackbar from "@material-ui/core/Snackbar"; @@ -28,9 +21,7 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; -import { SecureRoute } from '@okta/okta-react'; -import { Redirect } from 'react-router'; - +import { Redirect } from "react-router"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -49,7 +40,6 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "center", color: "#505050", "&:hover": { - // backgroundColor: '#5c5b5b', color: "#D8D8D8", }, }, @@ -69,7 +59,6 @@ const useStyles = makeStyles((theme) => ({ searchContainer: { width: "40%", margin: "auto", - // backgroundColor: '#505050', paddingTop: "4%", }, [theme.breakpoints.down("xs")]: { @@ -83,7 +72,7 @@ const useStyles = makeStyles((theme) => ({ })); function Alert(props) { - return ; + return ; } function Onboarding( @@ -95,23 +84,18 @@ function Onboarding( searchTerm, setFilter, ratings, - getRatingAction, }, props ) { - // console.log("movies", movies); const classes = useStyles(); //for okta - const { authState, authService } = useOktaAuth(); + const { authState } = useOktaAuth(); const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState({num:0}); + let [numRatings, setNumRatings] = useState({ num: 0 }); const screenWidth = widthFinder(window.innerWidth); - //for search bar - const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); - }; + const [query, setQuery] = useState({ query: "", }); @@ -120,13 +104,8 @@ function Onboarding( props.setFilter(query); }; - const handleChange = (e) => { - setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; const handleClickStar = () => { setOpenAlert(true); - }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -141,94 +120,84 @@ function Onboarding( getMoviesAction(userid, accessToken); //get ratings // getRatingAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter,]); + }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render const cardAmount = 25; - // console.log('state ', state ) - // console.log("open alert is now ", openAlert); if (isFetching) return ; - else if (numRatings.num >= 13) return - else return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { + else if (numRatings.num >= 13) return ; + else + return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- + -
- ); - })} -
- {/* - Next - */} - - - You have successfully rated this movie! - - -
- ); - } + ? unsplashUrl + : moviePoster + } + handleClickStar={handleClickStar} + numRatings={numRatings} + setNumRatings={setNumRatings} + /> +
+ ); + })} + + + + You have successfully rated this movie! + + +
+ ); +} const mapStateToProps = (state) => { - // console.log(state.rating.movies.length) return { userid: state.login.userid, isFetching: state.movie.isFetching, @@ -243,6 +212,5 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps, { getMoviesAction, setFilter, - getRatingAction + getRatingAction, })(Onboarding); - diff --git a/src/components/auth/Onboarding2.js b/src/components/auth/Onboarding2.js deleted file mode 100644 index edb25c1..0000000 --- a/src/components/auth/Onboarding2.js +++ /dev/null @@ -1,133 +0,0 @@ -import React, { useEffect } from "react"; -// import Onboarding from '../lib'; -// import reactOnboardingPro from "react-onboarding-pro"; -// import "react-onboarding-pro/build/index.css"; -import { connect } from "react-redux"; -import { - getMoviesAction, - setFilter, - recommendationAction, -} from "../../store/actions/index.js"; -// Screen width util -import widthFinder from "../../utils/widthFinder.js"; - -// children components -import MovieCard from "../movies/MovieCard.js"; -import LoadingScreen from "../layout/LoadingScreen.js"; -//for grid -import { GridList } from "@material-ui/core/"; -import { makeStyles } from "@material-ui/core/styles"; -//for Link -import { ifDev } from "../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; - -const useStyles = makeStyles((theme) => ({ - cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), - }, -})); -function Onboarding2( - { - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, - }, - props -) { - const classes = useStyles(); - const screenWidth = widthFinder(window.innerWidth); - - useEffect(() => { - setFilter(""); - // Returns the movies - getMoviesAction(userid); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; - - if (isFetching) return ; - else - return ( - - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} - {/*
diff --git a/src/Test.js b/src/Test.js deleted file mode 100644 index 1ea7982..0000000 --- a/src/Test.js +++ /dev/null @@ -1,32 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { useOktaAuth } from '@okta/okta-react'; -import AxiosWithAuth from './utils/axiosWithAuth'; - - -const Test = () => { - const { authState } = useOktaAuth(); - const { accessToken } = authState; - const [testing, setTesting] = useState(null); - -// fetch messages - useEffect(() => { - if (authState.isAuthenticated) { - AxiosWithAuth(accessToken) - .get(`http://localhost:8080/`) - .then(res => { - console.log('SUCCESS TEST COMPONENT OOOOOOOOOOOOOOO', res) - setTesting(res.data) - }) - .catch(err => console.log('ERROR in TEST COMPONENT', err)) - - } - }, [testing]); - - - return ( -
- {testing === null ?

This Hasn't Fetched Anything

:

{testing}

} -
- ) -}; -export default Test; \ No newline at end of file diff --git a/src/components/auth/Login.test.js b/src/components/auth/Login.test.js deleted file mode 100644 index 05677cf..0000000 --- a/src/components/auth/Login.test.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from "react"; -import { BrowserRouter as Router } from "react-router-dom"; -import { render, fireEvent } from "@testing-library/react"; -import { getAllByText } from "@testing-library/dom"; -import { getAllByTestId, getByTestId } from "../../utils/test-utils"; - -// component to be tested. -import Login from "./Login"; - -// redux testing -import { Provider } from "react-redux"; -import configureStore from "redux-mock-store"; -const mockStore = configureStore([]); - -let store; -store = mockStore({ - login: { - userid: null - } -}); - -it("renders login component", () => { - const { container } = render( - - - - - - ); - const component = getAllByTestId(container, "login-component"); - expect(component.length).toBe(1); -}); - -describe("Button", () => { - it("should be defined", () => { - expect(Login).toBeDefined(); - }); -}); - -it("renders errors to login on Click if info not filled out", () => { - const { container } = render( - - - - - - ); - - let form = getAllByTestId(container, "loginForm"); - expect(form.length).toBe(1); - fireEvent.submit(getByTestId(container, "loginForm")); - - let component = getAllByText(container, "Username is required"); - expect(component.length).toBe(1); - - component = getAllByText(container, "Password is required"); - expect(component.length).toBe(1); -}); diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlatform.js similarity index 97% rename from src/components/auth/OnboardingPlateform.js rename to src/components/auth/OnboardingPlatform.js index 1fd7f3d..37add2a 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlatform.js @@ -67,7 +67,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -function OnboardingPlateform({ userid }) { +function OnboardingPlatform({ userid }) { const classes = useStyles(); return ( @@ -104,4 +104,4 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps, { setFilter, -})(OnboardingPlateform); +})(OnboardingPlatform); diff --git a/src/components/auth/PostLogin.js b/src/components/auth/PostLogin.js deleted file mode 100644 index 95a00ce..0000000 --- a/src/components/auth/PostLogin.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from "react"; -import { ifDev } from "../../utils/removeAttribute"; - -export default function PostLogin() { - return ( -
-
-

Groa grows with you.

-

- The more movies you rate. -
- The better your recommendations. -

-
-
-

Select how you would like to join:

-
-
-

- Upload ratings from -

-
- Letterboxd's logo. -

or

- IMDb's logo. -
-

- For users who already have an account on this popular film rating - site. -

- -
-
-

Recommendation setup wizard

-
- Placeholder from placeholder.com -
-

For users who want to use Groa without uploading data.

- -
-
-
-
- ); -} diff --git a/src/components/auth/PostLogin.test.js b/src/components/auth/PostLogin.test.js deleted file mode 100644 index feeec09..0000000 --- a/src/components/auth/PostLogin.test.js +++ /dev/null @@ -1,44 +0,0 @@ -import React from "react"; -import { render } from "@testing-library/react"; -import { Router, Route } from "react-router-dom"; -import { getAllByTestId } from "../../utils/test-utils.js"; -import { createMemoryHistory } from "history"; - -// component to be tested. -import PostLogin from "./PostLogin"; - -it("renders PostLogin component on the path '/setup-wizard'", () => { - let route = "/setup-wizard"; - const { container } = render( - - - - ); - - let component = getAllByTestId(container, "post-login-component"); - expect(component.length).toBe(1); -}); - -it("renders Upload from ratings header", () => { - let route = "/setup-wizard"; - const { container } = render( - - - - ); - - let component = getAllByTestId(container, "upload-ratings-header"); - expect(component.length).toBe(1); -}); - -it("renders button to upload ratings", () => { - let route = "/setup-wizard"; - const { container } = render( - - - - ); - - let component = getAllByTestId(container, "upload-ratings-button"); - expect(component.length).toBe(1); -}); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c6b489..0d767ff 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: process.env.REACT_APP_BASEURL - }) + baseURL: `https://www.dev.groa.us/api/users` + }) } export default axiosWithAuth; \ No newline at end of file From 0608c21281e7ca4bee642013a35f59e91881c0d8 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 14 May 2020 13:10:03 -0700 Subject: [PATCH 631/822] fix movie cards --- src/components/movies/MovieCard.js | 61 +++++++++++++++++------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 9193bae..321b12d 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -54,31 +54,43 @@ const useStyles = makeStyles((theme) => ({ }, modalBtn: { - // backgroundColor: 'green', - height: '100%', + border:'2px solid white', + height: '250px', // paddingBottom: '2%', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'column', - - + // display: 'flex', + // justifyContent: 'center', + // alignItems: 'center', + // flexDirection: 'column', }, cardContent: { // paddingBottom: 0, // display:'flex', // justifyContent:'center', // alignItems:'baseline' - // height: '90%', + height: '100%', // display: 'flex', - justifyContent: 'center', + // justifyContent: 'center', // alignItems: 'center', - flexDirection: 'column', + // flexDirection: 'column', + + }, + movieImg: { + width: "100%", + height: '200px', + opacity: 1, + // display: "block", + backfaceVisibility: "hidden", + borderRadius: "11px", + objectFit: 'contain', + + // '&:hover':{ + // opacity: 0.3, + // } }, name: { fontSize: "15px", textAlign: 'center', - padding: '5%', + paddingTop: '2%', // display:'flex', // justifyContent:'center', // alignItems:'baseline' @@ -113,7 +125,6 @@ const useStyles = makeStyles((theme) => ({ "&:hover": { // background: "black", opacity: "0.3", - // border:'2px solid red', }, moreInfo: { display: "flex", @@ -141,18 +152,7 @@ const useStyles = makeStyles((theme) => ({ }, }, - movieImg: { - width: "100%", - height: '80%', - opacity: 1, - display: "block", - backfaceVisibility: "hidden", - borderRadius: "11px", - objectFit: 'cover', - // '&:hover':{ - // opacity: 0.3, - // } - }, + movieImgModal: { opacity: 1, display: "block", @@ -226,6 +226,12 @@ const useStyles = makeStyles((theme) => ({ // paddingBottom:'56.25%', // }, [theme.breakpoints.down("xs")]: { + name:{ + padding:'0', + }, + // movieImg:{ + // height:'80%', + // }, movieImgModal: { width: "80%", }, @@ -342,8 +348,8 @@ function MovieCard({ src={image} alt="Random Movie poster as a placeholder." /> - {/* -
*/} + {/*
*/} + {/*
*/}

{name}

{/*
*/} {/*
*/} @@ -463,6 +469,7 @@ function MovieCard({ name={name} value={rated ? rated : rating} onChange={handleChange} + onClick={handleClose} /> )}
From 3d95b70a85dd4aeb7e5ea84bfee024ac345e23dc Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 13:20:49 -0700 Subject: [PATCH 632/822] updated SearchBar --- src/App.js | 1 - src/components/auth/Register.js | 1 - src/components/auth/SearchBar.js | 7 +------ 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/App.js b/src/App.js index 9895aa1..79f160a 100644 --- a/src/App.js +++ b/src/App.js @@ -11,7 +11,6 @@ import DataUpload from "./components/auth/DataUpload"; import Watchlist from "./components/dashboard/Watchlist.js"; import Ratings from './components/dashboard/Ratings'; import Explore from "./components/dashboard/Explore.js"; - import Onboarding from './components/auth/Onboarding'; import SearchBar from './components/auth/SearchBar'; import OnboardingPlatform from './components/auth/OnboardingPlatform'; diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 5e428ea..35ca724 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -65,7 +65,6 @@ const Register = (props) => { .catch(err => console.log("Error fetching User info in UseEffect", err)) }, [authState]); - return (
({ searchContainer: { width: "40%", margin: 'auto', - // backgroundColor: '#505050', paddingTop: '4%', }, [theme.breakpoints.down("xs")]: { @@ -46,7 +45,6 @@ const useStyles = makeStyles(theme => ({ justifyContent: "center", color: '#ffffff', "&:hover": { - // backgroundColor: '#5c5b5b', color: '#D8D8D8', }, }, @@ -66,10 +64,8 @@ const useStyles = makeStyles(theme => ({ }, })); - const Navigation = props => { //for user icon menu -// const [anchorEl, setAnchorEl] = React.useState(null); const classes = useStyles(); const [query, setQuery] = useState({ @@ -109,7 +105,6 @@ const Navigation = props => { />
- ); }; From 590087ffd3d4b0ebf95396cf96e630c32f94d018 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 13:23:31 -0700 Subject: [PATCH 633/822] deleted tester.js --- src/components/auth/Tester.js | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/components/auth/Tester.js diff --git a/src/components/auth/Tester.js b/src/components/auth/Tester.js deleted file mode 100644 index da804b1..0000000 --- a/src/components/auth/Tester.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -const Tester = props => { - return ( -
-

tester

-
) -}; -export default Tester \ No newline at end of file From d70f115dcef6e38facf00ce300ae096bc27ed494 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 13:29:18 -0700 Subject: [PATCH 634/822] updated explore.js --- src/components/dashboard/Explore.js | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 0497900..41b7cea 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -1,11 +1,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { - getMoviesAction, - setFilter, - recommendationAction, -} from "../../store/actions/index.js"; +import { getMoviesAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -24,31 +20,27 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - })); function Explore({ isFetching, movies, userid, - recommendationAction, getMoviesAction, searchTerm, setFilter, ratings, - handleClickStar, }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); - const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { authState } = useOktaAuth(); + const { accessToken } = authState; useEffect(() => { setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); // returns a list of recommendations to start the recommendations page - recommendationAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + }, [getMoviesAction, userid, ratings, setFilter]); // How many movies render const cardAmount = 25; @@ -58,8 +50,7 @@ function Explore({ + cellHeight='auto'> {movies .filter((movie) => !ratings.includes( @@ -108,7 +99,6 @@ function Explore({ ? unsplashUrl : moviePoster } - />
); @@ -130,6 +120,5 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps, { getMoviesAction, - recommendationAction, setFilter, })(Explore); From 0228d7a37d5ae0ff9e7ae71b0558e9d680a19a95 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 13:34:01 -0700 Subject: [PATCH 635/822] updated Navigation.js --- src/components/dashboard/Navigation.js | 329 ++++++++++++------------- 1 file changed, 162 insertions(+), 167 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index d37f93a..4dd8db8 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -3,86 +3,82 @@ import { connect } from "react-redux"; import { loginAction, setFilter, - recommendationAction + recommendationAction, } from "../../store/actions"; -// import debounce from "../../utils/debounce"; import GroaLogo from "../../img/groa-logo-nav.png"; -//for search bar +//for search bar import { makeStyles, useTheme } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; -//for the navbar -import clsx from 'clsx'; -import Drawer from '@material-ui/core/Drawer'; -import CssBaseline from '@material-ui/core/CssBaseline'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import List from '@material-ui/core/List'; -import Typography from '@material-ui/core/Typography'; -import Divider from '@material-ui/core/Divider'; -import IconButton from '@material-ui/core/IconButton'; -import MenuIcon from '@material-ui/icons/Menu'; -import ChevronLeftIcon from '@material-ui/icons/ChevronLeft'; -import ChevronRightIcon from '@material-ui/icons/ChevronRight'; -import ListItem from '@material-ui/core/ListItem'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import ClickAwayListener from '@material-ui/core/ClickAwayListener'; +//for the navbar +import clsx from "clsx"; +import Drawer from "@material-ui/core/Drawer"; +import CssBaseline from "@material-ui/core/CssBaseline"; +import AppBar from "@material-ui/core/AppBar"; +import Toolbar from "@material-ui/core/Toolbar"; +import List from "@material-ui/core/List"; +import Typography from "@material-ui/core/Typography"; +import Divider from "@material-ui/core/Divider"; +import IconButton from "@material-ui/core/IconButton"; +import MenuIcon from "@material-ui/icons/Menu"; +import ChevronLeftIcon from "@material-ui/icons/ChevronLeft"; +import ChevronRightIcon from "@material-ui/icons/ChevronRight"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemText from "@material-ui/core/ListItemText"; +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; //for user toggle menu -import Button from '@material-ui/core/Button'; -import Menu from '@material-ui/core/Menu'; -import MenuItem from '@material-ui/core/MenuItem'; +import Button from "@material-ui/core/Button"; +import Menu from "@material-ui/core/Menu"; +import MenuItem from "@material-ui/core/MenuItem"; //icons -import PersonRoundedIcon from '@material-ui/icons/PersonRounded'; -import PublishRoundedIcon from '@material-ui/icons/PublishRounded'; -import SearchRoundedIcon from '@material-ui/icons/SearchRounded'; -import ThumbUpRoundedIcon from '@material-ui/icons/ThumbUpRounded'; -import PlaylistAddCheckRoundedIcon from '@material-ui/icons/PlaylistAddCheckRounded'; -import GradeRoundedIcon from '@material-ui/icons/GradeRounded'; -import ExitToAppRoundedIcon from '@material-ui/icons/ExitToAppRounded'; +import PersonRoundedIcon from "@material-ui/icons/PersonRounded"; +import PublishRoundedIcon from "@material-ui/icons/PublishRounded"; +import SearchRoundedIcon from "@material-ui/icons/SearchRounded"; +import ThumbUpRoundedIcon from "@material-ui/icons/ThumbUpRounded"; +import PlaylistAddCheckRoundedIcon from "@material-ui/icons/PlaylistAddCheckRounded"; +import GradeRoundedIcon from "@material-ui/icons/GradeRounded"; +import ExitToAppRoundedIcon from "@material-ui/icons/ExitToAppRounded"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; - const drawerWidth = 240; - -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ searchContainer: { width: "40%", - margin: 'auto', - backgroundColor: '#505050', - + margin: "auto", + backgroundColor: "#505050", }, [theme.breakpoints.down("xs")]: { searchContainer: { width: "90%", }, userIcon: { - display: 'none', + display: "none", }, groaLogo: { - flex: 'display', - justifyContent: 'center', + flex: "display", + justifyContent: "center", }, }, search: { position: "relative", borderRadius: theme.shape.borderRadius, - backgroundColor: '#ffffff', + backgroundColor: "#ffffff", "&:hover": { - backgroundColor: '#5c5b5b', - color: '#ffffff', + backgroundColor: "#5c5b5b", + color: "#ffffff", }, width: "100%", [theme.breakpoints.down("sm")]: { - width: "auto" - } + width: "auto", + }, }, appBarTop: { - backgroundColor: '#5c5b5b' + backgroundColor: "#5c5b5b", }, searchIcon: { width: theme.spacing(7), @@ -92,16 +88,15 @@ const useStyles = makeStyles(theme => ({ display: "flex", alignItems: "center", justifyContent: "center", - color: '#505050', + color: "#505050", "&:hover": { - // backgroundColor: '#5c5b5b', - color: '#D8D8D8', + color: "#D8D8D8", }, }, inputRoot: { color: "#505050", "&:hover": { - color: '#ffffff', + color: "#ffffff", }, }, inputInput: { @@ -109,16 +104,16 @@ const useStyles = makeStyles(theme => ({ transition: theme.transitions.create("width"), width: "100%", [theme.breakpoints.up("md")]: { - width: 200 - } + width: 200, + }, }, //for nav bar root: { - display: 'flex', - flexDirection: 'column' + display: "flex", + flexDirection: "column", }, appBar: { - transition: theme.transitions.create(['margin', 'width'], { + transition: theme.transitions.create(["margin", "width"], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), @@ -126,16 +121,15 @@ const useStyles = makeStyles(theme => ({ appBarShift: { width: `calc(100% - ${drawerWidth}px)`, marginLeft: drawerWidth, - transition: theme.transitions.create(['margin', 'width'], { + transition: theme.transitions.create(["margin", "width"], { easing: theme.transitions.easing.easeOut, - // duration: theme.transitions.duration.enteringScreen, }), }, menuButton: { marginRight: theme.spacing(2), }, hide: { - display: 'none', + display: "none", }, drawer: { width: drawerWidth, @@ -145,87 +139,86 @@ const useStyles = makeStyles(theme => ({ width: drawerWidth, }, drawerHeader: { - display: 'flex', - alignItems: 'center', + display: "flex", + alignItems: "center", padding: theme.spacing(0, 1), // necessary for content to be below app bar ...theme.mixins.toolbar, - justifyContent: 'flex-end', + justifyContent: "flex-end", }, content: { flexGrow: 1, padding: theme.spacing(3), - transition: theme.transitions.create('margin', { + transition: theme.transitions.create("margin", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), marginLeft: -drawerWidth, }, contentShift: { - transition: theme.transitions.create('margin', { + transition: theme.transitions.create("margin", { easing: theme.transitions.easing.easeOut, duration: theme.transitions.duration.enteringScreen, }), marginLeft: 0, }, toolBar: { - backgroundColor: '#505050', - display: 'flex', - justifyContent: 'space-between' + backgroundColor: "#505050", + display: "flex", + justifyContent: "space-between", }, groaLogo: { - height: '2rem', - width: 'auto', + height: "2rem", + width: "auto", }, drawerContainer: { - display: 'flex', - flexDirection: 'column', + display: "flex", + flexDirection: "column", }, })); +const Navigation = (props) => { + //OKTA useOKTA AUTH + const { authState, authService } = useOktaAuth(); + const [userInfo, setUserInfo] = useState(null); -const Navigation = props => { - - //OKTA useOKTA AUTH - const { authState, authService } = useOktaAuth(); - const [userInfo, setUserInfo] = useState(null); - - const logout = async () => authService.logout('/'); + const logout = async () => authService.logout("/"); //for nav bar const theme = useTheme(); const [open, setOpen] = React.useState(false); // for side bar menu - const linkAttributes = [{ - id: 0, - name: "Upload", - icon: - }, - { - id: 1, - name: "Explore", - icon: - }, - { - id: 2, - name: "Recommendations", - icon: - }, - { - id: 3, - name: "Watchlist", - icon: - }, - { - id: 4, - name: "Ratings", - icon: - }, - { - id: 5, - name: 'LogOut', - icon: - }, + const linkAttributes = [ + { + id: 0, + name: "Upload", + icon: , + }, + { + id: 1, + name: "Explore", + icon: , + }, + { + id: 2, + name: "Recommendations", + icon: , + }, + { + id: 3, + name: "Watchlist", + icon: , + }, + { + id: 4, + name: "Ratings", + icon: , + }, + { + id: 5, + name: "LogOut", + icon: , + }, ]; const handleDrawerOpen = () => { @@ -248,36 +241,22 @@ const Navigation = props => { const classes = useStyles(); const [query, setQuery] = useState({ - query: "" + query: "", }); - const handleChange = e => { + const handleChange = (e) => { setQuery({ query: e.target.value }); sendChange(e.target.value.trim()); }; - const sendChange = query => { + const sendChange = (query) => { props.setFilter(query); }; - const handleSubmit = e => { + const handleSubmit = (e) => { if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); }; - // const clearInput = e => { - // setQuery({ query: "" }); - // props.setFilter(""); - // }; - - // const logout = () => { - // localStorage.removeItem("token"); - // localStorage.removeItem("state"); - // }; - - // const getNewRecommendations = id => { - // Gets new recommendations for account, if applicible - // props.recommendationAction(id); - // }; //for click away const handleClickAway = () => { setOpen(false); @@ -287,38 +266,57 @@ const Navigation = props => {
- + })}> + edge='start' + className={clsx(classes.menuButton, open && classes.hide)}> - - Groa Logo + + Groa Logo - - Ratings - Upload - Logout + onClose={handleClose}> + + Ratings + + + Upload + + + Logout +
@@ -327,13 +325,13 @@ const Navigation = props => {
{
+ mouseEvent='onMouseDown' + touchEvent='onTouchStart' + onClickAway={handleClickAway}> + }}>
- {theme.direction === 'ltr' ? : } + {theme.direction === "ltr" ? ( + + ) : ( + + )}
{linkAttributes.map((linkObject, index) => ( - + {linkObject.icon} ))} - {/* - {['All mail', 'Trash', 'Spam'].map((text, index) => ( - - {index % 2 === 0 ? : } - - - ))} - */}
+ })}>
@@ -392,14 +387,14 @@ const Navigation = props => { ); }; -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, - searchTerm: state.filter.searchTerm + searchTerm: state.filter.searchTerm, }; }; export default connect(mapStateToProps, { loginAction, recommendationAction, - setFilter + setFilter, })(Navigation); From ac0c862ed0356505fe5ca0e3aa6d9cf94039e6e4 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Thu, 14 May 2020 13:41:26 -0700 Subject: [PATCH 636/822] deleted loginNav and updated ratings/rec/watchlist from master --- src/components/dashboard/Ratings.js | 25 ++++++++----------- src/components/dashboard/Recommendations.js | 20 +++++++-------- src/components/dashboard/Watchlist.js | 13 ++++------ .../layout/nav-layouts/LoginNavLinks.js | 15 ----------- 4 files changed, 25 insertions(+), 48 deletions(-) delete mode 100644 src/components/layout/nav-layouts/LoginNavLinks.js diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 6aff9f7..210a178 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -8,7 +8,7 @@ import widthFinder from "../../utils/widthFinder.js"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid -import { makeStyles } from '@material-ui/core/styles'; +import { makeStyles } from "@material-ui/core/styles"; import { GridList } from "@material-ui/core/"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; @@ -19,7 +19,6 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - })); function Ratings({ userid, @@ -31,7 +30,7 @@ function Ratings({ }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; //for sizing of the movie cards const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -50,15 +49,14 @@ function Ratings({ + cellHeight='auto'> {ratings .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -78,18 +76,17 @@ function Ratings({ trailer={movie.trailer_url} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } />
); - } - )} + })} ); } diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index f3e255c..25ffb3c 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { useOktaAuth } from '@okta/okta-react'; +import { useOktaAuth } from "@okta/okta-react"; // tools import { connect } from "react-redux"; import { @@ -34,7 +34,6 @@ function Recommendations({ isUploaded, setFilter, }) { - const { authState } = useOktaAuth(); const { accessToken } = authState; @@ -56,15 +55,14 @@ function Recommendations({ + cellHeight='auto'> {recommendations .filter((movie) => searchTerm !== "" ? movie.title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -82,10 +80,10 @@ function Recommendations({ movie_id={movie.movie_id} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 4b2f559..a1f2e71 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -38,10 +38,9 @@ function Watchlist({ setFilter, movies, }) { - //OKTA AUTH const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui @@ -66,8 +65,7 @@ function Watchlist({ + cellHeight='auto'> {/*
*/} {watchlist .filter((movie) => @@ -91,7 +89,7 @@ function Watchlist({ year={movie.start_year} trailer={movie.trailer_url} description={movie.description} - page="Onboarding" + page='Onboarding' image={ !posterURI || posterURI === "None" || @@ -104,9 +102,8 @@ function Watchlist({ /> {deleteMode && ( )} diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js deleted file mode 100644 index a7911e8..0000000 --- a/src/components/layout/nav-layouts/LoginNavLinks.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import { ifDev } from "../../../utils/removeAttribute.js"; -// styling imports -import GroaLogo from "../../../img/groa-logo-nav.png"; - - -export default function LoginNavLinks() { - return ( -
- Groa Logo -

Sign In

-
- ); -} -// \ No newline at end of file From 06af52c37734bf5ac495e1f9c4ec4fe61deaf9ba Mon Sep 17 00:00:00 2001 From: Juana Villalpando <58449809+jvillalp@users.noreply.github.com> Date: Thu, 14 May 2020 14:40:52 -0700 Subject: [PATCH 637/822] Revert "deleted loginNav and updated ratings/rec/watchlist from master" --- src/components/dashboard/Ratings.js | 25 +++++++++++-------- src/components/dashboard/Recommendations.js | 20 ++++++++------- src/components/dashboard/Watchlist.js | 13 ++++++---- .../layout/nav-layouts/LoginNavLinks.js | 15 +++++++++++ 4 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 src/components/layout/nav-layouts/LoginNavLinks.js diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 210a178..6aff9f7 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -8,7 +8,7 @@ import widthFinder from "../../utils/widthFinder.js"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid -import { makeStyles } from "@material-ui/core/styles"; +import { makeStyles } from '@material-ui/core/styles'; import { GridList } from "@material-ui/core/"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; @@ -19,6 +19,7 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, + })); function Ratings({ userid, @@ -30,7 +31,7 @@ function Ratings({ }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); - const { accessToken } = authState; + const {accessToken} = authState; //for sizing of the movie cards const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -49,14 +50,15 @@ function Ratings({ + cellHeight="auto" + > {ratings .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -76,17 +78,18 @@ function Ratings({ trailer={movie.trailer_url} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } />
); - })} + } + )}
); } diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 25ffb3c..f3e255c 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { useOktaAuth } from "@okta/okta-react"; +import { useOktaAuth } from '@okta/okta-react'; // tools import { connect } from "react-redux"; import { @@ -34,6 +34,7 @@ function Recommendations({ isUploaded, setFilter, }) { + const { authState } = useOktaAuth(); const { accessToken } = authState; @@ -55,14 +56,15 @@ function Recommendations({ + cellHeight="auto" + > {recommendations .filter((movie) => searchTerm !== "" ? movie.title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -80,10 +82,10 @@ function Recommendations({ movie_id={movie.movie_id} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index a1f2e71..4b2f559 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -38,9 +38,10 @@ function Watchlist({ setFilter, movies, }) { + //OKTA AUTH const { authState, authService } = useOktaAuth(); - const { accessToken } = authState; + const {accessToken} = authState; const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui @@ -65,7 +66,8 @@ function Watchlist({ + cellHeight="auto" + > {/*
*/} {watchlist .filter((movie) => @@ -89,7 +91,7 @@ function Watchlist({ year={movie.start_year} trailer={movie.trailer_url} description={movie.description} - page='Onboarding' + page="Onboarding" image={ !posterURI || posterURI === "None" || @@ -102,8 +104,9 @@ function Watchlist({ /> {deleteMode && ( )} diff --git a/src/components/layout/nav-layouts/LoginNavLinks.js b/src/components/layout/nav-layouts/LoginNavLinks.js new file mode 100644 index 0000000..a7911e8 --- /dev/null +++ b/src/components/layout/nav-layouts/LoginNavLinks.js @@ -0,0 +1,15 @@ +import React from "react"; +import { ifDev } from "../../../utils/removeAttribute.js"; +// styling imports +import GroaLogo from "../../../img/groa-logo-nav.png"; + + +export default function LoginNavLinks() { + return ( +
+ Groa Logo +

Sign In

+
+ ); +} +// \ No newline at end of file From eb1c07152f10b400cfd78d6f346a346fa52f9d7a Mon Sep 17 00:00:00 2001 From: Juana Villalpando <58449809+jvillalp@users.noreply.github.com> Date: Thu, 14 May 2020 14:52:18 -0700 Subject: [PATCH 638/822] Update App.js --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 79f160a..546dd8b 100644 --- a/src/App.js +++ b/src/App.js @@ -130,7 +130,7 @@ function App() { - + From 06769d3925cf71ae83a08db4af78df818bc1c08b Mon Sep 17 00:00:00 2001 From: Juana Villalpando <58449809+jvillalp@users.noreply.github.com> Date: Thu, 14 May 2020 15:06:31 -0700 Subject: [PATCH 639/822] Revert "cleanup/Codecleanup" --- .codeclimate.yml | 22 -- .vscode/settings.json | 1 - src/App.js | 19 +- src/Test.js | 32 +++ src/components/auth/Login.js | 249 ++++++++++++++++++ src/components/auth/Login.test.js | 58 ++++ src/components/auth/Onboarding.js | 192 ++++++++------ src/components/auth/Onboarding2.js | 133 ++++++++++ ...dingPlatform.js => OnboardingPlateform.js} | 4 +- src/components/auth/PostLogin.js | 71 +++++ src/components/auth/PostLogin.test.js | 44 ++++ src/components/auth/Register.js | 17 +- .../layout/nav-layouts/RegisterNavLinks.js | 2 +- src/utils/axiosWithAuth.js | 4 +- 14 files changed, 730 insertions(+), 118 deletions(-) delete mode 100644 .codeclimate.yml delete mode 100644 .vscode/settings.json create mode 100644 src/Test.js create mode 100644 src/components/auth/Login.js create mode 100644 src/components/auth/Login.test.js create mode 100644 src/components/auth/Onboarding2.js rename src/components/auth/{OnboardingPlatform.js => OnboardingPlateform.js} (97%) create mode 100644 src/components/auth/PostLogin.js create mode 100644 src/components/auth/PostLogin.test.js diff --git a/.codeclimate.yml b/.codeclimate.yml deleted file mode 100644 index c07fd6e..0000000 --- a/.codeclimate.yml +++ /dev/null @@ -1,22 +0,0 @@ -# .codeclimate.yml -version: "2" -checks: - # Disable checks for similar code. - # Because this creates too many false positives. - similar-code: - enabled: false - # Increase the number of lines allowed for a method. - # Because this is more reasonable for JavaScript. - method-lines: - config: - threshold: 50 -exclude_patterns: - - "tests/" - - "spec/" - - "**/*.spec.js" - - "**/*.spec.jsx" - - "**/*.spec.ts" - - "**/*.spec.tsx" - - "**/vendor/" - - "**/node_modules/" - -"**/docs/*" \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2cd8968..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1 +0,0 @@ -123,125 \ No newline at end of file diff --git a/src/App.js b/src/App.js index 546dd8b..e5f555d 100644 --- a/src/App.js +++ b/src/App.js @@ -2,24 +2,29 @@ import React, { useEffect } from "react"; import { Route } from "react-router-dom"; import { Security, SecureRoute, LoginCallback } from '@okta/okta-react'; +import Test from './Test'; // local imports +import PrivateRoute from "./utils/privateRoute.js"; import Recommendations from "./components/dashboard/Recommendations.js"; import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; +import Login from "./components/auth/Login"; import DataUpload from "./components/auth/DataUpload"; import Watchlist from "./components/dashboard/Watchlist.js"; import Ratings from './components/dashboard/Ratings'; import Explore from "./components/dashboard/Explore.js"; import Onboarding from './components/auth/Onboarding'; +import Onboarding2 from './components/auth/Onboarding2'; import SearchBar from './components/auth/SearchBar'; -import OnboardingPlatform from './components/auth/OnboardingPlatform'; +import OnboardingPlateform from './components/auth/OnboardingPlateform'; import PostOnboarding from './components/auth/PostOnboarding'; import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; import oktaConfig from './config/oktaConfig'; +import { useOktaAuth } from '@okta/okta-react'; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -55,6 +60,7 @@ store.subscribe(() => { function App() { //used to create theme of app + useEffect(() => reactGAinitialization(), []); const theme = React.useMemo( () => @@ -110,16 +116,21 @@ function App() { exact path={[ '/:user_id/onboarding', + '/:user_id/onboarding2', ]} component={SearchBar} /> + + {/* this could be a modal */} + {/* */}
diff --git a/src/Test.js b/src/Test.js new file mode 100644 index 0000000..1ea7982 --- /dev/null +++ b/src/Test.js @@ -0,0 +1,32 @@ +import React, { useEffect, useState } from 'react'; +import { useOktaAuth } from '@okta/okta-react'; +import AxiosWithAuth from './utils/axiosWithAuth'; + + +const Test = () => { + const { authState } = useOktaAuth(); + const { accessToken } = authState; + const [testing, setTesting] = useState(null); + +// fetch messages + useEffect(() => { + if (authState.isAuthenticated) { + AxiosWithAuth(accessToken) + .get(`http://localhost:8080/`) + .then(res => { + console.log('SUCCESS TEST COMPONENT OOOOOOOOOOOOOOO', res) + setTesting(res.data) + }) + .catch(err => console.log('ERROR in TEST COMPONENT', err)) + + } + }, [testing]); + + + return ( +
+ {testing === null ?

This Hasn't Fetched Anything

:

{testing}

} +
+ ) +}; +export default Test; \ No newline at end of file diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js new file mode 100644 index 0000000..55e3520 --- /dev/null +++ b/src/components/auth/Login.js @@ -0,0 +1,249 @@ +import React, { useState, useEffect } from "react"; +import { connect } from "react-redux"; +import { loginAction } from "../../store/actions"; +import { ifDev } from "../../utils/removeAttribute.js"; + +//OKTA +import { useOktaAuth } from '@okta/okta-react'; + +// styling imports +import Picture1 from "../../img/watching-tv.png"; +import { TextField } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; + +// Navbar Login +import LoginNavLinks from "../layout/nav-layouts/LoginNavLinks.js"; + +//For validation +import { useForm } from "react-hook-form"; +import * as Yup from "yup"; + +//link to register +import { Link } from "react-router-dom"; + +function Copyright() { + return ( + + {"© 2020 by GROÁ, All rights reserved"} + + GROÁ Privacy Policy + + + ); +} +const useStyles = makeStyles((theme) => ({ + root: { + margin: theme.spacing(1), + }, + textField: { + display: "flex", + // justifyContent: "center", + marginBottom: "2%", + width: "100%", + padding: "0", + // display:'flex', + // justifyContent:'center' + }, +})); + +const RegisterSchema = Yup.object().shape({ + user_name: Yup.string().required("Username is required"), + password: Yup.string().required("Password is required"), +}); + +const LoginPage = (props) => { + + //OKTA useOKTA AUTH + const { authState, authService } = useOktaAuth(); + + + + //Okta Login/Logout redirects + const login = async () => authService.login('/'); + const logout = async () => authService.logout('/'); + + useEffect(() => { + if (authState.isAuthenticated) { + authService.getUser() + .then((info) => { + props.loginAction(authState.accessToken, info.sub, props.history) + }) + .catch(err => console.log("Error fetching User info in UseEffect", err)) + } + }, []); + + + + + // const [user, setUser] = useState({ + // user_name: "", + // password: "", + // }); + // const { register, handleSubmit, errors } = useForm({ + // validationSchema: RegisterSchema, + // }); + // const classes = useStyles(); + + // const handleChange = (e) => { + // setUser({ + // ...user, + // [e.target.name]: e.target.value, + // }); + // console.log(user); + // }; + + // const onSubmit = () => { + // props.loginAction(user, props.history); + // }; + + return ( +
+ {/* NAVIGATION */} +
+ +
+
+
+
+

+ Welcome
back. +

+
+ {" "} + Groa makes it easy to find a film you’ll love.
What new + favorite will you discover today? +
+
+
+ Graphic +
+
+ {/* FORM START */} + {/*
+
+ + {errors.user_name && errors.user_name.type === "required" && ( +

A username is required

+ )} + + {errors.password && errors.password.type === "required" && ( +

A password is required

+ )} + +
+
+
+ + +

+ OR +

+
+
+ Google icon +
+

+ Sign in with Google +

+
+
+
+ Facebook Icon +
+

+ Sign in with Facebook +

+
+ {/* Sign in with Facebook +
+
+ +
+

+ + + Don't have an account? +
Sign up +
+ +

+ {/* Test + +
+

IIIIIIIIIIIIII

+ {!authState.isAuthenticated &&

TEST PAGE/REDIRECT

} +
+ + + +
+ +
*/} + {/* FORM ENDS */} + +
+

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

+ {/* {!authState.isAuthenticated &&

Please Login

} + {authState.isAuthenticated &&

You are Logged in

} */} + + {!authState.isAuthenticated ?

Please Login

:

You are Logged in Logout

} + + +
+
+ {/* END OF MAIN CONTENT */} + + + +
+ // END LOGIN PAGE + ); +}; + +const mapStateToProps = (state) => { + return { + userid: state.login.userid, + errorStatus: state.login.error, + }; +}; +export default connect(mapStateToProps, { loginAction })(LoginPage); diff --git a/src/components/auth/Login.test.js b/src/components/auth/Login.test.js new file mode 100644 index 0000000..05677cf --- /dev/null +++ b/src/components/auth/Login.test.js @@ -0,0 +1,58 @@ +import React from "react"; +import { BrowserRouter as Router } from "react-router-dom"; +import { render, fireEvent } from "@testing-library/react"; +import { getAllByText } from "@testing-library/dom"; +import { getAllByTestId, getByTestId } from "../../utils/test-utils"; + +// component to be tested. +import Login from "./Login"; + +// redux testing +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; +const mockStore = configureStore([]); + +let store; +store = mockStore({ + login: { + userid: null + } +}); + +it("renders login component", () => { + const { container } = render( + + + + + + ); + const component = getAllByTestId(container, "login-component"); + expect(component.length).toBe(1); +}); + +describe("Button", () => { + it("should be defined", () => { + expect(Login).toBeDefined(); + }); +}); + +it("renders errors to login on Click if info not filled out", () => { + const { container } = render( + + + + + + ); + + let form = getAllByTestId(container, "loginForm"); + expect(form.length).toBe(1); + fireEvent.submit(getByTestId(container, "loginForm")); + + let component = getAllByText(container, "Username is required"); + expect(component.length).toBe(1); + + component = getAllByText(container, "Password is required"); + expect(component.length).toBe(1); +}); diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 24e16ce..06aaf45 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,19 +1,26 @@ import React, { useEffect, useState } from "react"; - +// import Onboarding from '../lib'; +// import reactOnboardingPro from "react-onboarding-pro"; +// import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; -import { - getMoviesAction, - getRatingAction, - setFilter, -} from "../../store/actions/index.js"; +import { getMoviesAction, getRatingAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; +// PostOnboarding +import PostOnboarding from './PostOnboarding'; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; +//for Link +import { ifDev } from "../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; +//for search bar +import { useTheme } from "@material-ui/core/styles"; +import SearchIcon from "@material-ui/icons/Search"; +import InputBase from "@material-ui/core/InputBase"; //testing snackbar import Snackbar from "@material-ui/core/Snackbar"; @@ -21,7 +28,9 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; -import { Redirect } from "react-router"; +import { SecureRoute } from '@okta/okta-react'; +import { Redirect } from 'react-router'; + const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -40,6 +49,7 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "center", color: "#505050", "&:hover": { + // backgroundColor: '#5c5b5b', color: "#D8D8D8", }, }, @@ -59,6 +69,7 @@ const useStyles = makeStyles((theme) => ({ searchContainer: { width: "40%", margin: "auto", + // backgroundColor: '#505050', paddingTop: "4%", }, [theme.breakpoints.down("xs")]: { @@ -72,7 +83,7 @@ const useStyles = makeStyles((theme) => ({ })); function Alert(props) { - return ; + return ; } function Onboarding( @@ -84,18 +95,23 @@ function Onboarding( searchTerm, setFilter, ratings, + getRatingAction, }, props ) { + // console.log("movies", movies); const classes = useStyles(); //for okta - const { authState } = useOktaAuth(); + const { authState, authService } = useOktaAuth(); const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState({ num: 0 }); + let [numRatings, setNumRatings] = useState({num:0}); const screenWidth = widthFinder(window.innerWidth); - + //for search bar + const handleSubmit = (e) => { + if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + }; const [query, setQuery] = useState({ query: "", }); @@ -104,8 +120,13 @@ function Onboarding( props.setFilter(query); }; + const handleChange = (e) => { + setQuery({ query: e.target.value }); + sendChange(e.target.value.trim()); + }; const handleClickStar = () => { setOpenAlert(true); + }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -120,84 +141,94 @@ function Onboarding( getMoviesAction(userid, accessToken); //get ratings // getRatingAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter]); + }, [getMoviesAction, userid, ratings, setFilter,]); // How many movies render const cardAmount = 25; + // console.log('state ', state ) + // console.log("open alert is now ", openAlert); if (isFetching) return ; - else if (numRatings.num >= 13) return ; - else - return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + else if (numRatings.num >= 13) return + else return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { return ( -
- + -
- ); - })} -
- - - You have successfully rated this movie! - - -
- ); -} + ? unsplashUrl + : moviePoster + } + handleClickStar={handleClickStar} + numRatings={numRatings} + setNumRatings={setNumRatings} + /> +
+ ); + })} +
+ {/* + Next + */} + + + You have successfully rated this movie! + + +
+ ); + } const mapStateToProps = (state) => { + // console.log(state.rating.movies.length) return { userid: state.login.userid, isFetching: state.movie.isFetching, @@ -212,5 +243,6 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps, { getMoviesAction, setFilter, - getRatingAction, + getRatingAction })(Onboarding); + diff --git a/src/components/auth/Onboarding2.js b/src/components/auth/Onboarding2.js new file mode 100644 index 0000000..edb25c1 --- /dev/null +++ b/src/components/auth/Onboarding2.js @@ -0,0 +1,133 @@ +import React, { useEffect } from "react"; +// import Onboarding from '../lib'; +// import reactOnboardingPro from "react-onboarding-pro"; +// import "react-onboarding-pro/build/index.css"; +import { connect } from "react-redux"; +import { + getMoviesAction, + setFilter, + recommendationAction, +} from "../../store/actions/index.js"; +// Screen width util +import widthFinder from "../../utils/widthFinder.js"; + +// children components +import MovieCard from "../movies/MovieCard.js"; +import LoadingScreen from "../layout/LoadingScreen.js"; +//for grid +import { GridList } from "@material-ui/core/"; +import { makeStyles } from "@material-ui/core/styles"; +//for Link +import { ifDev } from "../../utils/removeAttribute.js"; +import { Link } from "react-router-dom"; + +const useStyles = makeStyles((theme) => ({ + cardGrid: { + paddingTop: theme.spacing(4), + paddingBottom: theme.spacing(4), + paddingRight: theme.spacing(2), + paddingLeft: theme.spacing(2), + }, +})); +function Onboarding2( + { + isFetching, + movies, + userid, + recommendationAction, + getMoviesAction, + searchTerm, + setFilter, + ratings, + }, + props +) { + const classes = useStyles(); + const screenWidth = widthFinder(window.innerWidth); + + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid); + // returns a list of recommendations to start the recommendations page + recommendationAction(userid); + }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + // How many movies render + const cardAmount = 25; + + if (isFetching) return ; + else + return ( + + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} + {/* + +
+

Recommendation setup wizard

+
+ Placeholder from placeholder.com +
+

For users who want to use Groa without uploading data.

+ +
+
+ +
+ ); +} diff --git a/src/components/auth/PostLogin.test.js b/src/components/auth/PostLogin.test.js new file mode 100644 index 0000000..feeec09 --- /dev/null +++ b/src/components/auth/PostLogin.test.js @@ -0,0 +1,44 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { Router, Route } from "react-router-dom"; +import { getAllByTestId } from "../../utils/test-utils.js"; +import { createMemoryHistory } from "history"; + +// component to be tested. +import PostLogin from "./PostLogin"; + +it("renders PostLogin component on the path '/setup-wizard'", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "post-login-component"); + expect(component.length).toBe(1); +}); + +it("renders Upload from ratings header", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "upload-ratings-header"); + expect(component.length).toBe(1); +}); + +it("renders button to upload ratings", () => { + let route = "/setup-wizard"; + const { container } = render( + + + + ); + + let component = getAllByTestId(container, "upload-ratings-button"); + expect(component.length).toBe(1); +}); diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 35ca724..9d7c76f 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -1,8 +1,8 @@ -import React, { useEffect } from "react"; +import React, { useState, useEffect} from "react"; import { connect } from "react-redux"; import { registerAction, loginAction } from "../../store/actions"; import { ifDev } from "../../utils/removeAttribute.js"; -import { Link, useHistory } from "react-router-dom"; +import { Link, useHistory} from "react-router-dom"; // styling imports @@ -25,7 +25,7 @@ function Copyright() { {' '} 2020 {'.'} - + GROƁ Privacy Policy @@ -94,15 +94,18 @@ const Register = (props) => { {/* FORM STARTS */}
{/* */} -
+
+

OR

-
- Facebook Icon -
+
+ Facebook Icon +

Login with Facebook

diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index a2ae36e..f1d7e40 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -8,7 +8,7 @@ export default function RegisterNavLinks() { return (
Groa Logo -

Welcome

+

Register

); } diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 0d767ff..3c6b489 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: `https://www.dev.groa.us/api/users` - }) + baseURL: process.env.REACT_APP_BASEURL + }) } export default axiosWithAuth; \ No newline at end of file From 3d7f96448b2fcb82994d768d49a53b80879c96d4 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 14 May 2020 15:28:13 -0700 Subject: [PATCH 640/822] movie cards evened out, movie images respect space --- src/components/dashboard/Ratings.js | 6 ++++-- src/components/movies/MovieCard.js | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 441c2b9..f1e766f 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -19,7 +19,9 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - + movieCard:{ + border:'2px solid red' + }, })); function Ratings({ userid, @@ -67,7 +69,7 @@ function Ratings({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
({ }, modalBtn: { - border:'2px solid white', - height: '250px', + // border:'2px solid white', + // height: '250px', // paddingBottom: '2%', // display: 'flex', // justifyContent: 'center', From 740d686a08b5adb35c012ed43671f0b1302cc972 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 11:05:21 -0400 Subject: [PATCH 641/822] fixes recommendations page --- src/store/actions/recommendationActions.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index a9dedbd..e280b44 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -1,4 +1,4 @@ -import axiosWithAuth from "../../utils/axiosWithAuth.js"; +import axios from "axios"; export const FETCHING_RECOMMENDATIONS_START = "FETCHING_RECOMMENDATIONS_START"; export const FETCHING_RECOMMENDATIONS_SUCCESS = "FETCHING_RECOMMENDATIONS_SUCCESS"; @@ -6,13 +6,23 @@ export const FETCHING_RECOMMENDATIONS_FAIL = "FETCHING_RECOMMENDATIONS_FAIL"; // RECOMMENDATIONS // this call requests new recommendations be inserted into the database, then returns latest -export function recommendationAction(id, accessToken) { +export function recommendationAction(id) { return (dispatch) => { dispatch({ type: FETCHING_RECOMMENDATIONS_START, }); - axiosWithAuth(accessToken) - .get(`/${id}/recommendations`) + axios + .post( + "https://ds.groa.us/recommendations", + { + user_id: id, + num_recs: 50, + good_threshold: 3.5, + bad_threshold: 2.5, + harshness: 1, + }, + { headers: { "Content-Type": "application/json" } } + ) .then((res) => { console.log(res); dispatch({ @@ -28,4 +38,4 @@ export function recommendationAction(id, accessToken) { }); }); }; -} \ No newline at end of file +} From bb8b9d2ccde3c5fdfc3ac6066bfcf30847a78f8d Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 11:09:18 -0400 Subject: [PATCH 642/822] cleaned up recommendation action for explore page --- src/components/dashboard/Explore.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index acb2f3d..537576e 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -24,7 +24,6 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - })); function Explore({ isFetching, @@ -39,16 +38,14 @@ function Explore({ const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; // console.log("|||||||||||||||||||||||",accessToken); useEffect(() => { setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); + }, [getMoviesAction, userid, ratings, setFilter, accessToken]); // How many movies render const cardAmount = 25; @@ -68,9 +65,9 @@ function Explore({ film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -98,10 +95,10 @@ function Explore({ rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } From 012742fc309f644d30d3fc794a62b550de752093 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 11:09:36 -0400 Subject: [PATCH 643/822] clears unused okta state --- src/components/dashboard/Recommendations.js | 22 +++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index f3e255c..c1043b5 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { useOktaAuth } from '@okta/okta-react'; +import { useOktaAuth } from "@okta/okta-react"; // tools import { connect } from "react-redux"; import { @@ -34,14 +34,10 @@ function Recommendations({ isUploaded, setFilter, }) { - - const { authState } = useOktaAuth(); - const { accessToken } = authState; - useEffect(() => { setFilter(""); if (isUploaded === true) { - recommendationAction(userid, accessToken); + recommendationAction(userid); toggleIsUploaded(); } recommendationAction(userid); @@ -62,9 +58,9 @@ function Recommendations({ .filter((movie) => searchTerm !== "" ? movie.title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -82,10 +78,10 @@ function Recommendations({ movie_id={movie.movie_id} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } From 44b23a8bd8c9a48f26ee9f8e0494006ad247e459 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 11:18:36 -0400 Subject: [PATCH 644/822] upload functionality --- package-lock.json | 3 +-- src/components/auth/DataUpload.js | 44 ++++++++++++++++++------------- src/store/actions/uploadAction.js | 16 ++++++----- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index e961ea4..169471e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7386,8 +7386,7 @@ }, "yargs-parser": { "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "resolved": "", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/src/components/auth/DataUpload.js b/src/components/auth/DataUpload.js index 92206ee..49489e9 100644 --- a/src/components/auth/DataUpload.js +++ b/src/components/auth/DataUpload.js @@ -14,15 +14,15 @@ import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { const [uploadSuccess, setUploadSuccess] = useState(false); - //OKTA AUTH - const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const { accessToken } = authState; useEffect(() => { - setFilter("") - }) + setFilter(""); + }); - const toggleInstructions = (window.onclick = function(event) { + const toggleInstructions = (window.onclick = function (event) { const dropdowns = document.getElementsByClassName("dropdown-content"); const dropdowns2 = document.getElementsByClassName( "dropdown-content-Empty" @@ -50,22 +50,26 @@ const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { } }); - const handleChange = file => { - let data = new FormData(); - data.append("movies", file, file.name); - uploadAction(userid, data, setUploadSuccess, accessToken); - data = new FormData(); + const handleChange = (file) => { + console.log("This is the file that is uploaded: ", file); + let formData = new FormData(); + formData.append("movies", file); + for (var pair of formData.entries()) { + console.log(pair[0] + ", " + pair[1]); + } + uploadAction(userid, formData, setUploadSuccess, accessToken); + formData = new FormData(); }; - const onDragStart = e => { + const onDragStart = (e) => { e.preventDefault(); }; - const onDragOver = e => { + const onDragOver = (e) => { e.preventDefault(); }; - const onFileDrop = e => { + const onFileDrop = (e) => { e.preventDefault(); let files = e.dataTransfer.files; handleChange(files[0]); @@ -169,8 +173,8 @@ const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { {/* ///////////////UPLOAD FILE //////////////////// */}
-
{ // END DataUploadPage ); }; -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, - isUploading: state.upload.isUploading + isUploading: state.upload.isUploading, }; }; -export default connect(mapStateToProps, { uploadAction, setFilter })(DataUpload); +export default connect(mapStateToProps, { uploadAction, setFilter })( + DataUpload +); diff --git a/src/store/actions/uploadAction.js b/src/store/actions/uploadAction.js index 0ff2874..d3cb73a 100644 --- a/src/store/actions/uploadAction.js +++ b/src/store/actions/uploadAction.js @@ -6,31 +6,33 @@ export const UPLOADED_SUCCESSFUL = "UPLOADED_SUCCESSFUL"; // UPLOADING export function uploadAction(userid, data, setUploadSuccess, token) { - return dispatch => { + console.log("this is data in the action: ", data); + + return (dispatch) => { dispatch({ type: UPLOADING_FILE_START }); axiosWithAuth(token) // this is insantiated when a file is added to input .post(`/${userid}/uploading`, data, { headers: { - "Content-Type": "multipart/form-data" - } + "Content-Type": "multipart/form-data", + }, }) - .then(res => { + .then((res) => { dispatch({ type: UPLOADING_FILE_SUCCESS, payload: res.data }); setUploadSuccess(true); }) - .catch(err => { + .catch((err) => { console.log("ERROR: ", err); dispatch({ type: UPLOADING_FILE_FAIL, - payload: err + payload: err, }); }); }; } export function toggleIsUploaded() { - return dispatch => { + return (dispatch) => { dispatch({ type: UPLOADED_SUCCESSFUL }); }; } From 2c037566880c1395043deb54ad9c2c699aeb849a Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 08:33:18 -0700 Subject: [PATCH 645/822] clean up onboarding --- src/components/auth/Onboarding.js | 43 +++++-------------------------- 1 file changed, 6 insertions(+), 37 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 9f3ca47..3e60e84 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,26 +1,14 @@ import React, { useEffect, useState } from "react"; -// import Onboarding from '../lib'; -// import reactOnboardingPro from "react-onboarding-pro"; -// import "react-onboarding-pro/build/index.css"; import { connect } from "react-redux"; import { getMoviesAction, getRatingAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; -// PostOnboarding -import PostOnboarding from './PostOnboarding'; // children components import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid import { GridList } from "@material-ui/core/"; import { makeStyles } from "@material-ui/core/styles"; -//for Link -import { ifDev } from "../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; -//for search bar -import { useTheme } from "@material-ui/core/styles"; -import SearchIcon from "@material-ui/icons/Search"; -import InputBase from "@material-ui/core/InputBase"; //testing snackbar import Snackbar from "@material-ui/core/Snackbar"; @@ -28,7 +16,6 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; -import { SecureRoute } from '@okta/okta-react'; import { Redirect } from 'react-router'; @@ -95,23 +82,19 @@ function Onboarding( searchTerm, setFilter, ratings, - getRatingAction, }, props ) { // console.log("movies", movies); const classes = useStyles(); //for okta - const { authState, authService } = useOktaAuth(); + const { authState } = useOktaAuth(); const { accessToken } = authState; const [openAlert, setOpenAlert] = useState(false); - let [numRatings, setNumRatings] = useState({num:0}); + let [numRatings, setNumRatings] = useState({ num: 0 }); const screenWidth = widthFinder(window.innerWidth); //for search bar - const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); - }; const [query, setQuery] = useState({ query: "", }); @@ -120,13 +103,9 @@ function Onboarding( props.setFilter(query); }; - const handleChange = (e) => { - setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; const handleClickStar = () => { setOpenAlert(true); - + }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -139,15 +118,12 @@ function Onboarding( setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - //get ratings - // getRatingAction(userid, accessToken); }, [getMoviesAction, userid, ratings, setFilter,]); // How many movies render const cardAmount = 25; - // console.log('state ', state ) - // console.log("open alert is now ", openAlert); + if (isFetching) return ; - else if (numRatings.num >= 13) return + else if (numRatings.num >= 13) return else return (
- {/* - Next - */}
); - } +} const mapStateToProps = (state) => { - // console.log(state.rating.movies.length) return { userid: state.login.userid, isFetching: state.movie.isFetching, From c8d366ce873375db4f3c1e524f877ef24a8e77a4 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 08:42:10 -0700 Subject: [PATCH 646/822] clean up login and dataupload --- src/App.js | 11 -- src/components/auth/Congratulations.js | 2 +- src/components/auth/Congratulations.test.js | 10 +- src/components/auth/DataUpload.js | 10 +- src/components/auth/Login.js | 154 +------------------- 5 files changed, 17 insertions(+), 170 deletions(-) diff --git a/src/App.js b/src/App.js index 0f98078..76ab66c 100644 --- a/src/App.js +++ b/src/App.js @@ -5,7 +5,6 @@ import { Security, SecureRoute, LoginCallback } from '@okta/okta-react'; import Test from './Test'; // local imports -import PrivateRoute from "./utils/privateRoute.js"; import Recommendations from "./components/dashboard/Recommendations.js"; import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; @@ -16,7 +15,6 @@ import Ratings from './components/dashboard/Ratings'; import Explore from "./components/dashboard/Explore.js"; import Onboarding from './components/auth/Onboarding'; -import Onboarding2 from './components/auth/Onboarding2'; import SearchBar from './components/auth/SearchBar'; import OnboardingPlateform from './components/auth/OnboardingPlateform'; import PostOnboarding from './components/auth/PostOnboarding'; @@ -25,7 +23,6 @@ import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; import oktaConfig from './config/oktaConfig'; -import { useOktaAuth } from '@okta/okta-react'; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -117,7 +114,6 @@ function App() { exact path={[ '/:user_id/onboarding', - '/:user_id/onboarding2', ]} component={SearchBar} /> @@ -128,10 +124,6 @@ function App() { - - - {/* this could be a modal */} - {/* */}
diff --git a/src/components/auth/Congratulations.js b/src/components/auth/Congratulations.js index 94fde2e..27dfeab 100644 --- a/src/components/auth/Congratulations.js +++ b/src/components/auth/Congratulations.js @@ -15,7 +15,7 @@ const Congrats = ({ userid }) => { Success png
diff --git a/src/components/auth/Congratulations.test.js b/src/components/auth/Congratulations.test.js index 036263f..589e24b 100644 --- a/src/components/auth/Congratulations.test.js +++ b/src/components/auth/Congratulations.test.js @@ -1,7 +1,7 @@ import React from "react"; import { render } from "@testing-library/react"; import { getAllByTestId } from "../../utils/test-utils.js"; -import {BrowserRouter as Router } from "react-router-dom"; +import { BrowserRouter as Router } from "react-router-dom"; // component to be tested import Congratulations from "./Congratulations.js"; @@ -13,11 +13,11 @@ import configureStore from "redux-mock-store"; const mockStore = configureStore() let store = mockStore({ login: { - userid: 4 + userid: 4 }, }) -it("renders Congratulations component", () =>{ +it("renders Congratulations component", () => { const { container } = render( @@ -25,6 +25,6 @@ it("renders Congratulations component", () =>{ ); - const component = getAllByTestId(container, "congrats-screen"); - expect(component.length).toBe(1); + const component = getAllByTestId(container, "congrats-screen"); + expect(component.length).toBe(1); }); diff --git a/src/components/auth/DataUpload.js b/src/components/auth/DataUpload.js index 92206ee..693c83d 100644 --- a/src/components/auth/DataUpload.js +++ b/src/components/auth/DataUpload.js @@ -14,15 +14,15 @@ import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { const [uploadSuccess, setUploadSuccess] = useState(false); - //OKTA AUTH - const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + //OKTA AUTH + const { authState, authService } = useOktaAuth(); + const { accessToken } = authState; useEffect(() => { setFilter("") }) - const toggleInstructions = (window.onclick = function(event) { + const toggleInstructions = (window.onclick = function (event) { const dropdowns = document.getElementsByClassName("dropdown-content"); const dropdowns2 = document.getElementsByClassName( "dropdown-content-Empty" @@ -169,7 +169,7 @@ const DataUpload = ({ userid, uploadAction, isUploading, setFilter }) => { {/* ///////////////UPLOAD FILE //////////////////// */}
- ({ }, textField: { display: "flex", - // justifyContent: "center", marginBottom: "2%", width: "100%", padding: "0", - // display:'flex', - // justifyContent:'center' }, })); -const RegisterSchema = Yup.object().shape({ - user_name: Yup.string().required("Username is required"), - password: Yup.string().required("Password is required"), -}); - const LoginPage = (props) => { //OKTA useOKTA AUTH const { authState, authService } = useOktaAuth(); - - //Okta Login/Logout redirects const login = async () => authService.login('/'); const logout = async () => authService.logout('/'); @@ -68,36 +53,12 @@ const LoginPage = (props) => { if (authState.isAuthenticated) { authService.getUser() .then((info) => { - props.loginAction(authState.accessToken, info.sub, props.history) - }) - .catch(err => console.log("Error fetching User info in UseEffect", err)) + props.loginAction(authState.accessToken, info.sub, props.history) + }) + .catch(err => console.log("Error fetching User info in UseEffect", err)) } }, []); - - - - // const [user, setUser] = useState({ - // user_name: "", - // password: "", - // }); - // const { register, handleSubmit, errors } = useForm({ - // validationSchema: RegisterSchema, - // }); - // const classes = useStyles(); - - // const handleChange = (e) => { - // setUser({ - // ...user, - // [e.target.name]: e.target.value, - // }); - // console.log(user); - // }; - - // const onSubmit = () => { - // props.loginAction(user, props.history); - // }; - return (
{ Graphic
- {/* FORM START */} - {/*
- - - {errors.user_name && errors.user_name.type === "required" && ( -

A username is required

- )} - - {errors.password && errors.password.type === "required" && ( -

A password is required

- )} - -
-
-
- - -

- OR -

-
-
- Google icon -
-

- Sign in with Google -

-
-
-
- Facebook Icon -
-

- Sign in with Facebook -

-
- {/* Sign in with Facebook -
-
- -
-

- - - Don't have an account? -
Sign up -
- -

- {/* Test - -
-

IIIIIIIIIIIIII

- {!authState.isAuthenticated &&

TEST PAGE/REDIRECT

} -
- - - -
- -
*/} - {/* FORM ENDS */} -

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

- {/* {!authState.isAuthenticated &&

Please Login

} - {authState.isAuthenticated &&

You are Logged in

} */} - - {!authState.isAuthenticated ?

Please Login

:

You are Logged in Logout

} - - -
+ {!authState.isAuthenticated ?

Please Login

:

You are Logged in Logout

} +
{/* END OF MAIN CONTENT */} From 364a320e8ece24ea23cc1662993743ed3a2e40ed Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 08:42:51 -0700 Subject: [PATCH 647/822] delet onboarding 2 --- src/components/auth/Onboarding2.js | 133 ----------------------------- 1 file changed, 133 deletions(-) delete mode 100644 src/components/auth/Onboarding2.js diff --git a/src/components/auth/Onboarding2.js b/src/components/auth/Onboarding2.js deleted file mode 100644 index edb25c1..0000000 --- a/src/components/auth/Onboarding2.js +++ /dev/null @@ -1,133 +0,0 @@ -import React, { useEffect } from "react"; -// import Onboarding from '../lib'; -// import reactOnboardingPro from "react-onboarding-pro"; -// import "react-onboarding-pro/build/index.css"; -import { connect } from "react-redux"; -import { - getMoviesAction, - setFilter, - recommendationAction, -} from "../../store/actions/index.js"; -// Screen width util -import widthFinder from "../../utils/widthFinder.js"; - -// children components -import MovieCard from "../movies/MovieCard.js"; -import LoadingScreen from "../layout/LoadingScreen.js"; -//for grid -import { GridList } from "@material-ui/core/"; -import { makeStyles } from "@material-ui/core/styles"; -//for Link -import { ifDev } from "../../utils/removeAttribute.js"; -import { Link } from "react-router-dom"; - -const useStyles = makeStyles((theme) => ({ - cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), - }, -})); -function Onboarding2( - { - isFetching, - movies, - userid, - recommendationAction, - getMoviesAction, - searchTerm, - setFilter, - ratings, - }, - props -) { - const classes = useStyles(); - const screenWidth = widthFinder(window.innerWidth); - - useEffect(() => { - setFilter(""); - // Returns the movies - getMoviesAction(userid); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; - - if (isFetching) return ; - else - return ( - - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} - {/* - -

OR

+ +

OR

-
- Google Icon -
-

Sign up with Google

-
-
-
- Facebook Icon -
-

Sign up with Facebook

-
+
+ Google Icon +
+

Sign up with Google

+
+
+
+ Facebook Icon +
+

Sign up with Facebook

+
diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 12e1834..9688799 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -6,7 +6,7 @@ import { recommendationAction } from "../../store/actions"; //for search bar -import { makeStyles} from "@material-ui/core/styles"; +import { makeStyles } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; @@ -14,7 +14,6 @@ const useStyles = makeStyles(theme => ({ searchContainer: { width: "40%", margin: 'auto', - // backgroundColor: '#505050', paddingTop: '4%', }, [theme.breakpoints.down("xs")]: { @@ -46,7 +45,6 @@ const useStyles = makeStyles(theme => ({ justifyContent: "center", color: '#ffffff', "&:hover": { - // backgroundColor: '#5c5b5b', color: '#D8D8D8', }, }, @@ -68,8 +66,6 @@ const useStyles = makeStyles(theme => ({ const Navigation = props => { - //for user icon menu -// const [anchorEl, setAnchorEl] = React.useState(null); const classes = useStyles(); const [query, setQuery] = useState({ @@ -90,26 +86,26 @@ const Navigation = props => { }; return ( -
-
-
- -
- -
-
- +
+
+
+ +
+ +
+
+ ); }; From 76fde56043574be6520255138fc2ef9c6b6d2e96 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 08:51:15 -0700 Subject: [PATCH 649/822] clean up watchlist --- src/components/dashboard/Explore.js | 18 ++++++------- src/components/dashboard/Navigation.js | 37 +++----------------------- src/components/dashboard/Ratings.js | 6 ++--- src/components/dashboard/Watchlist.js | 22 +++++++-------- 4 files changed, 25 insertions(+), 58 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 717780f..2de3eb5 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -35,14 +35,12 @@ function Explore({ searchTerm, setFilter, ratings, - handleClickStar, }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; - // console.log("|||||||||||||||||||||||",accessToken); useEffect(() => { setFilter(""); // Returns the movies @@ -69,9 +67,9 @@ function Explore({ film.start_year === movie.start_year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -102,10 +100,10 @@ function Explore({ rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index d37f93a..ba67d2b 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -5,7 +5,6 @@ import { setFilter, recommendationAction } from "../../store/actions"; -// import debounce from "../../utils/debounce"; import GroaLogo from "../../img/groa-logo-nav.png"; //for search bar @@ -45,10 +44,8 @@ import GradeRoundedIcon from '@material-ui/icons/GradeRounded'; import ExitToAppRoundedIcon from '@material-ui/icons/ExitToAppRounded'; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; - const drawerWidth = 240; - const useStyles = makeStyles(theme => ({ searchContainer: { width: "40%", @@ -94,7 +91,6 @@ const useStyles = makeStyles(theme => ({ justifyContent: "center", color: '#505050', "&:hover": { - // backgroundColor: '#5c5b5b', color: '#D8D8D8', }, }, @@ -128,7 +124,6 @@ const useStyles = makeStyles(theme => ({ marginLeft: drawerWidth, transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.easeOut, - // duration: theme.transitions.duration.enteringScreen, }), }, menuButton: { @@ -183,14 +178,13 @@ const useStyles = makeStyles(theme => ({ }, })); - const Navigation = props => { - //OKTA useOKTA AUTH - const { authState, authService } = useOktaAuth(); - const [userInfo, setUserInfo] = useState(null); + //OKTA useOKTA AUTH + const { authState, authService } = useOktaAuth(); + const [userInfo, setUserInfo] = useState(null); - const logout = async () => authService.logout('/'); + const logout = async () => authService.logout('/'); //for nav bar const theme = useTheme(); @@ -264,21 +258,6 @@ const Navigation = props => { if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); }; - // const clearInput = e => { - // setQuery({ query: "" }); - // props.setFilter(""); - // }; - - // const logout = () => { - // localStorage.removeItem("token"); - // localStorage.removeItem("state"); - // }; - - // const getNewRecommendations = id => { - // Gets new recommendations for account, if applicible - // props.recommendationAction(id); - // }; - //for click away const handleClickAway = () => { setOpen(false); }; @@ -370,14 +349,6 @@ const Navigation = props => { ))} - {/* - {['All mail', 'Trash', 'Spam'].map((text, index) => ( - - {index % 2 === 0 ? : } - - - ))} - */}
({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - movieCard:{ - border:'2px solid red' + movieCard: { + border: '2px solid red' }, })); function Ratings({ @@ -33,7 +33,7 @@ function Ratings({ }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; //for sizing of the movie cards const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 306c08f..f76b382 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -31,17 +31,16 @@ function Watchlist({ isFetching, isDeleting, watchlist, - watchlistError, getWatchlistAction, searchTerm, removeFromWatchlistAction, setFilter, movies, }) { -console.log('movies', movies) + console.log('movies', movies) //OKTA AUTH - const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { authState } = useOktaAuth(); + const { accessToken } = authState; const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui @@ -73,9 +72,9 @@ console.log('movies', movies) .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -95,10 +94,10 @@ console.log('movies', movies) page="watchlist" image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } @@ -106,7 +105,6 @@ console.log('movies', movies) setDeleteMode={setDeleteMode} handleClick={handleClick} /> -
); })} From 425de3f981a468b1948fce80eff9135a7c1a532a Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 09:17:27 -0700 Subject: [PATCH 650/822] create black border on movei cards on hover --- src/components/dashboard/Explore.js | 9 +++++++-- src/components/dashboard/Ratings.js | 7 +++++-- src/components/dashboard/Recommendations.js | 8 +++++++- src/components/dashboard/Watchlist.js | 8 +++++++- src/components/movies/MovieCard.js | 11 +++++++---- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 2de3eb5..166802b 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -24,7 +24,12 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - + movieCard: { + "&:hover": { + boxShadow: '0px 0px 2px 2px black', + backgroundColor:'black', + }, + }, })); function Explore({ isFetching, @@ -88,7 +93,7 @@ function Explore({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
({ - cardGrid: { + cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, movieCard: { - border: '2px solid red' + "&:hover": { + boxShadow: '0px 0px 2px 2px black', + backgroundColor:'black', + }, }, })); function Ratings({ diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index b0f3c47..50b6009 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -23,6 +23,12 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, + movieCard: { + "&:hover": { + boxShadow: '0px 0px 2px 2px black', + backgroundColor:'black', + }, + }, })); function Recommendations({ @@ -73,7 +79,7 @@ function Recommendations({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, + movieCard: { + "&:hover": { + boxShadow: '0px 0px 2px 2px black', + backgroundColor:'black', + }, + }, })); function Watchlist({ userid, @@ -83,7 +89,7 @@ function Watchlist({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
({ }, movieImg: { width: "100%", - height: '200px', + height: '375px', opacity: 1, // display: "block", backfaceVisibility: "hidden", @@ -123,9 +123,8 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", width: "100%", "&:hover": { - // background: "black", - opacity: "0.3", - }, + // boxShadow: '0px 0px 2px 2px black', + }, moreInfo: { display: "flex", flexDirection: "row", @@ -232,6 +231,10 @@ const useStyles = makeStyles((theme) => ({ // movieImg:{ // height:'80%', // }, + movieImg:{ + height:'200px', + width:'100%', + }, movieImgModal: { width: "80%", }, From 057d912d9d5d8d93b64c5f78571e61cf73382cde Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 09:36:57 -0700 Subject: [PATCH 651/822] update movie cards in onboarding and search bar --- src/components/auth/Onboarding.js | 11 +++++++++-- src/components/auth/SearchBar.js | 4 +--- src/components/dashboard/Navigation.js | 12 ++---------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 3e60e84..666d3f1 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -67,6 +67,13 @@ const useStyles = makeStyles((theme) => ({ Link: { marginBottom: "2%", }, + movieCard: { + color: 'white', + "&:hover": { + boxShadow: '0px 0px 2px 2px black', + backgroundColor: 'black', + }, + }, })); function Alert(props) { @@ -160,7 +167,7 @@ function Onboarding( "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 9688799..ff517e4 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -50,6 +50,7 @@ const useStyles = makeStyles(theme => ({ }, inputRoot: { color: '#ffffff', + width:'100%', "&:hover": { color: '#ffffff', }, @@ -58,9 +59,6 @@ const useStyles = makeStyles(theme => ({ padding: theme.spacing(1, 1, 1, 7), transition: theme.transitions.create("width"), width: "100%", - [theme.breakpoints.up("md")]: { - width: 200 - } }, })); diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index ba67d2b..1339380 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -69,10 +69,6 @@ const useStyles = makeStyles(theme => ({ position: "relative", borderRadius: theme.shape.borderRadius, backgroundColor: '#ffffff', - "&:hover": { - backgroundColor: '#5c5b5b', - color: '#ffffff', - }, width: "100%", [theme.breakpoints.down("sm")]: { width: "auto" @@ -90,15 +86,10 @@ const useStyles = makeStyles(theme => ({ alignItems: "center", justifyContent: "center", color: '#505050', - "&:hover": { - color: '#D8D8D8', - }, }, inputRoot: { color: "#505050", - "&:hover": { - color: '#ffffff', - }, + width: '100%', }, inputInput: { padding: theme.spacing(1, 1, 1, 7), @@ -114,6 +105,7 @@ const useStyles = makeStyles(theme => ({ flexDirection: 'column' }, appBar: { + backgroundColor: '#5c5b5b', transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, From 383d245f51aadbd0a3eb7ba44c6cbe648e4e605c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 14:32:01 -0400 Subject: [PATCH 652/822] sets state to correct naming with DS api --- src/components/dashboard/Explore.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index f57bf7b..9c8472c 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -52,13 +52,12 @@ function Explore({ + cellHeight="auto" + > {movies .filter((movie) => !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year + (film) => film.title === movie.title && film.year === movie.year ).length && searchTerm !== "" ? movie.primary_title .toString() @@ -70,10 +69,7 @@ function Explore({ .map((movie, index) => { /* Checks if the film is in ratings */ const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); + return film.title === movie.title && film.year === movie.year; }; /* Returns the movie object if in ratings */ let rated = ratings.find(isRated); @@ -86,8 +82,8 @@ function Explore({ Date: Fri, 15 May 2020 14:32:24 -0400 Subject: [PATCH 653/822] removes console log on widthfinder --- src/utils/widthFinder.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/widthFinder.js b/src/utils/widthFinder.js index fb21e25..2be5a86 100644 --- a/src/utils/widthFinder.js +++ b/src/utils/widthFinder.js @@ -1,5 +1,4 @@ const widthFinder = (screenWidth) => { - console.log("passed down width", screenWidth); if (parseInt(screenWidth) < 400) { return true; } else { From 7e965e740c44de7a1e1619ba825f7d0dadaafeb2 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 14:47:20 -0400 Subject: [PATCH 654/822] removes console log not needed --- src/components/dashboard/Ratings.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 6aff9f7..a697104 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -8,7 +8,7 @@ import widthFinder from "../../utils/widthFinder.js"; import MovieCard from "../movies/MovieCard.js"; import LoadingScreen from "../layout/LoadingScreen.js"; //for grid -import { makeStyles } from '@material-ui/core/styles'; +import { makeStyles } from "@material-ui/core/styles"; import { GridList } from "@material-ui/core/"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; @@ -19,7 +19,6 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - })); function Ratings({ userid, @@ -31,7 +30,7 @@ function Ratings({ }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); - const {accessToken} = authState; + const { accessToken } = authState; //for sizing of the movie cards const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -40,9 +39,6 @@ function Ratings({ // Returns the ratings getRatingAction(userid, accessToken); }, [getRatingAction, userid, setFilter]); - console.log(`here + ${screenWidth}`); - // console.log(classes); - console.log("ratings length " + ratings.length); if (isFetching) return ; else @@ -56,9 +52,9 @@ function Ratings({ .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -78,18 +74,17 @@ function Ratings({ trailer={movie.trailer_url} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } />
); - } - )} + })} ); } From 546370714a7e390714a98d102eb18d61a0f06b44 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 14:47:41 -0400 Subject: [PATCH 655/822] removed two imports not used and ran prettier linter --- src/App.js | 159 +++++++++++++++++++++++++---------------------------- 1 file changed, 74 insertions(+), 85 deletions(-) diff --git a/src/App.js b/src/App.js index e5f555d..e9df84a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,30 +1,27 @@ import React, { useEffect } from "react"; import { Route } from "react-router-dom"; -import { Security, SecureRoute, LoginCallback } from '@okta/okta-react'; -import Test from './Test'; +import { Security, SecureRoute, LoginCallback } from "@okta/okta-react"; // local imports -import PrivateRoute from "./utils/privateRoute.js"; import Recommendations from "./components/dashboard/Recommendations.js"; import Navigation from "./components/dashboard/Navigation.js"; import Register from "./components/auth/Register"; -import Login from "./components/auth/Login"; import DataUpload from "./components/auth/DataUpload"; import Watchlist from "./components/dashboard/Watchlist.js"; -import Ratings from './components/dashboard/Ratings'; +import Ratings from "./components/dashboard/Ratings"; import Explore from "./components/dashboard/Explore.js"; -import Onboarding from './components/auth/Onboarding'; -import Onboarding2 from './components/auth/Onboarding2'; -import SearchBar from './components/auth/SearchBar'; -import OnboardingPlateform from './components/auth/OnboardingPlateform'; -import PostOnboarding from './components/auth/PostOnboarding'; +import Onboarding from "./components/auth/Onboarding"; +import Onboarding2 from "./components/auth/Onboarding2"; +import SearchBar from "./components/auth/SearchBar"; +import OnboardingPlateform from "./components/auth/OnboardingPlateform"; +import PostOnboarding from "./components/auth/PostOnboarding"; import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; -import oktaConfig from './config/oktaConfig'; -import { useOktaAuth } from '@okta/okta-react'; +import oktaConfig from "./config/oktaConfig"; +import { useOktaAuth } from "@okta/okta-react"; // config imports import reactGAinitialization from "./config/analytics.js"; @@ -54,7 +51,7 @@ store.subscribe(() => { login: store.getState().login, recommendations: store.getState().recommendations, rating: store.getState().rating, - watchlist: store.getState().watchlist + watchlist: store.getState().watchlist, }); }); @@ -68,89 +65,81 @@ function App() { palette: { type: "dark", primary: { - main: "#DBE0DF" + main: "#DBE0DF", }, secondary: { - main: "#6E8B3D" - } + main: "#6E8B3D", + }, }, typography: { - fontFamily: "Mallanna, sans-serif" - } + fontFamily: "Mallanna, sans-serif", + }, }), [] ); return ( - - - - -
- - {/* this is fine as a route because all of the routes that will have display their component will only be avalible on a private route */} - - - - - - - - + + + +
+ {/* this is fine as a route because all of the routes that will have display their component will only be avalible on a private route */} + + + + + + + + - + - - - - - - {/* this could be a modal */} - {/* */} - - -
-
-
-
+ + + + + + {/* this could be a modal */} + {/* */} + + +
+
+
+
); } From 1282e267e477429b412b63fd1d151aec0a4d9479 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 16:08:56 -0400 Subject: [PATCH 656/822] sets recommendations back to use auth --- src/components/dashboard/Recommendations.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index c95c3ac..64f3e1d 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -25,8 +25,8 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', - backgroundColor:'black', + boxShadow: "0px 0px 2px 2px black", + backgroundColor: "black", }, }, })); @@ -40,15 +40,18 @@ function Recommendations({ isUploaded, setFilter, }) { + const { authState } = useOktaAuth(); + const { accessToken } = authState; + useEffect(() => { setFilter(""); if (isUploaded === true) { recommendationAction(userid); toggleIsUploaded(); } - recommendationAction(userid); + recommendationAction(userid, accessToken); // Returns the most recent recommendations from the database - }, [userid, isUploaded, recommendationAction, setFilter]); + }, [userid, isUploaded, recommendationAction, setFilter, accessToken]); const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -114,4 +117,4 @@ export default connect(mapStateToProps, { recommendationAction, toggleIsUploaded, setFilter, -})(Recommendations); \ No newline at end of file +})(Recommendations); From cca6cc603dc7060985b54bc70840c50ed44e6988 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 15 May 2020 16:09:08 -0400 Subject: [PATCH 657/822] pointed action back to back-end --- src/store/actions/recommendationActions.js | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/store/actions/recommendationActions.js b/src/store/actions/recommendationActions.js index e280b44..97c1fe7 100644 --- a/src/store/actions/recommendationActions.js +++ b/src/store/actions/recommendationActions.js @@ -1,28 +1,18 @@ -import axios from "axios"; +import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const FETCHING_RECOMMENDATIONS_START = "FETCHING_RECOMMENDATIONS_START"; export const FETCHING_RECOMMENDATIONS_SUCCESS = "FETCHING_RECOMMENDATIONS_SUCCESS"; export const FETCHING_RECOMMENDATIONS_FAIL = "FETCHING_RECOMMENDATIONS_FAIL"; -// RECOMMENDATIONS -// this call requests new recommendations be inserted into the database, then returns latest -export function recommendationAction(id) { +// RECOMMENDATIONS // RECOMMENDATIONS +// this call requests new recommendations be inserted into the database, then returns latest // this call requests new recommendations be inserted into the database, then returns latest +export function recommendationAction(id, accessToken) { return (dispatch) => { dispatch({ type: FETCHING_RECOMMENDATIONS_START, }); - axios - .post( - "https://ds.groa.us/recommendations", - { - user_id: id, - num_recs: 50, - good_threshold: 3.5, - bad_threshold: 2.5, - harshness: 1, - }, - { headers: { "Content-Type": "application/json" } } - ) + axiosWithAuth(accessToken) + .get(`/${id}/recommendations`) .then((res) => { console.log(res); dispatch({ From f39b9fbbbdafbd3b7c27c55cc398c8429509bbaf Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 15:46:15 -0700 Subject: [PATCH 658/822] change color to blacker on all pages --- src/components/auth/Register.js | 12 +++++------- src/components/dashboard/Navigation.js | 11 ++++++++--- src/components/dashboard/Recommendations.js | 2 +- src/components/layout/LoadingScreen.js | 2 +- .../layout/nav-layouts/RegisterNavLinks.js | 2 +- src/css/main.css | 2 +- src/scss/components/_app.scss | 2 +- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 7bc8033..f1c37b9 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -55,11 +55,11 @@ const Register = (props) => { } //if user already Authenticated, loginAction redirects to to explore page - useEffect(() => { - authService.getUser() - .then((info) => { - props.loginAction(authState.accessToken, info.sub, history); - console.log("checking authentication") + useEffect(() => { + authService.getUser() + .then((info) => { + props.loginAction(authState.accessToken, info.sub, history); + console.log("checking authentication") }) .catch(err => console.log("Error fetching User info in UseEffect", err)) }, [authState]); @@ -96,7 +96,6 @@ const Register = (props) => {
-
@@ -119,7 +118,6 @@ const Register = (props) => {
- diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index f3df098..6ae46da 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -52,6 +52,9 @@ const useStyles = makeStyles((theme) => ({ margin: "auto", backgroundColor: "#505050", }, + userIcon:{ +color:'white', + }, [theme.breakpoints.down("xs")]: { searchContainer: { width: "90%", @@ -104,7 +107,7 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", }, appBar: { - backgroundColor: '#5c5b5b', + backgroundColor: '#1c1c1b', transition: theme.transitions.create(['margin', 'width'], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, @@ -126,9 +129,11 @@ const useStyles = makeStyles((theme) => ({ drawer: { width: drawerWidth, flexShrink: 0, + backgroundColor:'#212120', }, drawerPaper: { width: drawerWidth, + backgroundColor:'#212120', }, drawerHeader: { display: "flex", @@ -155,7 +160,7 @@ const useStyles = makeStyles((theme) => ({ marginLeft: 0, }, toolBar: { - backgroundColor: "#505050", + backgroundColor: "#1c1c1b", display: "flex", justifyContent: "space-between", }, @@ -267,7 +272,7 @@ const Navigation = (props) => { })}> {recommendations diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index 4af3a82..8c4f37f 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -8,7 +8,7 @@ import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles((theme) => ({ root: { display: 'flex', - background: '#505050', + background: '#212120', flexDirection: 'column', justifyContent: 'center', height: '100vh', diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index f1d7e40..a2ae36e 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -8,7 +8,7 @@ export default function RegisterNavLinks() { return (
Groa Logo -

Register

+

Welcome

); } diff --git a/src/css/main.css b/src/css/main.css index ba741ff..791f27e 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -72,7 +72,7 @@ text-transform: lowercase; } #root .App { min-height: 100vh; - background-color: #505050; } + background-color: #212120; } #root .container.register-component, #root .container.login-component { font-family: "Work Sans", sans-serif; diff --git a/src/scss/components/_app.scss b/src/scss/components/_app.scss index ec60658..b842285 100644 --- a/src/scss/components/_app.scss +++ b/src/scss/components/_app.scss @@ -1,6 +1,6 @@ .App { min-height: 100vh; - background-color: #505050; + background-color: #212120; } From 5ee08d62410dfa99bb75a05a675987bd6fbb1a6d Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 15:58:34 -0700 Subject: [PATCH 659/822] update color of each page --- src/components/auth/Onboarding.js | 38 ---------------------- src/components/auth/OnboardingPlateform.js | 2 +- src/components/auth/PostOnboarding.js | 2 +- src/components/auth/SearchBar.js | 17 ++-------- src/components/dashboard/Explore.js | 2 +- src/css/main.css | 16 ++++----- src/scss/abstracts/_variables.scss | 2 +- 7 files changed, 15 insertions(+), 64 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 7a638ac..5a3d736 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -26,44 +26,6 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - searchIcon: { - width: theme.spacing(7), - height: "100%", - position: "absolute", - pointerEvents: "none", - display: "flex", - alignItems: "center", - justifyContent: "center", - color: "#505050", - "&:hover": { - // backgroundColor: '#5c5b5b', - color: "#D8D8D8", - }, - }, - search: { - position: "relative", - borderRadius: theme.shape.borderRadius, - backgroundColor: "#5c5b5b", - "&:hover": { - backgroundColor: "#5c5b5b", - color: "#ffffff", - }, - width: "100%", - [theme.breakpoints.down("sm")]: { - width: "auto", - }, - }, - searchContainer: { - width: "40%", - margin: "auto", - // backgroundColor: '#505050', - paddingTop: "4%", - }, - [theme.breakpoints.down("xs")]: { - searchContainer: { - width: "90%", - }, - }, Link: { marginBottom: "2%", }, diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlateform.js index e20d939..9636bb0 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlateform.js @@ -11,7 +11,7 @@ const useStyles = makeStyles((theme) => ({ root: { // margin: '0 auto', display: 'flex', - background: '#505050', + background: '#212120', padding: '2%', }, onboardingPlateformImg: { diff --git a/src/components/auth/PostOnboarding.js b/src/components/auth/PostOnboarding.js index 1c6a7c0..effc5a4 100644 --- a/src/components/auth/PostOnboarding.js +++ b/src/components/auth/PostOnboarding.js @@ -16,7 +16,7 @@ import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ root: { display: 'flex', - background: '#505050', + background: '#212120', padding: '2%', }, PostOnboardingImg: { diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 5f03fd1..be4a690 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -24,12 +24,7 @@ const useStyles = makeStyles(theme => ({ search: { position: "relative", borderRadius: theme.shape.borderRadius, - backgroundColor: '#5c5b5b', - color: '#ffffff', - "&:hover": { - backgroundColor: '#5c5b5b', - color: '#ffffff', - }, + backgroundColor: 'white', width: "100%", [theme.breakpoints.down("sm")]: { width: "auto" @@ -43,17 +38,11 @@ const useStyles = makeStyles(theme => ({ display: "flex", alignItems: "center", justifyContent: "center", - color: '#ffffff', - "&:hover": { - color: '#D8D8D8', - }, + color: '#212120', }, inputRoot: { - color: '#ffffff', + color: '#212120', width: '100%', - "&:hover": { - color: '#ffffff', - }, }, inputInput: { padding: theme.spacing(1, 1, 1, 7), diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 3dcd2fd..2e549e8 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -56,7 +56,7 @@ function Explore({ return ( {movies diff --git a/src/css/main.css b/src/css/main.css index 791f27e..a9e825c 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -45,7 +45,7 @@ #root html { font-family: "Work Sans", sans-serif; font-weight: normal; - color: #505050; + color: #212120; font-size: 14px; } #root h1, #root h2, @@ -77,7 +77,7 @@ #root .container.login-component { font-family: "Work Sans", sans-serif; color: white; - background: #505050; + background: #212120; margin: 0 auto; width: 100%; min-height: 100vh; } @@ -134,7 +134,7 @@ margin: auto; padding: 3%; border-radius: 4px; - background: #505050; + background: #212120; width: 100%; max-width: 518px; height: 550px; } @@ -192,7 +192,7 @@ height: 50px; border-radius: 4px; background: #00B392; - color: #505050; + color: #212120; font-size: 14px; margin-bottom: 2%; } #root .container.register-component .box-right .bottom-form .btn-container .fancy, @@ -248,7 +248,7 @@ #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { margin: 7% 2% 0 30%; - color: #505050; + color: #212120; font-size: 14px; letter-spacing: 0.2px; font-family: "Roboto"; } @@ -394,7 +394,7 @@ #root .container.login-component .box-container .box-right { margin: 2%; padding: 0%; - background: #505050; + background: #212120; height: 100%; } #root .container.register-component .box-container .box-right .form, #root .container.login-component .box-container .box-right .form { @@ -450,7 +450,7 @@ margin-top: 2%; font-size: 20px; } } #root .mainContainer { - background: #505050; + background: #212120; padding: 1.1% 1%; font-family: "Work Sans", sans-serif; } #root .mainContainer .navContainer { @@ -594,7 +594,7 @@ border: 1px solid #D8D8D8; } #root .mainContainer .dropdown-hover:hover .dropdown-content .NavLink { border-top: 1px solid #D8D8D8; - color: #505050; + color: #212120; text-decoration: none; font-size: 1.1rem; padding: 1rem 1.5rem; diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss index 34baf42..47179bc 100644 --- a/src/scss/abstracts/_variables.scss +++ b/src/scss/abstracts/_variables.scss @@ -9,7 +9,7 @@ $gray1: #D8D8D8; $gray2: #21242C; $gray3: hsl(207, 100%, 4%); -$black: #505050; +$black: #212120; $white: hsl(0, 0%, 100%); From f589a9c7404e81556f0c5ba5dde674e1cbe37587 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 15 May 2020 15:59:52 -0700 Subject: [PATCH 660/822] 2 movie cards in each row --- src/components/auth/Onboarding.js | 2 +- src/components/dashboard/Ratings.js | 2 +- src/components/dashboard/Watchlist.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 5a3d736..f0734ae 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -97,7 +97,7 @@ function Onboarding(
{movies diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index feea01b..59548e4 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -51,7 +51,7 @@ function Ratings({ return ( {ratings diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 24ccbb4..6e0614c 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -70,7 +70,7 @@ function Watchlist({ return ( {/*
*/} From 940a55acfe8fe14d8cb359cbfa071a13a921256b Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Fri, 15 May 2020 20:40:59 -0400 Subject: [PATCH 661/822] Reduce spacing and boxshadow around cards In Dashboard --- src/components/dashboard/Explore.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 2e549e8..fd7e948 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -17,12 +17,12 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(1), + paddingLeft: theme.spacing(1), }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', + boxShadow: '0px 0px 1px 1px black', backgroundColor:'black', }, }, From ea3ebe024ddb948a16552ea8c2c11f2d30a26d17 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Fri, 15 May 2020 20:42:53 -0400 Subject: [PATCH 662/822] Reduce spacing and boxshadow around movie cards in Dashboard --- src/components/dashboard/Ratings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 59548e4..760a789 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -16,12 +16,12 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(1), + paddingLeft: theme.spacing(1), }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', + boxShadow: '0px 0px 1px 1px black', backgroundColor:'black', }, }, From 347e6f2e00e891970508206272dddf4c381ee221 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Fri, 15 May 2020 20:43:36 -0400 Subject: [PATCH 663/822] Reducing spacing and box shadow around movie cards in Recommendations --- src/components/dashboard/Recommendations.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 744c25f..1422540 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -20,12 +20,12 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(1), + paddingLeft: theme.spacing(1), }, movieCard: { "&:hover": { - boxShadow: "0px 0px 2px 2px black", + boxShadow: "0px 0px 1px 1px black", backgroundColor: "black", }, }, From bf06203b9861707efaa4393e5257e6b27e6ab8d3 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Fri, 15 May 2020 20:44:12 -0400 Subject: [PATCH 664/822] Reducing spacing and box shadow around movie cards in Watchlist --- src/components/dashboard/Watchlist.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6e0614c..1f829f2 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -22,12 +22,12 @@ const useStyles = makeStyles((theme) => ({ cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), - paddingRight: theme.spacing(2), - paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(1), + paddingLeft: theme.spacing(1), }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', + boxShadow: '0px 0px 1px 1px black', backgroundColor:'black', }, }, From 2c12bac5dfd6236873e29c0bdc105ab5aff9a138 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Mon, 18 May 2020 11:56:03 -0700 Subject: [PATCH 665/822] added movie titles to onboarding --- src/components/auth/Onboarding.js | 12 ++++++------ src/components/dashboard/Explore.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index f0734ae..3ed01f3 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -87,7 +87,7 @@ function Onboarding( setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter,]); + }, [getMoviesAction, userid, ratings, setFilter, accessToken]); // How many movies render const cardAmount = 25; @@ -104,8 +104,8 @@ function Onboarding( .filter((movie) => !ratings.includes( (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year + film.film.title === movie.title && + film.year === movie.year ).length && searchTerm !== "" ? movie.primary_title .toString() @@ -118,8 +118,8 @@ function Onboarding( /* Checks if the film is in ratings */ const isRated = (film) => { return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year + film.title === movie.title && + film.year === movie.year ); }; /* Returns the movie object if in ratings */ @@ -132,7 +132,7 @@ function Onboarding(
{ From 80e6a8c38b6d1c880ae2338654a0d21c4929d254 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Mon, 18 May 2020 15:31:52 -0400 Subject: [PATCH 666/822] added if statement to register useEffect, added key prop to recommendations, ratings, watchlist card parent div --- src/components/auth/AuthCheck.js | 42 ++++++++++++++++++++++++++ src/components/auth/Register.js | 20 ++++++------ src/components/dashboard/Explore.js | 2 +- src/components/dashboard/Navigation.js | 5 --- 4 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 src/components/auth/AuthCheck.js diff --git a/src/components/auth/AuthCheck.js b/src/components/auth/AuthCheck.js new file mode 100644 index 0000000..ff8aef8 --- /dev/null +++ b/src/components/auth/AuthCheck.js @@ -0,0 +1,42 @@ +import React, { useEffect } from "react"; +import { connect } from "react-redux"; +import { registerAction, loginAction } from "../../store/actions"; +import { useOktaAuth } from '@okta/okta-react'; +import { useHistory } from "react-router-dom"; + + + + +const AuthCheck = (props) => { + const history = useHistory(); + const { authState, authService } = useOktaAuth(); + + useEffect(() => { + authService.getUser() + .then((info) => { + props.loginAction(authState.accessToken, info.sub, history); + console.log("checking authentication") + }) + .catch(err => console.log("Error fetching User info in UseEffect", err)) + }, ); + + return( +
+

LOADEDING

+
+ ) + +} + +const mapStateToProps = (state) => { + return { + registerSuccess: state.register.success, + userid: state.login.userid, + errorStatus: state.register.error, + }; + }; + + export default connect(mapStateToProps, { registerAction, loginAction })( + AuthCheck + ); + \ No newline at end of file diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f1c37b9..611a0a3 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -56,13 +56,18 @@ const Register = (props) => { //if user already Authenticated, loginAction redirects to to explore page useEffect(() => { + console.log("AUTHHHHHHHHHHHHHHHHHHHHHH", authState); + if(authState.isAuthenticated === true){ authService.getUser() .then((info) => { props.loginAction(authState.accessToken, info.sub, history); console.log("checking authentication") + }) .catch(err => console.log("Error fetching User info in UseEffect", err)) - }, [authState]); + } + + }, ); return (
{ >
- - +

OR

-
-
- Google Icon -
-

Sign up with Google

-
-
+
Facebook Icon
-

Sign up with Facebook

+

Login with Facebook

diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index fd7e948..af25d58 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -83,7 +83,7 @@ function Explore({ "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( -
+
{ name: "Ratings", icon: , }, - { - id: 5, - name: "LogOut", - icon: , - }, ]; const handleDrawerOpen = () => { From bffda8a9ca638be49b17fffbee48fdf78fb2dfad Mon Sep 17 00:00:00 2001 From: Luis PM Date: Mon, 18 May 2020 16:08:34 -0400 Subject: [PATCH 667/822] facebook link redirect fix --- src/components/auth/Register.js | 8 ++++++-- src/components/dashboard/Recommendations.js | 2 +- src/components/dashboard/Watchlist.js | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 611a0a3..0c5a581 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -56,7 +56,11 @@ const Register = (props) => { //if user already Authenticated, loginAction redirects to to explore page useEffect(() => { - console.log("AUTHHHHHHHHHHHHHHHHHHHHHH", authState); + //Auth URL redirect from facebook contains #id_token, if exist login() will authenticate the user + if(window.location.href.indexOf("#id_token") > -1) { + login(); + } + if(authState.isAuthenticated === true){ authService.getUser() .then((info) => { @@ -67,7 +71,7 @@ const Register = (props) => { .catch(err => console.log("Error fetching User info in UseEffect", err)) } - }, ); + }, [authState, authService]); return (
+
+
Date: Mon, 18 May 2020 16:18:57 -0400 Subject: [PATCH 668/822] linter ran --- src/components/dashboard/Explore.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 3dcd2fd..49c7e8d 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -22,8 +22,8 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', - backgroundColor:'black', + boxShadow: "0px 0px 2px 2px black", + backgroundColor: "black", }, }, })); @@ -38,7 +38,7 @@ function Explore({ }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); - + const { authState, authService } = useOktaAuth(); const { accessToken } = authState; @@ -49,7 +49,7 @@ function Explore({ }, [getMoviesAction, userid, ratings, setFilter, accessToken]); // How many movies render - const cardAmount = 25; + const cardAmount = 40; if (isFetching) return ; else @@ -65,9 +65,9 @@ function Explore({ (film) => film.title === movie.title && film.year === movie.year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) @@ -95,10 +95,10 @@ function Explore({ rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } From f82e9540c7516dfc2082b2e8a44f9dd68198c730 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 18 May 2020 16:19:32 -0400 Subject: [PATCH 669/822] adds description to recommendations --- src/components/dashboard/Recommendations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 64f3e1d..e3e9a56 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -84,6 +84,7 @@ function Recommendations({ rated={null} name={movie.title} year={movie.year} + description={movie.description} movie_id={movie.movie_id} image={ !posterURI || From 0316d8e2b45d57c54fa6e14e6d49fe30ad83d181 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 18 May 2020 16:19:55 -0400 Subject: [PATCH 670/822] removed commented styles and ran linter --- src/components/movies/MovieCard.js | 171 ++++++++++------------------- 1 file changed, 56 insertions(+), 115 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 208083e..32511f0 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -50,52 +50,22 @@ const DialogTitle = withStyles(styles)((props) => { const useStyles = makeStyles((theme) => ({ nameModal: { fontSize: "25px", - // paddingBottom: "2%", - - }, - modalBtn: { - // border:'2px solid white', - // height: '250px', - // paddingBottom: '2%', - // display: 'flex', - // justifyContent: 'center', - // alignItems: 'center', - // flexDirection: 'column', }, cardContent: { - // paddingBottom: 0, - // display:'flex', - // justifyContent:'center', - // alignItems:'baseline' - height: '100%', - // display: 'flex', - // justifyContent: 'center', - // alignItems: 'center', - // flexDirection: 'column', - + height: "100%", }, movieImg: { width: "100%", - height: '375px', + height: "375px", opacity: 1, - // display: "block", backfaceVisibility: "hidden", borderRadius: "11px", - objectFit: 'contain', - - // '&:hover':{ - // opacity: 0.3, - // } + objectFit: "contain", }, name: { fontSize: "15px", - textAlign: 'center', - paddingTop: '2%', - // display:'flex', - // justifyContent:'center', - // alignItems:'baseline' - // verticalAlign: 'middle', - + textAlign: "center", + paddingTop: "2%", }, year: { fontSize: "18px", @@ -118,20 +88,15 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "row", }, card: { - // height: "90%", display: "flex", flexDirection: "column", width: "100%", - "&:hover": { - // boxShadow: '0px 0px 2px 2px black', - }, + "&:hover": {}, moreInfo: { display: "flex", flexDirection: "row", }, }, - - cardActions: { fontSize: "10px", padding: 0, @@ -150,26 +115,17 @@ const useStyles = makeStyles((theme) => ({ opacity: 5, }, }, - - movieImgModal: { opacity: 1, display: "block", backfaceVisibility: "hidden", borderRadius: "11px", margin: "auto", - paddingBottom: '1%', - // '&:hover':{ - // opacity: 0.3, - // } + paddingBottom: "1%", }, watchList: { - // fontSize: "10px", - // textAlign: "center", - // padding: '16px', justifyContent: "center", display: "flex", - // margin: 0, }, //modal modal: { @@ -179,30 +135,27 @@ const useStyles = makeStyles((theme) => ({ overflow: "scroll", }, paper: { - // backgroundColor: theme.palette.background.paper, background: "rgb(23, 23, 23, .96)", margin: "auto", - // marginBottom:'auto', width: "55rem", boxShadow: theme.shadows[5], padding: theme.spacing(0, 4, 3), color: "white", }, DeleteMoviefromWatch: { - backgroundColor: 'white', - cursor: 'pointer', - + backgroundColor: "white", + cursor: "pointer", }, movieInfoModal: { display: "flex", }, genresModal: { - fontStyle: 'italic', + fontStyle: "italic", paddingTop: "3%", }, watchStarsModal: { display: "flex", - justifyContent: "center" + justifyContent: "center", }, cardActionsModal: { justifyContent: "center", @@ -219,28 +172,19 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", justifyContent: "space-evenly", }, - // videoWrapper:{ - // position:'relative', - // height:0, - // paddingBottom:'56.25%', - // }, [theme.breakpoints.down("xs")]: { name: { - padding: '0', + padding: "0", }, - // movieImg:{ - // height:'80%', - // }, movieImg: { - height: '200px', - width: '100%', + height: "200px", + width: "100%", }, movieImgModal: { width: "80%", }, paper: { width: "17rem", - // marginTop: "1%", }, movieInfoModal: { flexDirection: "column", @@ -248,10 +192,6 @@ const useStyles = makeStyles((theme) => ({ starsModal: { fontSize: "5vw", }, - // trailerModal:{ - // width:'auto', - // height:'auto', - // }, }, })); @@ -275,7 +215,7 @@ function MovieCard({ numRatings, setNumRatings, deleteMode, - setDeleteMode + setDeleteMode, }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -323,6 +263,7 @@ function MovieCard({ console.log(newRating); ratingAction(userid, newRating, accessToken); setYourRating(true); + window.location.reload(true); }; const handleClick = () => { /* Adds movie to the POST request */ @@ -340,8 +281,7 @@ function MovieCard({ setNumRatings({ ...numRatings, num: numRatings.num + 1 }); console.log("number of ratings is " + numRatings.num); console.log("openalert"); - } - + }; return (
@@ -382,12 +322,8 @@ function MovieCard({

{name}

{year}

-

- {description} -

-

- {genres} -

+

{description}

+

{genres}

{page !== "Onboarding" && page !== "watchlist" ? ( @@ -403,29 +339,32 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} + "" + )} {page === "watchlist" ? ( //
setDeleteMode(!deleteMode)}> - setDeleteMode(!deleteMode)} > + setDeleteMode(!deleteMode)} + > {deleteMode && ( + )} - //
) : ( - "" - )} + //
+ "" + )} {page === "Onboarding" ? ( ) : ( - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - onClick={handleClose} - /> - )} + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + onClick={handleClose} + /> + )}
{page !== "Onboarding" ? ( - ) : ( - "" - )} + "" + )}
From 249340eb046d3733d42526c0963dd4058fa02fce Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 18 May 2020 16:20:08 -0400 Subject: [PATCH 671/822] ran linter --- src/components/dashboard/Ratings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index feea01b..416af42 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -13,7 +13,7 @@ import { GridList } from "@material-ui/core/"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ - cardGrid: { + cardGrid: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), paddingRight: theme.spacing(2), @@ -21,8 +21,8 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - boxShadow: '0px 0px 2px 2px black', - backgroundColor:'black', + boxShadow: "0px 0px 2px 2px black", + backgroundColor: "black", }, }, })); @@ -44,7 +44,7 @@ function Ratings({ setFilter(""); // Returns the ratings getRatingAction(userid, accessToken); - }, [getRatingAction, userid, setFilter]); + }, [getRatingAction, userid, setFilter, accessToken]); if (isFetching) return ; else From e4180a20fafe72bb45eb3337c3ba27887fb38915 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 18 May 2020 16:24:56 -0400 Subject: [PATCH 672/822] removed unused import and ran linter --- src/components/dashboard/Navigation.js | 94 ++++++++++++++------------ 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 17e7712..4e78cbb 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -41,7 +41,6 @@ import SearchRoundedIcon from "@material-ui/icons/SearchRounded"; import ThumbUpRoundedIcon from "@material-ui/icons/ThumbUpRounded"; import PlaylistAddCheckRoundedIcon from "@material-ui/icons/PlaylistAddCheckRounded"; import GradeRoundedIcon from "@material-ui/icons/GradeRounded"; -import ExitToAppRoundedIcon from "@material-ui/icons/ExitToAppRounded"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const drawerWidth = 240; @@ -52,8 +51,8 @@ const useStyles = makeStyles((theme) => ({ margin: "auto", backgroundColor: "#505050", }, - userIcon:{ -color:'white', + userIcon: { + color: "white", }, [theme.breakpoints.down("xs")]: { searchContainer: { @@ -70,7 +69,7 @@ color:'white', search: { position: "relative", borderRadius: theme.shape.borderRadius, - backgroundColor: '#ffffff', + backgroundColor: "#ffffff", width: "100%", [theme.breakpoints.down("sm")]: { width: "auto", @@ -87,11 +86,11 @@ color:'white', display: "flex", alignItems: "center", justifyContent: "center", - color: '#505050', + color: "#505050", }, inputRoot: { color: "#505050", - width: '100%', + width: "100%", }, inputInput: { padding: theme.spacing(1, 1, 1, 7), @@ -107,8 +106,8 @@ color:'white', flexDirection: "column", }, appBar: { - backgroundColor: '#1c1c1b', - transition: theme.transitions.create(['margin', 'width'], { + backgroundColor: "#1c1c1b", + transition: theme.transitions.create(["margin", "width"], { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), @@ -129,11 +128,11 @@ color:'white', drawer: { width: drawerWidth, flexShrink: 0, - backgroundColor:'#212120', + backgroundColor: "#212120", }, drawerPaper: { width: drawerWidth, - backgroundColor:'#212120', + backgroundColor: "#212120", }, drawerHeader: { display: "flex", @@ -174,11 +173,9 @@ color:'white', }, })); - const Navigation = (props) => { //OKTA useOKTA AUTH const { authState, authService } = useOktaAuth(); - const [userInfo, setUserInfo] = useState(null); const logout = async () => authService.logout("/"); @@ -261,53 +258,60 @@ const Navigation = (props) => { + })} + > + edge="start" + className={clsx(classes.menuButton, open && classes.hide)} + > - + Groa Logo + onClose={handleClose} + > + component="a" + href={`/${props.userid}/ratings`} + > Ratings + component="a" + href={`/${props.userid}/upload`} + > Upload - + Logout @@ -318,8 +322,8 @@ const Navigation = (props) => {
{
+ mouseEvent="onMouseDown" + touchEvent="onTouchStart" + onClickAway={handleClickAway} + > + }} + >
{theme.direction === "ltr" ? ( ) : ( - - )} + + )}
@@ -359,8 +365,9 @@ const Navigation = (props) => { + component="a" + href={`/${props.userid}/${linkObject.name.toLowerCase()}`} + > {linkObject.icon} @@ -372,7 +379,8 @@ const Navigation = (props) => {
+ })} + >
From dfac880b0d8e1457aaa1bdb3cfcb3d0d1ad4556e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Mon, 18 May 2020 17:03:26 -0400 Subject: [PATCH 673/822] removes console log and reload --- src/components/movies/MovieCard.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 32511f0..ade86c2 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -259,11 +259,8 @@ function MovieCard({ movie_id: movie.movie_id, rating: newValue, }; - - console.log(newRating); ratingAction(userid, newRating, accessToken); setYourRating(true); - window.location.reload(true); }; const handleClick = () => { /* Adds movie to the POST request */ From 49e97f69ed01b8534b3f444a482bafba48538319 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Mon, 18 May 2020 14:40:28 -0700 Subject: [PATCH 674/822] update descpriton on recommenations page --- src/components/auth/Onboarding.js | 7 -- src/components/dashboard/Recommendations.js | 1 + src/components/movies/MovieCard.js | 89 ++++++++++++++------- 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 3ed01f3..e7dc1b9 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -26,9 +26,6 @@ const useStyles = makeStyles((theme) => ({ paddingRight: theme.spacing(2), paddingLeft: theme.spacing(2), }, - Link: { - marginBottom: "2%", - }, movieCard: { color: 'white', "&:hover": { @@ -68,10 +65,6 @@ function Onboarding( query: "", }); - const sendChange = (query) => { - props.setFilter(query); - }; - const handleClickStar = () => { setOpenAlert(true); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 744c25f..6728a7a 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -84,6 +84,7 @@ function Recommendations({ rated={null} name={movie.title} year={movie.year} + description={movie.description} movie_id={movie.movie_id} image={ !posterURI || diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 208083e..7d8047b 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -196,10 +196,17 @@ const useStyles = makeStyles((theme) => ({ movieInfoModal: { display: "flex", }, + movieContentDiv: { + margin: 'auto', + }, genresModal: { fontStyle: 'italic', paddingTop: "3%", }, + actionButtons: { + display: 'flex', + justifyContent:'center', + }, watchStarsModal: { display: "flex", justifyContent: "center" @@ -371,14 +378,14 @@ function MovieCard({ <>
-
- Random Movie poster as a placeholder. -
-
+ + Random Movie poster as a placeholder. + +

{name}

{year}

@@ -389,27 +396,51 @@ function MovieCard({ {genres}

- {page !== "Onboarding" && page !== "watchlist" ? ( - - - - ) : ( - "" - )} +
+ {page !== "Onboarding" && page !== "watchlist" ? ( + + + + ) : ( + "" + )} + + {page === "Explore" ? ( + + + + ) : ( + "" + )} +
{page === "watchlist" ? ( //
setDeleteMode(!deleteMode)}> setDeleteMode(!deleteMode)} > From f76d3e1d18c0768fc8499a8502cec327fc665925 Mon Sep 17 00:00:00 2001 From: Mike Sinnema Date: Tue, 19 May 2020 12:09:06 -0700 Subject: [PATCH 675/822] added codeclimate.yml for code climate scores --- .codeclimate.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..792ba67 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,21 @@ +# .codeclimate.yml +version: "2" +checks: + # Disable checks for similar code. + # Because this creates too many false positives. + similar-code: + enabled: false + # Increase the number of lines allowed for a method. + # Because this is more reasonable for JavaScript. + method-lines: + config: + threshold: 50 +exclude_patterns: + - "tests/" + - "spec/" + - "**/*.spec.js" + - "**/*.spec.jsx" + - "**/*.spec.ts" + - "**/*.spec.tsx" + - "**/vendor/" + - "**/node_modules/" \ No newline at end of file From dd435d00f1cb578c4ad02888538899b9e77f204e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 19 May 2020 12:49:47 -0700 Subject: [PATCH 676/822] recommendations page has 'not interested' btn --- src/components/dashboard/Explore.js | 8 +++-- src/components/dashboard/Recommendations.js | 2 ++ src/components/dashboard/Watchlist.js | 2 +- src/components/movies/MovieCard.js | 32 +++++++++++++------ src/store/actions/index.js | 4 ++- src/store/actions/notWatchListAction.js | 29 +++++++++++++++++ src/store/reducers/index.js | 4 ++- src/store/reducers/notWatchListReducer.js | 35 +++++++++++++++++++++ src/utils/axiosWithAuth.js | 2 +- 9 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 src/store/actions/notWatchListAction.js create mode 100644 src/store/reducers/notWatchListReducer.js diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index fdd6e78..17c3eae 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -1,7 +1,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { getMoviesAction, setFilter } from "../../store/actions/index.js"; +import { getMoviesAction, setFilter, notWatchListAction } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -35,6 +35,7 @@ function Explore({ searchTerm, setFilter, ratings, + notWatchListAction }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -46,7 +47,9 @@ function Explore({ setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter, accessToken]); + notWatchListAction(userid, accessToken); + + }, [getMoviesAction,notWatchListAction, userid, ratings, setFilter, accessToken]); // How many movies render const cardAmount = 25; @@ -124,4 +127,5 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps, { getMoviesAction, setFilter, + notWatchListAction })(Explore); diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 6728a7a..6feb107 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -86,6 +86,8 @@ function Recommendations({ year={movie.year} description={movie.description} movie_id={movie.movie_id} + trailer={movie.trailer_url} + page={'Recommendations'} image={ !posterURI || posterURI === "None" || diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 6e0614c..d8a0a8e 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -43,7 +43,7 @@ function Watchlist({ setFilter, movies, }) { - console.log('movies', movies) + // console.log('movies', movies) //OKTA AUTH const { authState } = useOktaAuth(); const { accessToken } = authState; diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 7d8047b..10525f0 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { connect } from "react-redux"; -import { ratingAction, addToWatchlistAction } from "../../store/actions"; +import { ratingAction, addToWatchlistAction, notWatchListAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid @@ -282,7 +282,9 @@ function MovieCard({ numRatings, setNumRatings, deleteMode, - setDeleteMode + setDeleteMode, + notWatchListAction, + notwatchlist, }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -293,10 +295,15 @@ function MovieCard({ const [rating, setRating] = useState(0); /* Used for dynamically rendering the "Add to watchlist" button and if it's disabled */ const [added, setAdded] = useState(false); + //to remove movie user not interested in + const [ removed, setRemoved] = useState(false); /* This checks if the movie is in the watchlist */ const inWatchlist = watchlist.some( (movie) => movie.name === name && movie.year === year ); + const notInWatchlist = notwatchlist.some( + (movie) => movie.name === name && movie.year === year + ); const inRatings = ratings.some( (movie) => movie.name === name && movie.year === year ); @@ -337,6 +344,11 @@ function MovieCard({ setAdded(true); }; + const handleClickRemove = () => { + notWatchListAction(userid, movie, accessToken); + setRemoved(true); + } + const multiFunctions = () => { handleClose(); handleClickStar(); @@ -349,7 +361,6 @@ function MovieCard({ console.log("openalert"); } - return (
@@ -419,20 +430,18 @@ function MovieCard({ "" )} - {page === "Explore" ? ( + {page === "Recommendations" ? ( @@ -516,14 +525,17 @@ function MovieCard({ ); } const mapStateToProps = (state) => { + // console.log('this is the res of notwatchlist', state) + return { userid: state.login.userid, ratingError: state.rating.error, watchlist: state.watchlist.movies, watchlistError: state.watchlist.error, ratings: state.rating.movies, + notwatchlist: state.notwatchlist.movies }; }; -export default connect(mapStateToProps, { ratingAction, addToWatchlistAction })( +export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction })( MovieCard ); diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 3a8cd95..a3321e3 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -10,6 +10,7 @@ import { } from "./watchlistActions.js"; import { getMoviesAction } from "./movieAction" import { setFilter } from "./filterActions.js"; +import {notWatchListAction} from './notWatchListAction.js'; export { @@ -24,5 +25,6 @@ export { removeFromWatchlistAction, getWatchlistAction, getMoviesAction, - setFilter + setFilter, + notWatchListAction }; diff --git a/src/store/actions/notWatchListAction.js b/src/store/actions/notWatchListAction.js new file mode 100644 index 0000000..52c30a0 --- /dev/null +++ b/src/store/actions/notWatchListAction.js @@ -0,0 +1,29 @@ +import axiosWithAuth from "../../utils/axiosWithAuth.js"; +export const ADDING_NOTWATCHLIST_START = "FETCHING_ADDING_START"; +export const ADDING_NOTWATCHLIST_SUCCESS = + "ADDING_NOTWATCHLIST_SUCCESS"; +export const ADDING_NOTWATCHLIST_FAIL = "ADDING_NOTWATCHLIST_FAIL"; + +export function notWatchListAction(id, movie, token) { + return(dispatch) => { + dispatch({ + type: ADDING_NOTWATCHLIST_START, + }); + axiosWithAuth(token) + .post(`/${id}/notwatchlist`, movie) + .then((res) => { + console.log('this is the res of notwatchlist', res) + dispatch({ + type: ADDING_NOTWATCHLIST_SUCCESS, + payload:res.data, + }); + }) + .catch((err) => { + console.log("ERROR:", err); + dispatch({ + type: ADDING_NOTWATCHLIST_FAIL, + payload: err + }) + }) + } +} \ No newline at end of file diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index dc83c0e..1ff4af2 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -7,6 +7,7 @@ import { upload } from './uploadReducer'; import { filter } from './filterReducer'; import { watchlist } from './watchlistReducer'; import { movie } from './movieReducer'; +import { notwatchlist } from './notWatchListReducer'; export const reducer = combineReducers({ login, @@ -16,5 +17,6 @@ export const reducer = combineReducers({ upload, movie, filter, - watchlist + watchlist, + notwatchlist, }); \ No newline at end of file diff --git a/src/store/reducers/notWatchListReducer.js b/src/store/reducers/notWatchListReducer.js new file mode 100644 index 0000000..4ef5f74 --- /dev/null +++ b/src/store/reducers/notWatchListReducer.js @@ -0,0 +1,35 @@ +import { + ADDING_NOTWATCHLIST_START, + ADDING_NOTWATCHLIST_SUCCESS, + ADDING_NOTWATCHLIST_FAIL, +} from "../actions/notWatchListAction"; + +const initialState = { + movies:[], + isAdding: false, + error: "", +}; + +export const notwatchlist = (state = initialState, action) => { + switch (action.type) { + case ADDING_NOTWATCHLIST_START: + return { + ...state, + isAdding: true, + }; + case ADDING_NOTWATCHLIST_SUCCESS: + return { + ...state, + isAdding: false, + // movies: action.payload, + }; + case ADDING_NOTWATCHLIST_FAIL: + return { + ...state, + isAdding: false, + error: action.payload, + }; + default: + return state; + } +} \ No newline at end of file diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c6b489..62fe87f 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: process.env.REACT_APP_BASEURL + baseURL: "http://localhost:5000/api/users" }) } export default axiosWithAuth; \ No newline at end of file From ff7a9fc46eedc1030ebc4c00241ae8143d6a1d7a Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 19 May 2020 13:02:36 -0700 Subject: [PATCH 677/822] update baseURL back to live server --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 62fe87f..b86a935 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "http://localhost:5000/api/users" + baseURL: "process.env.REACT_APP_BASEURL" }) } export default axiosWithAuth; \ No newline at end of file From 8f93ff9c85ff536a1b9cb7a83d3568ec481d8b72 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 19 May 2020 13:03:03 -0700 Subject: [PATCH 678/822] updated base url --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index b86a935..3c6b489 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: "process.env.REACT_APP_BASEURL" + baseURL: process.env.REACT_APP_BASEURL }) } export default axiosWithAuth; \ No newline at end of file From 45666a09717d73ff8a3cd856235dd8c4aaa52776 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 19 May 2020 13:15:16 -0700 Subject: [PATCH 679/822] on click not interested, close moviecard --- src/components/movies/MovieCard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index db46777..0e0e365 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -229,7 +229,6 @@ function MovieCard({ //OKTA AUTH const { authState, authService } = useOktaAuth(); const { accessToken } = authState; - const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); @@ -285,6 +284,7 @@ function MovieCard({ const handleClickRemove = () => { notWatchListAction(userid, movie, accessToken); setRemoved(true); + handleClose(); } const multiFunctions = () => { From d339636b1f0d1c5bf4d1e8fc33ac904f00a98fca Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 19 May 2020 16:25:18 -0400 Subject: [PATCH 680/822] after login, user redirected to onboarding flow if less than 6 movies rated --- src/App.js | 1 - src/store/actions/loginAction.js | 2 +- src/utils/axiosWithAuth.js | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index a362f81..ff90156 100644 --- a/src/App.js +++ b/src/App.js @@ -20,7 +20,6 @@ import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing import { ifDev } from "./utils/removeAttribute.js"; import oktaConfig from "./config/oktaConfig"; -import { useOktaAuth } from "@okta/okta-react"; // config imports import reactGAinitialization from "./config/analytics.js"; diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index dfc3394..8868aa4 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -23,7 +23,7 @@ export function loginAction(token, okta_id, history) { type: FETCHING_WATCHLIST_SUCCESS, payload: res.data.watchlist }); - if(res.data.newUser === true){ + if(res.data.ratings.length < 6){ history.push(`/${res.data.user_id}/onboardingplateform`); }else { history.push(`/${res.data.user_id}/explore`); diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c6b489..19229fe 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: process.env.REACT_APP_BASEURL + baseURL: 'http://localhost:8080/api/users', }) } export default axiosWithAuth; \ No newline at end of file From 37ae1ac4590222c688ac1b65b417c7e71739c98d Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 19 May 2020 16:26:43 -0400 Subject: [PATCH 681/822] axios baseURL updated to env variable instead of localhost --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 19229fe..3c6b489 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: 'http://localhost:8080/api/users', + baseURL: process.env.REACT_APP_BASEURL }) } export default axiosWithAuth; \ No newline at end of file From 8adbb32195a240fa94bf2ccda47e6d3dc0934d87 Mon Sep 17 00:00:00 2001 From: Luis PM Date: Tue, 19 May 2020 16:34:00 -0400 Subject: [PATCH 682/822] added <=6 total ratings for onboarding flow to complete at 6 ratings exact --- src/store/actions/loginAction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/actions/loginAction.js b/src/store/actions/loginAction.js index 8868aa4..10f26bf 100644 --- a/src/store/actions/loginAction.js +++ b/src/store/actions/loginAction.js @@ -23,7 +23,7 @@ export function loginAction(token, okta_id, history) { type: FETCHING_WATCHLIST_SUCCESS, payload: res.data.watchlist }); - if(res.data.ratings.length < 6){ + if(res.data.ratings.length <= 6){ history.push(`/${res.data.user_id}/onboardingplateform`); }else { history.push(`/${res.data.user_id}/explore`); From fd1c20d1ed7e202e3463195158d22290165c0d36 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 17:18:14 -0400 Subject: [PATCH 683/822] created search action --- src/store/actions/searchAction.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/store/actions/searchAction.js diff --git a/src/store/actions/searchAction.js b/src/store/actions/searchAction.js new file mode 100644 index 0000000..00f0b79 --- /dev/null +++ b/src/store/actions/searchAction.js @@ -0,0 +1,27 @@ +import axiosWithAuth from "../../utils/axiosWithAuth.js"; +export const START_SEARCH_START = "START_SEARCH_START"; +export const START_SEARCH_SUCCESS = "START_SEARCH_SUCCESS"; +export const START_SEARCH_FAIL = "START_SEARCH_FAIL"; + +export function searchAction(id, query, token) { + return (dispatch) => { + dispatch({ + type: START_SEARCH_START, + }); + axiosWithAuth(token) + .post(`/${id}/search`, query) + .then((res) => { + dispatch({ + type: START_SEARCH_SUCCESS, + payload: res.data, + }); + }) + .catch((err) => { + console.log("Error: ", err); + dispatch({ + type: START_SEARCH_FAIL, + payload: err, + }); + }); + }; +} From 50c448a1bc511df18dac9e772574e289a0d7210c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 17:18:21 -0400 Subject: [PATCH 684/822] created search reducer --- src/store/reducers/searchReducer.js | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/store/reducers/searchReducer.js diff --git a/src/store/reducers/searchReducer.js b/src/store/reducers/searchReducer.js new file mode 100644 index 0000000..cdc2d5f --- /dev/null +++ b/src/store/reducers/searchReducer.js @@ -0,0 +1,35 @@ +import { + START_SEARCH_START, + START_SEARCH_SUCCESS, + START_SEARCH_FAIL, +} from "../actions/searchAction.js"; + +const initialState = { + queries: [], + isFetching: false, + error: "", +}; + +export const search = (state = initialState, action) => { + switch (action.type) { + case START_SEARCH_START: + return { + ...state, + isFetching: true, + }; + case START_SEARCH_SUCCESS: + return { + ...state, + isFetching: false, + queries: action.payload, + }; + case START_SEARCH_FAIL: + return { + ...state, + isFetching: false, + error: action.payload, + }; + default: + return state; + } +}; From 5919919dead5faa5afac0b71685adfdd37a9e487 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:01:57 -0400 Subject: [PATCH 685/822] ran linter and fixed typo --- src/App.js | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/App.js b/src/App.js index a362f81..5e7b925 100644 --- a/src/App.js +++ b/src/App.js @@ -11,10 +11,10 @@ import DataUpload from "./components/auth/DataUpload"; import Watchlist from "./components/dashboard/Watchlist.js"; import Ratings from "./components/dashboard/Ratings"; import Explore from "./components/dashboard/Explore.js"; -import Onboarding from './components/auth/Onboarding'; -import SearchBar from './components/auth/SearchBar'; -import OnboardingPlateform from './components/auth/OnboardingPlateform'; -import PostOnboarding from './components/auth/PostOnboarding'; +import Onboarding from "./components/auth/Onboarding"; +import SearchBar from "./components/auth/SearchBar"; +import OnboardingPlatform from "./components/auth/OnboardingPlatform"; +import PostOnboarding from "./components/auth/PostOnboarding"; import PrivacyPolicy from "./components/layout/privacy-policy.js"; // for testing @@ -91,7 +91,7 @@ function App() { "/:user_id/watchlist", "/:user_id/explore", "/:user_id/upload", - "/:user_id/ratings" + "/:user_id/ratings", ]} component={Navigation} /> @@ -108,19 +108,14 @@ function App() { /> - + Date: Tue, 19 May 2020 19:02:06 -0400 Subject: [PATCH 686/822] fixed typo --- ...dingPlateform.js => OnboardingPlatform.js} | 88 ++++++++++--------- 1 file changed, 46 insertions(+), 42 deletions(-) rename src/components/auth/{OnboardingPlateform.js => OnboardingPlatform.js} (61%) diff --git a/src/components/auth/OnboardingPlateform.js b/src/components/auth/OnboardingPlatform.js similarity index 61% rename from src/components/auth/OnboardingPlateform.js rename to src/components/auth/OnboardingPlatform.js index 9636bb0..c2322c1 100644 --- a/src/components/auth/OnboardingPlateform.js +++ b/src/components/auth/OnboardingPlatform.js @@ -5,86 +5,90 @@ import { Link } from "react-router-dom"; //img import OnboardingImg from "../../img/happy-running-person.png"; //material-ui -import { makeStyles } from '@material-ui/core/styles'; +import { makeStyles } from "@material-ui/core/styles"; const useStyles = makeStyles((theme) => ({ root: { // margin: '0 auto', - display: 'flex', - background: '#212120', - padding: '2%', + display: "flex", + background: "#212120", + padding: "2%", }, onboardingPlateformImg: { - width: '40%', - padding: '3%', + width: "40%", + padding: "3%", }, onboardingText: { - display: 'flex', - justifyContent: 'center', - flexDirection: 'column', - padding: '3%', - color: 'white', - width:'60%', + display: "flex", + justifyContent: "center", + flexDirection: "column", + padding: "3%", + color: "white", + width: "60%", }, onboardingh1: { - fontSize: '35px', - padding: '2%', + fontSize: "35px", + padding: "2%", }, onboardingp1: { - color: '#00E6BC', - padding: '2%', - fontSize: '20px', + color: "#00E6BC", + padding: "2%", + fontSize: "20px", }, onboardingp2: { - padding: '2%', - fontSize: '20px', + padding: "2%", + fontSize: "20px", }, onboardingLink: { - textAlign: 'center', - fontSize: '25px', - padding: '2%', + textAlign: "center", + fontSize: "25px", + padding: "2%", }, onboardingBut: { - backgroundColor: '#00E6BC', - width: '100%', - color: 'white', - padding: '2%', - borderRadius: '4px', - '&:hover': { - backgroundColor: 'white', - color: '#00E6BC', + backgroundColor: "#00E6BC", + width: "100%", + color: "white", + padding: "2%", + borderRadius: "4px", + "&:hover": { + backgroundColor: "white", + color: "#00E6BC", }, }, [theme.breakpoints.down("xs")]: { root: { - flexDirection: 'column', + flexDirection: "column", }, onboardingPlateformImg: { - display: 'block', - marginLeft: 'auto', - marginRight: 'auto', + display: "block", + marginLeft: "auto", + marginRight: "auto", width: "60%", - } + }, }, })); -function OnboardingPlateform({ userid }) { +function OnboardingPlatform({ userid }) { const classes = useStyles(); return (
- onboarding girl jumping + onboarding girl jumping

You're Almost There.

Help Groa personalize your recommendations! Groa works better when you tell us what you like. -

+

Rate six movies on a scale from 1 to 5 and we’ll get you your - personalized recommendations in no time! Train Groa to be your personal - movie AI! -

+ personalized recommendations in no time! Train Groa to be your + personal movie AI! +

@@ -105,4 +109,4 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps, { setFilter, -})(OnboardingPlateform); +})(OnboardingPlatform); From 26da1296b4a330393d8bd90cec14541d266b660f Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:02:24 -0400 Subject: [PATCH 687/822] removed unused code --- src/components/auth/Onboarding.js | 189 +++++++++++++++--------------- 1 file changed, 92 insertions(+), 97 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index f0734ae..1b7410a 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -1,6 +1,10 @@ import React, { useEffect, useState } from "react"; import { connect } from "react-redux"; -import { getMoviesAction, getRatingAction, setFilter } from "../../store/actions/index.js"; +import { + getMoviesAction, + getRatingAction, + setFilter, +} from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; // children components @@ -16,8 +20,7 @@ import MuiAlert from "@material-ui/lab/Alert"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; -import { Redirect } from 'react-router'; - +import { Redirect } from "react-router"; const useStyles = makeStyles((theme) => ({ cardGrid: { @@ -30,10 +33,10 @@ const useStyles = makeStyles((theme) => ({ marginBottom: "2%", }, movieCard: { - color: 'white', + color: "white", "&:hover": { - boxShadow: '0px 0px 2px 2px black', - backgroundColor: 'black', + boxShadow: "0px 0px 2px 2px black", + backgroundColor: "black", }, }, })); @@ -42,18 +45,17 @@ function Alert(props) { return ; } -function Onboarding( - { - isFetching, - movies, - userid, - getMoviesAction, - searchTerm, - setFilter, - ratings, - }, - props -) { +function Onboarding({ + isFetching, + movies, + userid, + getMoviesAction, + searchTerm, + setFilter, + ratings, + queries, + isSearching, +}) { // console.log("movies", movies); const classes = useStyles(); //for okta @@ -63,18 +65,9 @@ function Onboarding( const [openAlert, setOpenAlert] = useState(false); let [numRatings, setNumRatings] = useState({ num: 0 }); const screenWidth = widthFinder(window.innerWidth); - //for search bar - const [query, setQuery] = useState({ - query: "", - }); - - const sendChange = (query) => { - props.setFilter(query); - }; const handleClickStar = () => { setOpenAlert(true); - }; const handleCloseStar = (event, reason) => { if (reason === "clickaway") { @@ -87,83 +80,84 @@ function Onboarding( setFilter(""); // Returns the movies getMoviesAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter,]); + }, [getMoviesAction, userid, ratings, setFilter, accessToken]); // How many movies render const cardAmount = 25; if (isFetching) return ; - else if (numRatings.num >= 13) return - else return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { + else if (numRatings.num >= 13) return ; + else + return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return ( + film.primary_title === movie.primary_title && + film.start_year === movie.start_year + ); + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- + -
- ); - })} -
- - - You have successfully rated this movie! - - -
- ); + ? unsplashUrl + : moviePoster + } + handleClickStar={handleClickStar} + numRatings={numRatings} + setNumRatings={setNumRatings} + /> +
+ ); + })} + + + + You have successfully rated this movie! + + +
+ ); } const mapStateToProps = (state) => { @@ -176,11 +170,12 @@ const mapStateToProps = (state) => { watchlist: state.watchlist.movies, ratings: state.rating.movies, ratingsError: state.rating.error, + queries: state.search.queries, + isSearching: state.search.isSearching, }; }; export default connect(mapStateToProps, { getMoviesAction, setFilter, - getRatingAction + getRatingAction, })(Onboarding); - From f7613ade6d3aa3fc7fb95b3168bcbdb27fe64cd6 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:02:57 -0400 Subject: [PATCH 688/822] added depencency to useEffect --- src/components/auth/PostOnboarding.js | 218 ++++++++++++++------------ 1 file changed, 115 insertions(+), 103 deletions(-) diff --git a/src/components/auth/PostOnboarding.js b/src/components/auth/PostOnboarding.js index effc5a4..0c93783 100644 --- a/src/components/auth/PostOnboarding.js +++ b/src/components/auth/PostOnboarding.js @@ -1,129 +1,141 @@ import React, { useEffect } from "react"; import { connect } from "react-redux"; import { - getMoviesAction, - setFilter, - recommendationAction, + getMoviesAction, + setFilter, + recommendationAction, } from "../../store/actions"; import { Link } from "react-router-dom"; //img import PostOnboardingImg from "../../img/post-onboarding-man.png"; //material-ui -import { makeStyles } from '@material-ui/core/styles'; +import { makeStyles } from "@material-ui/core/styles"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const useStyles = makeStyles((theme) => ({ + root: { + display: "flex", + background: "#212120", + padding: "2%", + }, + PostOnboardingImg: { + width: "50%", + padding: "3%", + }, + onboardingText: { + display: "flex", + justifyContent: "center", + flexDirection: "column", + padding: "3%", + color: "#FFFFFF", + }, + onboardingh1: { + fontSize: "35px", + padding: "2%", + }, + onboardingp1: { + color: "#00E6BC", + padding: "2%", + fontSize: "20px", + }, + onboardingp2: { + padding: "2%", + fontSize: "20px", + }, + onboardingLink: { + textAlign: "center", + fontSize: "25px", + padding: "2%", + }, + onboardingBut: { + backgroundColor: "#00E6BC", + width: "100%", + color: "#FFFFFF", + padding: "2%", + borderRadius: "4px", + "&:hover": { + backgroundColor: "white", + color: "#00E6BC", + }, + }, + [theme.breakpoints.down("xs")]: { root: { - display: 'flex', - background: '#212120', - padding: '2%', + flexDirection: "column", }, PostOnboardingImg: { - width: '50%', - padding: '3%', - }, - onboardingText: { - display: 'flex', - justifyContent: 'center', - flexDirection: 'column', - padding: '3%', - color: '#FFFFFF', - }, - onboardingh1: { - fontSize: '35px', - padding: '2%', - }, - onboardingp1: { - color: '#00E6BC', - padding: '2%', - fontSize: '20px', - }, - onboardingp2: { - padding: '2%', - fontSize: '20px', - }, - onboardingLink: { - textAlign: 'center', - fontSize: '25px', - padding: '2%', - }, - onboardingBut: { - backgroundColor: '#00E6BC', - width: '100%', - color: '#FFFFFF', - padding: '2%', - borderRadius: '4px', - '&:hover': { - backgroundColor: 'white', - color: '#00E6BC', - }, - }, - [theme.breakpoints.down("xs")]: { - root: { - flexDirection: 'column' - }, - PostOnboardingImg: { - display: 'block', - marginLeft: 'auto', - marginRight: 'auto', - width: "60%", - } + display: "block", + marginLeft: "auto", + marginRight: "auto", + width: "60%", }, + }, })); function PostOnboarding({ - userid, - recommendationAction, + userid, + recommendationAction, + getMoviesAction, + setFilter, + ratings, +}) { + const classes = useStyles(); + //for okta + const { authState } = useOktaAuth(); + const { accessToken } = authState; + //to obtain recommendations from onboarding questionaire + useEffect(() => { + setFilter(""); + // Returns the movies + getMoviesAction(userid, accessToken); + // returns a list of recommendations to start the recommendations page + recommendationAction(userid, accessToken); + }, [ getMoviesAction, - setFilter, + userid, ratings, -}) { - const classes = useStyles(); - //for okta - const { authState } = useOktaAuth(); - const { accessToken } = authState; - //to obtain recommendations from onboarding questionaire - useEffect(() => { - setFilter(""); - // Returns the movies - getMoviesAction(userid, accessToken); - // returns a list of recommendations to start the recommendations page - recommendationAction(userid, accessToken); - }, [getMoviesAction, userid, ratings, setFilter, recommendationAction]); - // How many movies render - const cardAmount = 25; - return ( -
- onboarding boy jumping -
-

Great Job!

-

- You've come so far! -

-

- Check out your personalized Groa recommendations -

- - - -
-
- ); + setFilter, + recommendationAction, + accessToken, + ]); + // How many movies render + const cardAmount = 25; + return ( +
+ onboarding boy jumping +
+

Great Job!

+

You've come so far!

+

+ Check out your personalized Groa recommendations +

+ + + +
+
+ ); } const mapStateToProps = (state) => { - return { - userid: state.login.userid, - isFetching: state.movie.isFetching, - movies: state.movie.movies, - moviesError: state.movie.error, - searchTerm: state.filter.searchTerm, - watchlist: state.watchlist.movies, - ratings: state.rating.movies, - }; + return { + userid: state.login.userid, + isFetching: state.movie.isFetching, + movies: state.movie.movies, + moviesError: state.movie.error, + searchTerm: state.filter.searchTerm, + watchlist: state.watchlist.movies, + ratings: state.rating.movies, + }; }; export default connect(mapStateToProps, { - getMoviesAction, - recommendationAction, - setFilter, + getMoviesAction, + recommendationAction, + setFilter, })(PostOnboarding); From ce8c0c71c7c62b132827b7b4cb4f9ef896039a9c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:03:52 -0400 Subject: [PATCH 689/822] removed duplicate code --- src/components/dashboard/Navigation.js | 79 ++------------------------ 1 file changed, 4 insertions(+), 75 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 4e78cbb..47d4452 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -8,9 +8,8 @@ import { import GroaLogo from "../../img/groa-logo-nav.png"; //for search bar +import SearchBar from "../auth/SearchBar.js"; import { makeStyles, useTheme } from "@material-ui/core/styles"; -import SearchIcon from "@material-ui/icons/Search"; -import InputBase from "@material-ui/core/InputBase"; //for the navbar import clsx from "clsx"; @@ -46,11 +45,6 @@ import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const drawerWidth = 240; const useStyles = makeStyles((theme) => ({ - searchContainer: { - width: "40%", - margin: "auto", - backgroundColor: "#505050", - }, userIcon: { color: "white", }, @@ -66,40 +60,9 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "center", }, }, - search: { - position: "relative", - borderRadius: theme.shape.borderRadius, - backgroundColor: "#ffffff", - width: "100%", - [theme.breakpoints.down("sm")]: { - width: "auto", - }, - }, appBarTop: { backgroundColor: "#5c5b5b", }, - searchIcon: { - width: theme.spacing(7), - height: "100%", - position: "absolute", - pointerEvents: "none", - display: "flex", - alignItems: "center", - justifyContent: "center", - color: "#505050", - }, - inputRoot: { - color: "#505050", - width: "100%", - }, - inputInput: { - padding: theme.spacing(1, 1, 1, 7), - transition: theme.transitions.create("width"), - width: "100%", - [theme.breakpoints.up("md")]: { - width: 200, - }, - }, //for nav bar root: { display: "flex", @@ -181,7 +144,7 @@ const Navigation = (props) => { //for nav bar const theme = useTheme(); - const [open, setOpen] = React.useState(false); + const [open, setOpen] = useState(false); // for side bar menu const linkAttributes = [ { @@ -219,7 +182,7 @@ const Navigation = (props) => { setOpen(false); }; //for user icon menu - const [anchorEl, setAnchorEl] = React.useState(null); + const [anchorEl, setAnchorEl] = useState(null); const handleClick = (event) => { setAnchorEl(event.currentTarget); @@ -230,22 +193,6 @@ const Navigation = (props) => { }; const classes = useStyles(); - const [query, setQuery] = useState({ - query: "", - }); - - const handleChange = (e) => { - setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; - - const sendChange = (query) => { - props.setFilter(query); - }; - - const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); - }; //for click away const handleClickAway = () => { @@ -316,25 +263,7 @@ const Navigation = (props) => { -
-
-
- -
- -
-
+ Date: Tue, 19 May 2020 19:04:09 -0400 Subject: [PATCH 690/822] added dependency to useEffect --- src/components/dashboard/Watchlist.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index e4c9cc4..877a63a 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -27,8 +27,8 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - boxShadow: '0px 0px 1px 1px black', - backgroundColor:'black', + boxShadow: "0px 0px 1px 1px black", + backgroundColor: "black", }, }, })); @@ -43,7 +43,7 @@ function Watchlist({ setFilter, movies, }) { - console.log('movies', movies) + console.log("movies", movies); //OKTA AUTH const { authState } = useOktaAuth(); const { accessToken } = authState; @@ -58,7 +58,7 @@ function Watchlist({ setFilter(""); // Returns the users watchlist from the database getWatchlistAction(userid, accessToken); - }, [getWatchlistAction, userid, isDeleting, setFilter]); + }, [getWatchlistAction, userid, isDeleting, setFilter, accessToken]); function handleClick(id) { removeFromWatchlistAction(userid, id, accessToken); @@ -78,9 +78,9 @@ function Watchlist({ .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -100,10 +100,10 @@ function Watchlist({ page="watchlist" image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } From c4593dc95c1ffd004fbc4691445134dc147b527f Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:04:32 -0400 Subject: [PATCH 691/822] added action and reducer to index --- src/store/actions/index.js | 11 ++++++----- src/store/reducers/index.js | 24 +++++++++++++----------- src/store/reducers/searchReducer.js | 8 ++++---- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 3a8cd95..4d0cbea 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -6,11 +6,11 @@ import { uploadAction, toggleIsUploaded } from "./uploadAction.js"; import { addToWatchlistAction, removeFromWatchlistAction, - getWatchlistAction + getWatchlistAction, } from "./watchlistActions.js"; -import { getMoviesAction } from "./movieAction" -import { setFilter } from "./filterActions.js"; - +import { getMoviesAction } from "./movieAction"; +import { setFilter } from "./filterActions.js"; +import { searchAction } from "./searchAction.js"; export { loginAction, @@ -24,5 +24,6 @@ export { removeFromWatchlistAction, getWatchlistAction, getMoviesAction, - setFilter + setFilter, + searchAction, }; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index dc83c0e..cb7a813 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,12 +1,13 @@ import { combineReducers } from "redux"; -import { login } from './loginReducer'; -import { rating } from './ratingReducer'; -import { register } from './registerReducer'; -import { recommendations } from './recommendationReducer'; -import { upload } from './uploadReducer'; -import { filter } from './filterReducer'; -import { watchlist } from './watchlistReducer'; -import { movie } from './movieReducer'; +import { login } from "./loginReducer"; +import { rating } from "./ratingReducer"; +import { register } from "./registerReducer"; +import { recommendations } from "./recommendationReducer"; +import { upload } from "./uploadReducer"; +import { filter } from "./filterReducer"; +import { watchlist } from "./watchlistReducer"; +import { movie } from "./movieReducer"; +import { search } from "./searchReducer"; export const reducer = combineReducers({ login, @@ -15,6 +16,7 @@ export const reducer = combineReducers({ recommendations, upload, movie, - filter, - watchlist -}); \ No newline at end of file + filter, + watchlist, + search, +}); diff --git a/src/store/reducers/searchReducer.js b/src/store/reducers/searchReducer.js index cdc2d5f..8e6944b 100644 --- a/src/store/reducers/searchReducer.js +++ b/src/store/reducers/searchReducer.js @@ -6,7 +6,7 @@ import { const initialState = { queries: [], - isFetching: false, + isSearching: false, error: "", }; @@ -15,18 +15,18 @@ export const search = (state = initialState, action) => { case START_SEARCH_START: return { ...state, - isFetching: true, + isSearching: true, }; case START_SEARCH_SUCCESS: return { ...state, - isFetching: false, + isSearching: false, queries: action.payload, }; case START_SEARCH_FAIL: return { ...state, - isFetching: false, + isSearching: false, error: action.payload, }; default: From b4d0b6b7fc1d2ec9295d101e00e6d65e215bbb6a Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 19 May 2020 19:04:49 -0400 Subject: [PATCH 692/822] added search action to search bar --- src/components/auth/SearchBar.js | 60 +++++++++++++++----------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index be4a690..487b67e 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -1,20 +1,17 @@ import React, { useState } from "react"; import { connect } from "react-redux"; -import { - loginAction, - setFilter, - recommendationAction -} from "../../store/actions"; -//for search bar +import { loginAction, searchAction } from "../../store/actions"; +import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; +//for search bar import { makeStyles } from "@material-ui/core/styles"; import SearchIcon from "@material-ui/icons/Search"; import InputBase from "@material-ui/core/InputBase"; -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ searchContainer: { width: "40%", - margin: 'auto', - paddingTop: '4%', + margin: "auto", + paddingTop: "4%", }, [theme.breakpoints.down("xs")]: { searchContainer: { @@ -24,11 +21,11 @@ const useStyles = makeStyles(theme => ({ search: { position: "relative", borderRadius: theme.shape.borderRadius, - backgroundColor: 'white', + backgroundColor: "white", width: "100%", [theme.breakpoints.down("sm")]: { - width: "auto" - } + width: "auto", + }, }, searchIcon: { width: theme.spacing(7), @@ -38,37 +35,37 @@ const useStyles = makeStyles(theme => ({ display: "flex", alignItems: "center", justifyContent: "center", - color: '#212120', + color: "#212120", }, inputRoot: { - color: '#212120', - width: '100%', + color: "#212120", + width: "100%", }, inputInput: { padding: theme.spacing(1, 1, 1, 7), transition: theme.transitions.create("width"), width: "100%", + [theme.breakpoints.up("md")]: { + width: 200, + }, }, })); -const Navigation = props => { - +const Navigation = ({ searchAction, userid }) => { + const { authState } = useOktaAuth(); + const { accessToken } = authState; const classes = useStyles(); const [query, setQuery] = useState({ - query: "" + query: "", }); - const handleChange = e => { + const handleChange = (e) => { setQuery({ query: e.target.value }); - sendChange(e.target.value.trim()); - }; - - const sendChange = query => { - props.setFilter(query); }; - const handleSubmit = e => { - if (e.keyCode === 13 && query.query !== "") props.setFilter(e.target.value); + const handleSubmit = (e) => { + if (e.keyCode === 13 && query.query !== "") + searchAction(userid, query, accessToken); }; return ( @@ -79,12 +76,12 @@ const Navigation = props => {
{ ); }; -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { userid: state.login.userid, - searchTerm: state.filter.searchTerm + searchTerm: state.filter.searchTerm, }; }; export default connect(mapStateToProps, { loginAction, - recommendationAction, - setFilter + searchAction, })(Navigation); From 5424b9a56ceadfcbd213c9ab3d5ee6c26a5a6dde Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 20 May 2020 12:37:52 -0700 Subject: [PATCH 693/822] service providers in state --- src/components/dashboard/Explore.js | 34 +++++--- src/components/dashboard/Ratings.js | 3 + src/components/dashboard/Watchlist.js | 8 +- src/components/movies/MovieCard.js | 89 +++++++++++++------- src/store/actions/index.js | 9 +- src/store/actions/serviceProviderAction.js | 29 +++++++ src/store/reducers/index.js | 6 +- src/store/reducers/serviceProviderReducer.js | 39 +++++++++ src/utils/axiosWithAuth.js | 2 +- 9 files changed, 166 insertions(+), 53 deletions(-) create mode 100644 src/store/actions/serviceProviderAction.js create mode 100644 src/store/reducers/serviceProviderReducer.js diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index cb5b1be..7230775 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -1,7 +1,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { getMoviesAction, setFilter, notWatchListAction } from "../../store/actions/index.js"; +import { getMoviesAction, setFilter, notWatchListAction} from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -35,8 +35,10 @@ function Explore({ searchTerm, setFilter, ratings, - notWatchListAction + notWatchListAction, + }) { + // console.log('this is the movies', movie_id) const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -48,9 +50,10 @@ function Explore({ // Returns the movies getMoviesAction(userid, accessToken); notWatchListAction(userid, accessToken); - - }, [getMoviesAction,notWatchListAction, userid, ratings, setFilter, accessToken]); - + }, [getMoviesAction, notWatchListAction, userid, ratings, setFilter, accessToken]); + + // const {movie_id} = movies.movie_id; +// console.log('this is it', movies.movie_id); // How many movies render const cardAmount = 40; @@ -68,13 +71,14 @@ function Explore({ (film) => film.title === movie.title && film.year === movie.year ).length && searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .slice(0, cardAmount) .map((movie, index) => { + // console.log('this is the movies', movie) /* Checks if the film is in ratings */ const isRated = (film) => { return film.title === movie.title && film.year === movie.year; @@ -92,16 +96,16 @@ function Explore({ page={"Explore"} name={movie.title} year={movie.year} - movie_id={movie.movie_id} description={movie.description} + genres={movie.genres} trailer={movie.trailer_url} rated={rated ? rated.rating : null} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } @@ -114,6 +118,8 @@ function Explore({ } const mapStateToProps = (state) => { + // console.log('this is the res of notwatchlist', state) + return { userid: state.login.userid, isFetching: state.movie.isFetching, @@ -127,5 +133,5 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps, { getMoviesAction, setFilter, - notWatchListAction + notWatchListAction, })(Explore); diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 5bab398..ea2efe5 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -54,6 +54,7 @@ function Ratings({ cols={screenWidth ? 2 : 5} cellHeight="auto" > + {ratings .filter((movie) => searchTerm !== "" @@ -64,12 +65,14 @@ function Ratings({ : true ) .map((movie, index) => { + // console.log('inratings',movie.movie_id) let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return (
+ { + let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; @@ -93,11 +93,13 @@ function Watchlist({ { + // console.log('state', state) + return { userid: state.login.userid, isFetching: state.watchlist.isFetching, diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 0e0e365..aac73df 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,6 +1,6 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { connect } from "react-redux"; -import { ratingAction, addToWatchlistAction, notWatchListAction } from "../../store/actions"; +import { ratingAction, addToWatchlistAction, notWatchListAction, serviceProviderAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid @@ -50,6 +50,7 @@ const DialogTitle = withStyles(styles)((props) => { const useStyles = makeStyles((theme) => ({ nameModal: { fontSize: "25px", + textAlign: 'center', }, cardContent: { height: "100%", @@ -158,7 +159,7 @@ const useStyles = makeStyles((theme) => ({ }, actionButtons: { display: 'flex', - justifyContent:'center', + justifyContent: 'center', }, watchStarsModal: { display: "flex", @@ -179,6 +180,11 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", justifyContent: "space-evenly", }, + serviceBtn: { + color: 'red', + border: '2px solid green', + textAlign: 'center', + }, [theme.breakpoints.down("xs")]: { name: { padding: "0", @@ -225,17 +231,26 @@ function MovieCard({ setDeleteMode, notWatchListAction, notwatchlist, + serviceProviderAction, + serviceProvider, }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); const { accessToken } = authState; +// console.log('movie id', movie_id) + + useEffect(() => { + serviceProviderAction(userid, accessToken, movie_id) + }, [serviceProviderAction, userid, movie_id, accessToken]) + // console.log('service provider', ) + const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); /* Used for dynamically rendering the "Add to watchlist" button and if it's disabled */ const [added, setAdded] = useState(false); //to remove movie user not interested in - const [ removed, setRemoved] = useState(false); + const [removed, setRemoved] = useState(false); /* This checks if the movie is in the watchlist */ const inWatchlist = watchlist.some( (movie) => movie.name === name && movie.year === year @@ -321,6 +336,13 @@ function MovieCard({ timeout: 500, }} > + {serviceProvider + .map((serviceProviders, index)=> { +
+ pro +
+ + })}
@@ -376,8 +398,8 @@ function MovieCard({ color="primary" > {!removed && !notInWatchlist - ? "Not Interested" - : "Removed from Results"} + ? "Not Interested" + : "Removed from Results"} ) : ( @@ -400,9 +422,9 @@ function MovieCard({ )} ) : ( - //
- "" - )} + //
+ "" + )} {page === "Onboarding" ? ( ) : ( - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - onClick={handleClose} - /> - )} + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + onClick={handleClose} + /> + )} + +
+

these are the providers:

+ +
+
{page !== "Onboarding" ? ( ) : ( - "" - )} + "" + )}
@@ -472,9 +500,10 @@ const mapStateToProps = (state) => { watchlist: state.watchlist.movies, watchlistError: state.watchlist.error, ratings: state.rating.movies, - notwatchlist: state.notwatchlist.movies + notwatchlist: state.notwatchlist.movies, + serviceProvider: state.serviceProvider.serviceProviders }; }; -export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction })( +export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction, serviceProviderAction })( MovieCard ); diff --git a/src/store/actions/index.js b/src/store/actions/index.js index a3321e3..b4cec6f 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -9,9 +9,9 @@ import { getWatchlistAction } from "./watchlistActions.js"; import { getMoviesAction } from "./movieAction" -import { setFilter } from "./filterActions.js"; -import {notWatchListAction} from './notWatchListAction.js'; - +import { setFilter } from "./filterActions.js"; +import { notWatchListAction } from './notWatchListAction.js'; +import { serviceProviderAction } from './serviceProviderAction.js'; export { loginAction, @@ -26,5 +26,6 @@ export { getWatchlistAction, getMoviesAction, setFilter, - notWatchListAction + notWatchListAction, + serviceProviderAction, }; diff --git a/src/store/actions/serviceProviderAction.js b/src/store/actions/serviceProviderAction.js new file mode 100644 index 0000000..b835164 --- /dev/null +++ b/src/store/actions/serviceProviderAction.js @@ -0,0 +1,29 @@ +import axiosWithAuth from "../../utils/axiosWithAuth.js"; +export const FETCHING_SERVICEPROVIDERS_START = "FETCHING_MOVIES_START"; +export const FETCHING_SERVICEPROVIDERS_SUCCESS = "FETCHING_MOVIES_SUCCESS"; +export const FETCHING_SERVICEPROVIDERS_FAIL = "FETCHING_MOVIES_FAIL"; + +export function serviceProviderAction(id, token, movie_id) { + // console.log('movie id', movie_id) + return dispatch => { + dispatch({ + type: FETCHING_SERVICEPROVIDERS_START + }); + axiosWithAuth(token) + .get(`${id}/service-providers/${movie_id}`) + .then(res => { + dispatch({ + type: FETCHING_SERVICEPROVIDERS_SUCCESS, + payload: res.data, + + }); + // console.log('in action', res.data) + }) + .catch(err => { + dispatch({ + type: FETCHING_SERVICEPROVIDERS_FAIL, + payload: err + }) + }) + } +} \ No newline at end of file diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 1ff4af2..856b349 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -4,10 +4,11 @@ import { rating } from './ratingReducer'; import { register } from './registerReducer'; import { recommendations } from './recommendationReducer'; import { upload } from './uploadReducer'; -import { filter } from './filterReducer'; +import { filter } from './filterReducer'; import { watchlist } from './watchlistReducer'; import { movie } from './movieReducer'; import { notwatchlist } from './notWatchListReducer'; +import { serviceProvider } from './serviceProviderReducer'; export const reducer = combineReducers({ login, @@ -16,7 +17,8 @@ export const reducer = combineReducers({ recommendations, upload, movie, - filter, + filter, watchlist, notwatchlist, + serviceProvider, }); \ No newline at end of file diff --git a/src/store/reducers/serviceProviderReducer.js b/src/store/reducers/serviceProviderReducer.js new file mode 100644 index 0000000..7d32472 --- /dev/null +++ b/src/store/reducers/serviceProviderReducer.js @@ -0,0 +1,39 @@ +import { + FETCHING_SERVICEPROVIDERS_START, + FETCHING_SERVICEPROVIDERS_SUCCESS, + FETCHING_SERVICEPROVIDERS_FAIL +} from '../actions/serviceProviderAction' + +const initialState = { + serviceProviders: [], + isFetching: false, + error: "" +}; + + +export const serviceProvider = (state = initialState, action) => { + switch (action.type) { + // GET service providers + case FETCHING_SERVICEPROVIDERS_START: + return { + ...state, + isFetching: true + } + // GET service providers SUCCESS + case FETCHING_SERVICEPROVIDERS_SUCCESS: + return { + ...state, + isFetching: false, + serviceProviders: action.payload + }; + // GET service providers FAIL + case FETCHING_SERVICEPROVIDERS_FAIL: + return { + ...state, + isFetching: false, + error: action.payload + }; + default: + return state; + } +}; \ No newline at end of file diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c6b489..616e306 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: process.env.REACT_APP_BASEURL + baseURL: 'http://localhost:5000/api/users' }) } export default axiosWithAuth; \ No newline at end of file From 188e374823e78830b821b717e94ad66ce49ec56d Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 20 May 2020 14:38:04 -0700 Subject: [PATCH 694/822] link for service provider display in movie cards --- src/components/dashboard/Ratings.js | 15 ++++- src/components/movies/MovieCard.js | 72 ++++++++++++++++------ src/store/actions/serviceProviderAction.js | 6 +- 3 files changed, 67 insertions(+), 26 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index ea2efe5..7c1fdde 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -1,7 +1,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { getRatingAction, setFilter } from "../../store/actions/index.js"; +import { getRatingAction, setFilter, serviceProviderAction } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; // children components @@ -33,6 +33,8 @@ function Ratings({ ratings, searchTerm, setFilter, + serviceProviderAction, + serviceProvider }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -44,8 +46,13 @@ function Ratings({ setFilter(""); // Returns the ratings getRatingAction(userid, accessToken); + }, [getRatingAction, userid, setFilter, accessToken]); + // const handleClickProvider = (user_id, access_Token, movie_id) => { + // serviceProviderAction(user_id, access_Token, movie_id) + // }; + if (isFetching) return ; else return ( @@ -72,7 +79,6 @@ function Ratings({ let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return (
- { ratings: state.rating.movies, ratingsError: state.rating.error, searchTerm: state.filter.searchTerm, + serviceProvider: state.serviceProvider.serviceProviders }; }; -export default connect(mapStateToProps, { getRatingAction, setFilter })( +export default connect(mapStateToProps, { getRatingAction, setFilter, serviceProviderAction })( Ratings ); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index aac73df..ff5a6e7 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; +import axiosWithAuth from "../../utils/axiosWithAuth.js"; import { connect } from "react-redux"; -import { ratingAction, addToWatchlistAction, notWatchListAction, serviceProviderAction } from "../../store/actions"; +import { ratingAction, addToWatchlistAction, notWatchListAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid @@ -18,6 +19,12 @@ import { import CloseIcon from "@material-ui/icons/Close"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; +//menu expander +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; + const styles = (theme) => ({ closeBtn: { display: "flex", @@ -231,19 +238,18 @@ function MovieCard({ setDeleteMode, notWatchListAction, notwatchlist, - serviceProviderAction, - serviceProvider, }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); const { accessToken } = authState; -// console.log('movie id', movie_id) + // console.log('movie id', movie_id) - useEffect(() => { - serviceProviderAction(userid, accessToken, movie_id) - }, [serviceProviderAction, userid, movie_id, accessToken]) - // console.log('service provider', ) + // useEffect(() => { + // serviceProviderAction(userid, accessToken, movie_id) + // }, [serviceProviderAction, userid, movie_id, accessToken]) + // console.log('service provider',serviceProvider ) + const [serviceProvider, setServiceProvider] = useState([]); const [yourRating, setYourRating] = useState(false); /* Used for the star rating */ const [rating, setRating] = useState(0); @@ -300,8 +306,21 @@ function MovieCard({ notWatchListAction(userid, movie, accessToken); setRemoved(true); handleClose(); + }; + + const handleClickProviders = () => { + axiosWithAuth(accessToken) + .get(`${userid}/service-providers/${movie.movie_id}`) + .then(res => { + setServiceProvider(res.data) + console.log('data', res.data) + }) + .catch(err => { + console.log(err) + }) } + const multiFunctions = () => { handleClose(); handleClickStar(); @@ -313,7 +332,7 @@ function MovieCard({ console.log("number of ratings is " + numRatings.num); console.log("openalert"); }; - + // console.log('sericelink', serviceLinks) return (
@@ -336,13 +355,7 @@ function MovieCard({ timeout: 500, }} > - {serviceProvider - .map((serviceProviders, index)=> { -
- pro -
- })}
@@ -461,9 +474,29 @@ function MovieCard({ /> )} -
-

these are the providers:

- +
+ + } + aria-controls="panel1a-content" + id="panel1a-header" + onClick={handleClickProviders} + > + Expansion Panel 1 + + + {serviceProvider + .map((serviceProviders) => { + return ( + + {serviceProviders.link} + + ) + })} + + + +
@@ -501,9 +534,8 @@ const mapStateToProps = (state) => { watchlistError: state.watchlist.error, ratings: state.rating.movies, notwatchlist: state.notwatchlist.movies, - serviceProvider: state.serviceProvider.serviceProviders }; }; -export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction, serviceProviderAction })( +export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction })( MovieCard ); diff --git a/src/store/actions/serviceProviderAction.js b/src/store/actions/serviceProviderAction.js index b835164..a339463 100644 --- a/src/store/actions/serviceProviderAction.js +++ b/src/store/actions/serviceProviderAction.js @@ -1,7 +1,7 @@ import axiosWithAuth from "../../utils/axiosWithAuth.js"; -export const FETCHING_SERVICEPROVIDERS_START = "FETCHING_MOVIES_START"; -export const FETCHING_SERVICEPROVIDERS_SUCCESS = "FETCHING_MOVIES_SUCCESS"; -export const FETCHING_SERVICEPROVIDERS_FAIL = "FETCHING_MOVIES_FAIL"; +export const FETCHING_SERVICEPROVIDERS_START = "FETCHING_SERVICEPROVIDERS_START"; +export const FETCHING_SERVICEPROVIDERS_SUCCESS = "FETCHING_SERVICEPROVIDERS_SUCCESS"; +export const FETCHING_SERVICEPROVIDERS_FAIL = "FETCHING_SERVICEPROVIDERS_FAIL"; export function serviceProviderAction(id, token, movie_id) { // console.log('movie id', movie_id) From 84e5327a191438b2e9ab5000781a8598751f43f4 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 20 May 2020 15:25:24 -0700 Subject: [PATCH 695/822] name of provider displayed as button set to link --- src/components/movies/MovieCard.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ff5a6e7..e0aad60 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -4,6 +4,7 @@ import { connect } from "react-redux"; import { ratingAction, addToWatchlistAction, notWatchListAction } from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; +import Link from '@material-ui/core/link' //for grid import { makeStyles, withStyles } from "@material-ui/core/styles"; import { @@ -303,7 +304,8 @@ function MovieCard({ }; const handleClickRemove = () => { - notWatchListAction(userid, movie, accessToken); + const notWatch = {movie_id: movie.movie_id, user_id: userid} + notWatchListAction(userid, notWatch, accessToken); setRemoved(true); handleClose(); }; @@ -482,19 +484,22 @@ function MovieCard({ id="panel1a-header" onClick={handleClickProviders} > - Expansion Panel 1 + Service Providers - +
{serviceProvider .map((serviceProviders) => { return ( - {serviceProviders.link} + + + + ) })} - +
From 0804660bd9ada2abd59c882a6753a0e87505098e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:08:52 -0400 Subject: [PATCH 696/822] resolved merge conflict --- src/components/auth/Onboarding.js | 53 ------------------------------- 1 file changed, 53 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index d53273d..fb1e59a 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -62,13 +62,10 @@ function Onboarding({ const [openAlert, setOpenAlert] = useState(false); let [numRatings, setNumRatings] = useState({ num: 0 }); const screenWidth = widthFinder(window.innerWidth); -<<<<<<< HEAD -======= //for search bar const [query, setQuery] = useState({ query: "", }); ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 const handleClickStar = () => { setOpenAlert(true); @@ -89,55 +86,6 @@ function Onboarding({ const cardAmount = 25; if (isFetching) return ; -<<<<<<< HEAD - else if (numRatings.num >= 13) return ; - else - return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return ( - film.primary_title === movie.primary_title && - film.start_year === movie.start_year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- = 13) return else return (
@@ -184,7 +132,6 @@ function Onboarding({ rated={rated ? rated.rating : null} image={ !posterURI || ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 posterURI === "None" || posterURI === "No poster" || posterURI === "No Poster" || From 851c740280dfccf5f9dcba21f727a3a924c53d00 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:11:26 -0400 Subject: [PATCH 697/822] resolved merge conflict --- src/components/dashboard/Watchlist.js | 5 ----- src/store/actions/index.js | 13 ++----------- src/store/reducers/index.js | 19 +------------------ 3 files changed, 3 insertions(+), 34 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 1c25ee1..2ff239c 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -43,11 +43,6 @@ function Watchlist({ setFilter, movies, }) { -<<<<<<< HEAD - console.log("movies", movies); -======= - // console.log('movies', movies) ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 //OKTA AUTH const { authState } = useOktaAuth(); const { accessToken } = authState; diff --git a/src/store/actions/index.js b/src/store/actions/index.js index 643fa49..a9aca29 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -8,16 +8,10 @@ import { removeFromWatchlistAction, getWatchlistAction, } from "./watchlistActions.js"; -<<<<<<< HEAD import { getMoviesAction } from "./movieAction"; import { setFilter } from "./filterActions.js"; import { searchAction } from "./searchAction.js"; -======= -import { getMoviesAction } from "./movieAction" -import { setFilter } from "./filterActions.js"; -import {notWatchListAction} from './notWatchListAction.js'; - ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 +import { notWatchListAction } from "./notWatchListAction.js"; export { loginAction, @@ -32,9 +26,6 @@ export { getWatchlistAction, getMoviesAction, setFilter, -<<<<<<< HEAD searchAction, -======= - notWatchListAction ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 + notWatchListAction, }; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index f4dc367..b19c974 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,5 +1,4 @@ import { combineReducers } from "redux"; -<<<<<<< HEAD import { login } from "./loginReducer"; import { rating } from "./ratingReducer"; import { register } from "./registerReducer"; @@ -8,18 +7,8 @@ import { upload } from "./uploadReducer"; import { filter } from "./filterReducer"; import { watchlist } from "./watchlistReducer"; import { movie } from "./movieReducer"; +import { notwatchlist } from "./notWatchListReducer"; import { search } from "./searchReducer"; -======= -import { login } from './loginReducer'; -import { rating } from './ratingReducer'; -import { register } from './registerReducer'; -import { recommendations } from './recommendationReducer'; -import { upload } from './uploadReducer'; -import { filter } from './filterReducer'; -import { watchlist } from './watchlistReducer'; -import { movie } from './movieReducer'; -import { notwatchlist } from './notWatchListReducer'; ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 export const reducer = combineReducers({ login, @@ -28,14 +17,8 @@ export const reducer = combineReducers({ recommendations, upload, movie, -<<<<<<< HEAD filter, watchlist, search, -}); -======= - filter, - watchlist, notwatchlist, }); ->>>>>>> 03a852403abb46cc3a4c36ade92ec57eec797ff9 From 92753d1f95478a5a6ec82fb2a32445d46bdb5fd1 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:39:50 -0400 Subject: [PATCH 698/822] code clean up of unused code --- src/components/auth/Onboarding.js | 91 ++++++++++++++----------------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index fb1e59a..abc85e6 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -62,10 +62,6 @@ function Onboarding({ const [openAlert, setOpenAlert] = useState(false); let [numRatings, setNumRatings] = useState({ num: 0 }); const screenWidth = widthFinder(window.innerWidth); - //for search bar - const [query, setQuery] = useState({ - query: "", - }); const handleClickStar = () => { setOpenAlert(true); @@ -86,52 +82,49 @@ function Onboarding({ const cardAmount = 25; if (isFetching) return ; - else if (numRatings.num >= 13) return - else return ( -
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.film.title === movie.title && - film.year === movie.year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { + else if (numRatings.num >= 13) return ; + else + return ( +
+ + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.film.title === movie.title && film.year === movie.year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return film.title === movie.title && film.year === movie.year; + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; return ( - film.title === movie.title && - film.year === movie.year - ); - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- + Date: Thu, 21 May 2020 00:40:30 -0400 Subject: [PATCH 699/822] code clean up of unused code --- src/components/auth/PostOnboarding.js | 3 +- src/components/auth/Register.js | 77 ++++---- src/components/layout/privacy-policy.js | 248 ++++++++++++++++-------- 3 files changed, 203 insertions(+), 125 deletions(-) diff --git a/src/components/auth/PostOnboarding.js b/src/components/auth/PostOnboarding.js index 0c93783..5a065f5 100644 --- a/src/components/auth/PostOnboarding.js +++ b/src/components/auth/PostOnboarding.js @@ -98,8 +98,7 @@ function PostOnboarding({ recommendationAction, accessToken, ]); - // How many movies render - const cardAmount = 25; + return (
- {'Copyright © '} + {"Copyright © "} GROÁ - {' '} + {" "} 2020 - {'.'} + {"."} GROÁ Privacy Policy @@ -31,46 +30,33 @@ function Copyright() { ); } -const useStyles = makeStyles((theme) => ({ - root: { - margin: theme.spacing(1), - }, - textField: { - display: "flex", - justifyContent: "center", - marginBottom: "2%", - width: "100%", - padding: "0", - }, -})); - const Register = (props) => { const history = useHistory(); const { authState, authService } = useOktaAuth(); - const login = async () => authService.login('/'); - const logout = async () => authService.logout('/'); + const login = async () => authService.login("/"); const facebookLogin = () => { - window.location.href = `https://dev-568768.okta.com/oauth2/v1/authorize?idp=0oabxx6bmXwAawmlZ4x6&client_id=${process.env.REACT_APP_CLIENT_ID}&response_type=id_token&response_mode=fragment&scope=openid%20email&redirect_uri=https%3A%2F%2Fgroa.us%2F&state=1234&nonce=groa1234` - } + window.location.href = `https://dev-568768.okta.com/oauth2/v1/authorize?idp=0oabxx6bmXwAawmlZ4x6&client_id=${process.env.REACT_APP_CLIENT_ID}&response_type=id_token&response_mode=fragment&scope=openid%20email&redirect_uri=https%3A%2F%2Fgroa.us%2F&state=1234&nonce=groa1234`; + }; //if user already Authenticated, loginAction redirects to to explore page useEffect(() => { //Auth URL redirect from facebook contains #id_token, if exist login() will authenticate the user - if(window.location.href.indexOf("#id_token") > -1) { + if (window.location.href.indexOf("#id_token") > -1) { login(); } - if(authState.isAuthenticated === true){ - authService.getUser() - .then((info) => { - props.loginAction(authState.accessToken, info.sub, history); - console.log("checking authentication") - - }) - .catch(err => console.log("Error fetching User info in UseEffect", err)) + if (authState.isAuthenticated === true) { + authService + .getUser() + .then((info) => { + props.loginAction(authState.accessToken, info.sub, history); + console.log("checking authentication"); + }) + .catch((err) => + console.log("Error fetching User info in UseEffect", err) + ); } - }, [authState, authService]); return ( @@ -102,18 +88,27 @@ const Register = (props) => { {/* FORM STARTS */}
{/* */} -
+
- -

OR

+ +

+ OR +

- Facebook Icon + Facebook Icon
-

Login with Facebook

+

+ Login with Facebook +

diff --git a/src/components/layout/privacy-policy.js b/src/components/layout/privacy-policy.js index 840071f..df3d8ff 100644 --- a/src/components/layout/privacy-policy.js +++ b/src/components/layout/privacy-policy.js @@ -1,96 +1,180 @@ import React from "react"; -import widthFinder from "../../utils/widthFinder.js"; -import { makeStyles } from "@material-ui/core/styles"; -import Typography from "@material-ui/core/Typography"; -import Box from "@material-ui/core/Box"; - function PrivacyPolicy() { + return ( +
+

Groa Privacy Policy

- return( -
-

Groa Privacy Policy

- -

This privacy policy has been compiled to better serve those who are concerned with how their 'Personally identifiable information' (PII) is being used online. PII, as used in US privacy law and information security, is information that can be used on its own or with other information to identify, contact, or locate a single person, or to identify an individual in context. Please read our privacy policy carefully to get a clear understanding of how we collect, use, protect or otherwise handle your Personally Identifiable Information in accordance with our website. -

-

What personal information do we collect from the people that visit our blog, website or app? -

-

When using or registering on our site, as appropriate, you may be asked to enter your name, email address, Preferences or other details to help you with your experience. -

-

When do we collect information? +

+ This privacy policy has been compiled to better serve those who are + concerned with how their 'Personally identifiable information' (PII) is + being used online. PII, as used in US privacy law and information + security, is information that can be used on its own or with other + information to identify, contact, or locate a single person, or to + identify an individual in context. Please read our privacy policy + carefully to get a clear understanding of how we collect, use, protect + or otherwise handle your Personally Identifiable Information in + accordance with our website. +

+

+ What personal information do we collect from the people that visit our + blog, website or app?

-

We collect information from you when you register on our site, subscribe to a newsletter, fill out a form or enter information on our site. -

+

+ When using or registering on our site, as appropriate, you may be asked + to enter your name, email address, Preferences or other details to help + you with your experience. +

+

When do we collect information?

+

+ We collect information from you when you register on our site, subscribe + to a newsletter, fill out a form or enter information on our site. +

How do we use your information?

-

We may use the information we collect from you when you register, make a purchase, sign up for our newsletter, respond to a survey or marketing communication, surf the website, or use certain other site features in the following ways: - To personalize user's experience and to allow us to deliver the type of content and product offerings in which you are most interested - To ask for ratings and reviews of services or products - To follow up with them after correspondence (live chat, email or phone inquiries) -

-

How do we protect visitor information? -

-

We do not use vulnerability scanning and/or scanning to PCI standards. - We use regular Malware Scanning. - Your personal information is contained behind secured networks and is only accessible by a limited number of persons who have special access rights to such systems, and are required to keep the information confidential. In addition, all sensitive/credit information you supply is encrypted via Secure Socket Layer (SSL) technology. - We implement a variety of security measures when a user enters, submits, or accesses their information to maintain the safety of your personal information. - All transactions are processed through a gateway provider and are not stored or processed on our servers. -

-

Do we use 'cookies'? -

-

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow) that enables the site's or service provider's systems to recognize your browser and capture and remember certain information. For instance, we use cookies to help us remember and process the items in your shopping cart. They are also used to help us understand your preferences based on previous or current site activity, which enables us to provide you with improved services. We also use cookies to help us compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. - We use cookies to: - Understand and save user's preferences for future visits - Compile aggregate data about site traffic and site interactions in order to offer better site experiences and tools in the future. We may also use trusted third-party services that track this information on our behalf. - You can choose to have your computer warn you each time a cookie is being sent, or you can choose to turn off all cookies. You do this through your browser (like Internet Explorer) settings. Each browser is a little different, so look at your browser's Help menu to learn the correct way to modify your cookies. - If you disable cookies off, some features will be disabled It won't affect the user's experience that make your site experience more efficient and some of our services will not function properly. -

+

+ We may use the information we collect from you when you register, make a + purchase, sign up for our newsletter, respond to a survey or marketing + communication, surf the website, or use certain other site features in + the following ways: To personalize user's experience and to allow us to + deliver the type of content and product offerings in which you are most + interested To ask for ratings and reviews of services or products To + follow up with them after correspondence (live chat, email or phone + inquiries) +

+

How do we protect visitor information?

+

+ We do not use vulnerability scanning and/or scanning to PCI standards. + We use regular Malware Scanning. Your personal information is contained + behind secured networks and is only accessible by a limited number of + persons who have special access rights to such systems, and are required + to keep the information confidential. In addition, all sensitive/credit + information you supply is encrypted via Secure Socket Layer (SSL) + technology. We implement a variety of security measures when a user + enters, submits, or accesses their information to maintain the safety of + your personal information. All transactions are processed through a + gateway provider and are not stored or processed on our servers. +

+

Do we use 'cookies'?

+

+ Yes. Cookies are small files that a site or its service provider + transfers to your computer's hard drive through your Web browser (if you + allow) that enables the site's or service provider's systems to + recognize your browser and capture and remember certain information. For + instance, we use cookies to help us remember and process the items in + your shopping cart. They are also used to help us understand your + preferences based on previous or current site activity, which enables us + to provide you with improved services. We also use cookies to help us + compile aggregate data about site traffic and site interaction so that + we can offer better site experiences and tools in the future. We use + cookies to: Understand and save user's preferences for future visits + Compile aggregate data about site traffic and site interactions in order + to offer better site experiences and tools in the future. We may also + use trusted third-party services that track this information on our + behalf. You can choose to have your computer warn you each time a cookie + is being sent, or you can choose to turn off all cookies. You do this + through your browser (like Internet Explorer) settings. Each browser is + a little different, so look at your browser's Help menu to learn the + correct way to modify your cookies. If you disable cookies off, some + features will be disabled It won't affect the user's experience that + make your site experience more efficient and some of our services will + not function properly. +

Third-party disclosure

-

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information unless we provide users with advance notice. This does not include website hosting partners and other parties who assist us in operating our website, conducting our business, or serving our users, so long as those parties agree to keep this information confidential. We may also release information when it's release is appropriate to comply with the law, enforce our site policies, or protect ours or others' rights, property or safety. - However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses. -

+

+ We do not sell, trade, or otherwise transfer to outside parties your + personally identifiable information unless we provide users with advance + notice. This does not include website hosting partners and other parties + who assist us in operating our website, conducting our business, or + serving our users, so long as those parties agree to keep this + information confidential. We may also release information when it's + release is appropriate to comply with the law, enforce our site + policies, or protect ours or others' rights, property or safety. + However, non-personally identifiable visitor information may be provided + to other parties for marketing, advertising, or other uses. +

Third-party links

-

Occasionally, at our discretion, we may include or offer third-party products or services on our website. These third-party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites. -

-

Google

-

Google's advertising requirements can be summed up by Google's Advertising Principles. They are put in place to provide a positive experience for users. https://support.google.com/adwordspolicy/answer/1316548?hl=en - We have not enabled Google AdSense on our site but we may do so in the future. -

+

+ Occasionally, at our discretion, we may include or offer third-party + products or services on our website. These third-party sites have + separate and independent privacy policies. We therefore have no + responsibility or liability for the content and activities of these + linked sites. Nonetheless, we seek to protect the integrity of our site + and welcome any feedback about these sites. +

+

Google

+

+ Google's advertising requirements can be summed up by Google's + Advertising Principles. They are put in place to provide a positive + experience for users. + https://support.google.com/adwordspolicy/answer/1316548?hl=en We have + not enabled Google AdSense on our site but we may do so in the future. +

California Online Privacy Protection Act

-

CalOPPA is the first state law in the nation to require commercial websites and online services to post a privacy policy. The law's reach stretches well beyond California to require a person or company in the United States (and conceivably the world) that operates websites collecting personally identifiable information from California consumers to post a conspicuous privacy policy on its website stating exactly the information being collected and those individuals with whom it is being shared, and to comply with this policy. - See more at: http://consumercal.org/california-online-privacy-protection-act-caloppa/#sthash.0FdRbT51.dpuf - According to CalOPPA we agree to the following: - Users can visit our site anonymously. - Once this privacy policy is created, we will add a link to it on our home page or as a minimum on the first significant page after entering our website. - Our Privacy Policy link includes the word 'Privacy' and can be easily be found on the page specified above. - Users will be notified of any privacy policy changes: - On our Privacy Policy Page - Users are able to change their personal information: - By logging in to their account - How does our site handle do not track signals? - We honor do not track signals and do not track, plant cookies, or use advertising when a Do Not Track (DNT) browser mechanism is in place. - Does our site allow third-party behavioral tracking? - It's also important to note that we do not allow third-party behavioral tracking -

+

+ CalOPPA is the first state law in the nation to require commercial + websites and online services to post a privacy policy. The law's reach + stretches well beyond California to require a person or company in the + United States (and conceivably the world) that operates websites + collecting personally identifiable information from California consumers + to post a conspicuous privacy policy on its website stating exactly the + information being collected and those individuals with whom it is being + shared, and to comply with this policy. - See more at: + http://consumercal.org/california-online-privacy-protection-act-caloppa/#sthash.0FdRbT51.dpuf + According to CalOPPA we agree to the following: Users can visit our site + anonymously. Once this privacy policy is created, we will add a link to + it on our home page or as a minimum on the first significant page after + entering our website. Our Privacy Policy link includes the word + 'Privacy' and can be easily be found on the page specified above. Users + will be notified of any privacy policy changes: On our Privacy Policy + Page Users are able to change their personal information: By logging in + to their account How does our site handle do not track signals? We honor + do not track signals and do not track, plant cookies, or use advertising + when a Do Not Track (DNT) browser mechanism is in place. Does our site + allow third-party behavioral tracking? It's also important to note that + we do not allow third-party behavioral tracking +

COPPA (Children Online Privacy Protection Act)

-

When it comes to the collection of personal information from children under 13, the Children's Online Privacy Protection Act (COPPA) puts parents in control. The Federal Trade Commission, the nation's consumer protection agency, enforces the COPPA Rule, which spells out what operators of websites and online services must do to protect children's privacy and safety online. - We do not specifically market to children under 13. -

+

+ When it comes to the collection of personal information from children + under 13, the Children's Online Privacy Protection Act (COPPA) puts + parents in control. The Federal Trade Commission, the nation's consumer + protection agency, enforces the COPPA Rule, which spells out what + operators of websites and online services must do to protect children's + privacy and safety online. We do not specifically market to children + under 13. +

Fair Information Practices

-

The Fair Information Practices Principles form the backbone of privacy law in the United States and the concepts they include have played a significant role in the development of data protection laws around the globe. Understanding the Fair Information Practice Principles and how they should be implemented is critical to comply with the various privacy laws that protect personal information. - In order to be in line with Fair Information Practices we will take the following responsive action, should a data breach occur, We will notify the users via email within 14 business days - We also agree to the Individual Redress Principle, which requires that individuals have a right to pursue legally enforceable rights against data collectors and processors who fail to adhere to the law. This principle requires not only that individuals have enforceable rights against data users, but also that individuals have recourse to courts or government agencies to investigate and/or prosecute non-compliance by data processors. -

+

+ The Fair Information Practices Principles form the backbone of privacy + law in the United States and the concepts they include have played a + significant role in the development of data protection laws around the + globe. Understanding the Fair Information Practice Principles and how + they should be implemented is critical to comply with the various + privacy laws that protect personal information. In order to be in line + with Fair Information Practices we will take the following responsive + action, should a data breach occur, We will notify the users via email + within 14 business days We also agree to the Individual Redress + Principle, which requires that individuals have a right to pursue + legally enforceable rights against data collectors and processors who + fail to adhere to the law. This principle requires not only that + individuals have enforceable rights against data users, but also that + individuals have recourse to courts or government agencies to + investigate and/or prosecute non-compliance by data processors. +

CAN SPAM Act

-

The CAN-SPAM Act is a law that sets the rules for commercial email, establishes requirements for commercial messages, gives recipients the right to have emails stopped from being sent to them, and spells out tough penalties for violations. - We collect your email address in order to: - To be in accordance with CANSPAM we agree to the following: - If at any time you would like to unsubscribe from receiving future emails, you can email us at contact@groa.us and we will promptly remove you from ALL correspondence. - Contacting Us - If there are any questions regarding this privacy policy you may contact us at contact@groa.us. -

-
+

+ The CAN-SPAM Act is a law that sets the rules for commercial email, + establishes requirements for commercial messages, gives recipients the + right to have emails stopped from being sent to them, and spells out + tough penalties for violations. We collect your email address in order + to: To be in accordance with CANSPAM we agree to the following: If at + any time you would like to unsubscribe from receiving future emails, you + can email us at contact@groa.us and we will promptly remove you from ALL + correspondence. Contacting Us If there are any questions regarding this + privacy policy you may contact us at contact@groa.us. +

+
); +} - -} - -export default PrivacyPolicy; \ No newline at end of file +export default PrivacyPolicy; From b9c082c6576aa7abb524c1a3a029ec790b3d9b62 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:40:38 -0400 Subject: [PATCH 700/822] ran linter --- src/components/movies/MovieCard.js | 49 ++++++++++++++++-------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 0e0e365..7480d23 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -1,6 +1,10 @@ import React, { useState } from "react"; import { connect } from "react-redux"; -import { ratingAction, addToWatchlistAction, notWatchListAction } from "../../store/actions"; +import { + ratingAction, + addToWatchlistAction, + notWatchListAction, +} from "../../store/actions"; import Stars from "@material-ui/lab/Rating"; import StarBorderIcon from "@material-ui/icons/StarBorder"; //for grid @@ -150,15 +154,15 @@ const useStyles = makeStyles((theme) => ({ display: "flex", }, movieContentDiv: { - margin: 'auto', + margin: "auto", }, genresModal: { fontStyle: "italic", paddingTop: "3%", }, actionButtons: { - display: 'flex', - justifyContent:'center', + display: "flex", + justifyContent: "center", }, watchStarsModal: { display: "flex", @@ -235,7 +239,7 @@ function MovieCard({ /* Used for dynamically rendering the "Add to watchlist" button and if it's disabled */ const [added, setAdded] = useState(false); //to remove movie user not interested in - const [ removed, setRemoved] = useState(false); + const [removed, setRemoved] = useState(false); /* This checks if the movie is in the watchlist */ const inWatchlist = watchlist.some( (movie) => movie.name === name && movie.year === year @@ -285,7 +289,7 @@ function MovieCard({ notWatchListAction(userid, movie, accessToken); setRemoved(true); handleClose(); - } + }; const multiFunctions = () => { handleClose(); @@ -327,14 +331,13 @@ function MovieCard({ <>
- Random Movie poster as a placeholder. -
+

{name}

{year}

@@ -356,33 +359,31 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} + "" + )} {page === "Recommendations" ? ( ) : ( - "" - )} + "" + )}
{page === "watchlist" ? ( //
setDeleteMode(!deleteMode)}> @@ -472,9 +473,11 @@ const mapStateToProps = (state) => { watchlist: state.watchlist.movies, watchlistError: state.watchlist.error, ratings: state.rating.movies, - notwatchlist: state.notwatchlist.movies + notwatchlist: state.notwatchlist.movies, }; }; -export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction })( - MovieCard -); +export default connect(mapStateToProps, { + ratingAction, + addToWatchlistAction, + notWatchListAction, +})(MovieCard); From 4c1696f5e60c2e928a6c4d0e074f2412a4410e78 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:40:50 -0400 Subject: [PATCH 701/822] removed console.log --- src/components/auth/SearchBar.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 487b67e..8aac2a1 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -65,7 +65,8 @@ const Navigation = ({ searchAction, userid }) => { const handleSubmit = (e) => { if (e.keyCode === 13 && query.query !== "") - searchAction(userid, query, accessToken); + console.log("This is the query ", query); + searchAction(userid, query, accessToken); }; return ( From 67321bd66049b17ea0d632d58100cbd056af8a7b Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 00:41:11 -0400 Subject: [PATCH 702/822] removed console.log --- src/components/auth/SearchBar.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 8aac2a1..487b67e 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -65,8 +65,7 @@ const Navigation = ({ searchAction, userid }) => { const handleSubmit = (e) => { if (e.keyCode === 13 && query.query !== "") - console.log("This is the query ", query); - searchAction(userid, query, accessToken); + searchAction(userid, query, accessToken); }; return ( From eb727beadc05e23f8c61be3852477a547c2bc4eb Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:38:35 -0400 Subject: [PATCH 703/822] adjusted logout button on nav --- src/components/dashboard/Navigation.js | 38 +++++++++++++++++--------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 47d4452..b1d8cb7 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -45,6 +45,9 @@ import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; const drawerWidth = 240; const useStyles = makeStyles((theme) => ({ + logout: { + color: "white", + }, userIcon: { color: "white", }, @@ -136,7 +139,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -const Navigation = (props) => { +const Navigation = ({ userid, search }) => { //OKTA useOKTA AUTH const { authState, authService } = useOktaAuth(); @@ -145,6 +148,7 @@ const Navigation = (props) => { //for nav bar const theme = useTheme(); const [open, setOpen] = useState(false); + // for side bar menu const linkAttributes = [ { @@ -228,21 +232,21 @@ const Navigation = (props) => { alt="Groa Logo" /> - - + - + { href={`/${props.userid}/upload`} > Upload - - - Logout - - + */} + + Logout + + {/* */} - + {search ? : <>} + {/* */} { key={linkObject.id} button component="a" - href={`/${props.userid}/${linkObject.name.toLowerCase()}`} + onClick={linkObject.click} + href={`/${userid}/${linkObject.name.toLowerCase()}`} > {linkObject.icon} @@ -321,6 +332,7 @@ const mapStateToProps = (state) => { return { userid: state.login.userid, searchTerm: state.filter.searchTerm, + search: state.movie.search, }; }; export default connect(mapStateToProps, { From 687da9ada2679d8f240c9c4ad4993787f10d338c Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:38:55 -0400 Subject: [PATCH 704/822] state for searchBar --- package-lock.json | 638 +++++++------------------------ package.json | 1 + src/components/auth/SearchBar.js | 19 +- 3 files changed, 142 insertions(+), 516 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31edf60..907501f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5429,9 +5429,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "events": { "version": "3.1.0", @@ -6604,9 +6604,9 @@ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -14222,6 +14222,11 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-state-with-callback": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/use-state-with-callback/-/use-state-with-callback-1.0.18.tgz", + "integrity": "sha512-gqEed0KG20uzLdXkPDMGfabtLNd9EGhUPQKvxf8eBJ4iC/PCmcnhrfiUHs5LdhiGpPQJ9nNBErrz590asrntUA==" + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -14352,24 +14357,112 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" }, "dependencies": { "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -14386,510 +14479,32 @@ } }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.0" } } } @@ -14898,6 +14513,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -14905,12 +14521,14 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", diff --git a/package.json b/package.json index 80ca2df..3f50323 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "redux": "^4.0.5", "redux-logger": "^3.0.6", "redux-thunk": "^2.3.0", + "use-state-with-callback": "^1.0.18", "yup": "^0.28.3" }, "scripts": { diff --git a/src/components/auth/SearchBar.js b/src/components/auth/SearchBar.js index 487b67e..c5097e6 100644 --- a/src/components/auth/SearchBar.js +++ b/src/components/auth/SearchBar.js @@ -1,4 +1,5 @@ -import React, { useState } from "react"; +import React from "react"; +import useStateWithCallback from "use-state-with-callback"; import { connect } from "react-redux"; import { loginAction, searchAction } from "../../store/actions"; import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; @@ -55,17 +56,23 @@ const Navigation = ({ searchAction, userid }) => { const { authState } = useOktaAuth(); const { accessToken } = authState; const classes = useStyles(); - const [query, setQuery] = useState({ - query: "", - }); + const [query, setQuery] = useStateWithCallback( + { + query: "", + }, + (query) => { + searchAction(userid, query, accessToken); + } + ); const handleChange = (e) => { setQuery({ query: e.target.value }); }; const handleSubmit = (e) => { - if (e.keyCode === 13 && query.query !== "") + if (query.query === "") { searchAction(userid, query, accessToken); + } }; return ( @@ -84,7 +91,7 @@ const Navigation = ({ searchAction, userid }) => { input: classes.inputInput, }} inputProps={{ "aria-label": "search" }} - onKeyDown={handleSubmit} + onSubmit={handleSubmit} />
From c54ff9ed23f746b47fd6051d111f700d456af3fb Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:39:14 -0400 Subject: [PATCH 705/822] added query state to onboarding --- src/components/auth/Onboarding.js | 167 ++++++++++++++++++++---------- 1 file changed, 113 insertions(+), 54 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index abc85e6..d8e206a 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -86,60 +86,119 @@ function Onboarding({ else return (
- - {movies - .filter((movie) => - !ratings.includes( - (film) => - film.film.title === movie.title && film.year === movie.year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return film.title === movie.title && film.year === movie.year; - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} -
+ {isSearching ? ( + + {" "} + {queries + .filter((movie) => + !ratings.includes( + (film) => + film.film.title === movie.title && film.year === movie.year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return film.title === movie.title && film.year === movie.year; + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ ) : ( + + {" "} + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.film.title === movie.title && film.year === movie.year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return film.title === movie.title && film.year === movie.year; + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ )} Date: Thu, 21 May 2020 02:39:34 -0400 Subject: [PATCH 706/822] added query data to explore --- src/components/dashboard/Explore.js | 192 +++++++++++++++++++--------- 1 file changed, 134 insertions(+), 58 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index cb5b1be..e27e0cf 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -1,7 +1,11 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { getMoviesAction, setFilter, notWatchListAction } from "../../store/actions/index.js"; +import { + getMoviesAction, + setFilter, + notWatchListAction, +} from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -35,7 +39,9 @@ function Explore({ searchTerm, setFilter, ratings, - notWatchListAction + queries, + isSearching, + notWatchListAction, }) { const classes = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -48,8 +54,14 @@ function Explore({ // Returns the movies getMoviesAction(userid, accessToken); notWatchListAction(userid, accessToken); - - }, [getMoviesAction,notWatchListAction, userid, ratings, setFilter, accessToken]); + }, [ + getMoviesAction, + notWatchListAction, + userid, + ratings, + setFilter, + accessToken, + ]); // How many movies render const cardAmount = 40; @@ -57,59 +69,121 @@ function Explore({ if (isFetching) return ; else return ( - - {movies - .filter((movie) => - !ratings.includes( - (film) => film.title === movie.title && film.year === movie.year - ).length && searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .slice(0, cardAmount) - .map((movie, index) => { - /* Checks if the film is in ratings */ - const isRated = (film) => { - return film.title === movie.title && film.year === movie.year; - }; - /* Returns the movie object if in ratings */ - let rated = ratings.find(isRated); - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} -
+ <> + {isSearching ? ( + + {" "} + {queries + .filter((movie) => + !ratings.includes( + (film) => + film.title === movie.title && film.year === movie.year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return film.title === movie.title && film.year === movie.year; + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ ) : ( + + {" "} + {movies + .filter((movie) => + !ratings.includes( + (film) => + film.title === movie.title && film.year === movie.year + ).length && searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .slice(0, cardAmount) + .map((movie, index) => { + /* Checks if the film is in ratings */ + const isRated = (film) => { + return film.title === movie.title && film.year === movie.year; + }; + /* Returns the movie object if in ratings */ + let rated = ratings.find(isRated); + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} +
+ )} + ); } @@ -122,10 +196,12 @@ const mapStateToProps = (state) => { searchTerm: state.filter.searchTerm, watchlist: state.watchlist.movies, ratings: state.rating.movies, + queries: state.search.queries, + isSearching: state.search.isSearching, }; }; export default connect(mapStateToProps, { getMoviesAction, setFilter, - notWatchListAction + notWatchListAction, })(Explore); From 10dc9e2850cb0086934844f99732c2bece1bd87f Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:39:55 -0400 Subject: [PATCH 707/822] adjusted action to account for empty search to reset --- src/store/actions/searchAction.js | 47 ++++++++++++++++++------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/store/actions/searchAction.js b/src/store/actions/searchAction.js index 00f0b79..677c7f9 100644 --- a/src/store/actions/searchAction.js +++ b/src/store/actions/searchAction.js @@ -2,26 +2,35 @@ import axiosWithAuth from "../../utils/axiosWithAuth.js"; export const START_SEARCH_START = "START_SEARCH_START"; export const START_SEARCH_SUCCESS = "START_SEARCH_SUCCESS"; export const START_SEARCH_FAIL = "START_SEARCH_FAIL"; +export const EMPTY_SEARCH = "EMPTY_SEARCH"; export function searchAction(id, query, token) { - return (dispatch) => { - dispatch({ - type: START_SEARCH_START, - }); - axiosWithAuth(token) - .post(`/${id}/search`, query) - .then((res) => { - dispatch({ - type: START_SEARCH_SUCCESS, - payload: res.data, - }); - }) - .catch((err) => { - console.log("Error: ", err); - dispatch({ - type: START_SEARCH_FAIL, - payload: err, - }); + if (query.query === "") { + return (dispatch) => { + dispatch({ + type: EMPTY_SEARCH, }); - }; + }; + } else { + return (dispatch) => { + dispatch({ + type: START_SEARCH_START, + }); + axiosWithAuth(token) + .post(`/${id}/search`, query) + .then((res) => { + dispatch({ + type: START_SEARCH_SUCCESS, + payload: res.data, + }); + }) + .catch((err) => { + console.log("Error: ", err); + dispatch({ + type: START_SEARCH_FAIL, + payload: err, + }); + }); + }; + } } From e5fc33d38c914f950958b0f647c362f4404f117e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:40:11 -0400 Subject: [PATCH 708/822] to show search bar in explore page --- src/store/reducers/movieReducer.js | 68 +++++++++++++++--------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src/store/reducers/movieReducer.js b/src/store/reducers/movieReducer.js index cc19b7b..671196c 100644 --- a/src/store/reducers/movieReducer.js +++ b/src/store/reducers/movieReducer.js @@ -1,38 +1,40 @@ import { - FETCHING_MOVIES_START, - FETCHING_MOVIES_SUCCESS, - FETCHING_MOVIES_FAIL + FETCHING_MOVIES_START, + FETCHING_MOVIES_SUCCESS, + FETCHING_MOVIES_FAIL, } from "../actions/movieAction"; const initialState = { - movies: [], - isFetching: false, - error: "" - }; - + movies: [], + isFetching: false, + error: "", + search: false, +}; + export const movie = (state = initialState, action) => { - switch (action.type) { - // GET MOVIES - case FETCHING_MOVIES_START: - return { - ...state, - isFetching: true - } - // GET MOVIES SUCCESS - case FETCHING_MOVIES_SUCCESS: - return { - ...state, - isFetching: false, - movies: action.payload - }; - // GET MOVIES FAIL - case FETCHING_MOVIES_FAIL: - return { - ...state, - isFetching: false, - error: action.payload - }; - default: - return state; -} -}; \ No newline at end of file + switch (action.type) { + // GET MOVIES + case FETCHING_MOVIES_START: + return { + ...state, + isFetching: true, + search: true, + }; + // GET MOVIES SUCCESS + case FETCHING_MOVIES_SUCCESS: + return { + ...state, + isFetching: false, + movies: action.payload, + }; + // GET MOVIES FAIL + case FETCHING_MOVIES_FAIL: + return { + ...state, + isFetching: false, + error: action.payload, + }; + default: + return state; + } +}; From 82b0310bfaad9d43a5878adca048dbdef9a862fe Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:40:49 -0400 Subject: [PATCH 709/822] set empty search from action to reducer --- src/store/reducers/searchReducer.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/store/reducers/searchReducer.js b/src/store/reducers/searchReducer.js index 8e6944b..a12c088 100644 --- a/src/store/reducers/searchReducer.js +++ b/src/store/reducers/searchReducer.js @@ -2,6 +2,7 @@ import { START_SEARCH_START, START_SEARCH_SUCCESS, START_SEARCH_FAIL, + EMPTY_SEARCH, } from "../actions/searchAction.js"; const initialState = { @@ -12,6 +13,11 @@ const initialState = { export const search = (state = initialState, action) => { switch (action.type) { + case EMPTY_SEARCH: + return { + ...state, + isSearching: false, + }; case START_SEARCH_START: return { ...state, @@ -20,7 +26,7 @@ export const search = (state = initialState, action) => { case START_SEARCH_SUCCESS: return { ...state, - isSearching: false, + isSearching: true, queries: action.payload, }; case START_SEARCH_FAIL: From b0818a53ff4e3873f2c73b4f27a949e945edaaa9 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:42:00 -0400 Subject: [PATCH 710/822] removed unused imports --- src/components/dashboard/Navigation.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index b1d8cb7..369b5ac 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -28,13 +28,8 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemIcon from "@material-ui/core/ListItemIcon"; import ListItemText from "@material-ui/core/ListItemText"; import ClickAwayListener from "@material-ui/core/ClickAwayListener"; - -//for user toggle menu -import Button from "@material-ui/core/Button"; -import Menu from "@material-ui/core/Menu"; import MenuItem from "@material-ui/core/MenuItem"; //icons -import PersonRoundedIcon from "@material-ui/icons/PersonRounded"; import PublishRoundedIcon from "@material-ui/icons/PublishRounded"; import SearchRoundedIcon from "@material-ui/icons/SearchRounded"; import ThumbUpRoundedIcon from "@material-ui/icons/ThumbUpRounded"; @@ -186,15 +181,6 @@ const Navigation = ({ userid, search }) => { setOpen(false); }; //for user icon menu - const [anchorEl, setAnchorEl] = useState(null); - - const handleClick = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; const classes = useStyles(); From 0183404396325cdcd19757bc06c09f1f5773122e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 21 May 2020 02:43:14 -0400 Subject: [PATCH 711/822] added comment for commented out code --- src/components/dashboard/Navigation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 369b5ac..3ec2d94 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -218,6 +218,7 @@ const Navigation = ({ userid, search }) => { alt="Groa Logo" /> + {/* Below commented out code to be used in the future for profile page */} {/* +
+ + + - +
) })} From 9e166141e56531c81c4cb798d74b7e2596ed9e6d Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Wed, 20 May 2020 23:52:13 -0700 Subject: [PATCH 713/822] changed font of drop down menu --- src/components/movies/MovieCard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 5e72bef..2787677 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -62,8 +62,8 @@ const useStyles = makeStyles((theme) => ({ backgroundColor: '#212120', }, heading: { - fontSize: theme.typography.pxToRem(15), - fontWeight: theme.typography.fontWeightRegular, + // fontSize: theme.typography.pxToRem(15), + // fontWeight: theme.typography.fontWeightRegular, }, nameModal: { fontSize: "25px", From acdfe73cdf3e3a00387cafe6cd665ea88d5765d8 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 21 May 2020 10:10:26 -0700 Subject: [PATCH 714/822] providers appear on explore page --- src/components/dashboard/Explore.js | 3 +++ src/components/dashboard/Ratings.js | 29 +++++++++++------------------ src/components/movies/MovieCard.js | 15 +++++---------- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 7230775..8389319 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -84,6 +84,8 @@ function Explore({ return film.title === movie.title && film.year === movie.year; }; /* Returns the movie object if in ratings */ + // console.log('inratings',movie.movie_id) + let rated = ratings.find(isRated); let posterURI = movie.poster_url; let unsplashUrl = @@ -95,6 +97,7 @@ function Explore({ key={index} page={"Explore"} name={movie.title} + movie_id={movie.movie_id} year={movie.year} description={movie.description} genres={movie.genres} diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 7c1fdde..8c8bea7 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -1,7 +1,7 @@ import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { getRatingAction, setFilter, serviceProviderAction } from "../../store/actions/index.js"; +import { getRatingAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; // children components @@ -33,8 +33,6 @@ function Ratings({ ratings, searchTerm, setFilter, - serviceProviderAction, - serviceProvider }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -46,12 +44,8 @@ function Ratings({ setFilter(""); // Returns the ratings getRatingAction(userid, accessToken); - - }, [getRatingAction, userid, setFilter, accessToken]); - // const handleClickProvider = (user_id, access_Token, movie_id) => { - // serviceProviderAction(user_id, access_Token, movie_id) - // }; + }, [getRatingAction, userid, setFilter, accessToken]); if (isFetching) return ; else @@ -61,14 +55,14 @@ function Ratings({ cols={screenWidth ? 2 : 5} cellHeight="auto" > - + {ratings .filter((movie) => searchTerm !== "" ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -92,10 +86,10 @@ function Ratings({ // serviceLinks={serviceProvider.link} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } @@ -114,9 +108,8 @@ const mapStateToProps = (state) => { ratings: state.rating.movies, ratingsError: state.rating.error, searchTerm: state.filter.searchTerm, - serviceProvider: state.serviceProvider.serviceProviders }; }; -export default connect(mapStateToProps, { getRatingAction, setFilter, serviceProviderAction })( +export default connect(mapStateToProps, { getRatingAction, setFilter })( Ratings ); diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 2787677..4b37542 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -198,8 +198,8 @@ const useStyles = makeStyles((theme) => ({ flexDirection: "column", justifyContent: "space-evenly", }, - trailerModal:{ -marginTop:'2%', + trailerModal: { + marginTop: '2%', }, expansionPanal: { // margin:'auto', @@ -223,9 +223,9 @@ marginTop:'2%', }, serviceBtn: { textDecoration: 'none', - margin:'1%', - width:'150px', - + margin: '1%', + width: '150px', + // color: 'red', // border: '2px solid green', // textAlign: 'center', @@ -515,7 +515,6 @@ function MovieCard({ onClick={handleClose} /> )} -
-
) })} -
-
-
{page !== "Onboarding" ? ( ) : ( - "" - )} + "" + )}
From 724906d3cee304aee9e84736a33e7a93db29a0f6 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 26 May 2020 11:10:25 -0400 Subject: [PATCH 744/822] remove console log on widthFinder --- src/utils/widthFinder.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/widthFinder.js b/src/utils/widthFinder.js index 081e545..6488cba 100644 --- a/src/utils/widthFinder.js +++ b/src/utils/widthFinder.js @@ -1,5 +1,4 @@ const widthFinder = (screenWidth) => { - console.log("This is the size: ", screenWidth); if (parseInt(screenWidth) < 450) { return true; } else { From 1f63ebdc8cda812819fc3175eeb42b98d0344f97 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 26 May 2020 09:30:06 -0700 Subject: [PATCH 745/822] update moviecard --- src/components/movies/MovieCard.js | 120 ++++++++++++++--------------- src/utils/axiosWithAuth.js | 2 +- 2 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 1f7cb68..bce3295 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -75,17 +75,17 @@ const DialogTitle = withStyles(styles)((props) => { const useStyles = makeStyles((theme) => ({ - // heading: { - // fontSize: theme.typography.pxToRem(15), - // fontWeight: theme.typography.fontWeightRegular, - // }, + heading: { + fontSize: theme.typography.pxToRem(15), + fontWeight: theme.typography.fontWeightRegular, + }, nameModal: { fontSize: "25px", textAlign: 'center', }, cardContent: { height: "100%", - padding:0, + padding: 0, }, movieImg: { width: "100%", @@ -195,18 +195,18 @@ const useStyles = makeStyles((theme) => ({ display: "flex", justifyContent: "center", }, - starRoot:{ + starRoot: { display: 'flex', - width:'50%', - margin:'auto', + width: '50%', + margin: 'auto', // flexDirection: 'column', - justifyContent:'center', + justifyContent: 'center', // '& > * + *': { // marginTop: theme.spacing(1), // }, }, - starRootOnboarding:{ - width:'100%', + starRootOnboarding: { + width: '100%', }, watchStarsModal: { display: "flex", @@ -219,7 +219,7 @@ const useStyles = makeStyles((theme) => ({ starsModal: { justifyContent: "center", // display: "flex", - // fontSize: "3vw", + fontSize: "3vw", // margin:'auto', }, actionBtn: { @@ -236,26 +236,30 @@ const useStyles = makeStyles((theme) => ({ // margin: 'auto', // backgroundColor: '#212120', // }, + root: { + // dislay:'flex', + // justifyContent:'center', + }, btnsProviders: { backgroundColor: '#212120', color: 'white', }, - // expansionPanal: { - // margin:'auto', - // width:'80%', - // backgroundColor: '#212120', - // }, - // expansionPanalSummary: { - // backgroundColor:'white', - // margin:'auto', - // width:'80%', - // backgroundColor: '#212120', + expansionPanal: { + dislay: 'flex', + justifyContent: 'center', + margin: 'auto', + width: '80%', + backgroundColor: '#212120', + }, + expansionPanalSummary: { + backgroundColor: 'white', + margin: 'auto', + width: '80%', + backgroundColor: '#212120', - // }, + }, serviceInfo: { - display: 'flex', - flexWrap: 'wrap', - justifyContent: 'center', + textAlign: 'center', }, Link: { textDecoration: 'none', @@ -263,14 +267,6 @@ const useStyles = makeStyles((theme) => ({ serviceBtn: { textDecoration: 'none', margin: '1%', - // width: '150px', - - // color: 'red', - // border: '2px solid green', - // textAlign: 'center', - // "&:hover": { - // backgroundColor:'green' - // }, }, [theme.breakpoints.down("xs")]: { name: { @@ -545,32 +541,32 @@ function MovieCard({ "" )} {page === "Onboarding" ? ( - - } - emptyIcon={ - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - onClick={multiFunctions} - /> - + + } + emptyIcon={ + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + onClick={multiFunctions} + /> + ) : ( - - } - emptyIcon={ + + } + emptyIcon={ - + /> + )} {page !== 'watchlist' && page !== 'Onboarding' ? (
@@ -592,7 +588,7 @@ function MovieCard({ className={classes.expansionPanalSummary} onClick={handleClickProviders} > - Service Providers + Where to Watch
{serviceProvider diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index 3c6b489..616e306 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -6,7 +6,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: process.env.REACT_APP_BASEURL + baseURL: 'http://localhost:5000/api/users' }) } export default axiosWithAuth; \ No newline at end of file From 05a9921d9967d1f7991a6caae8dbe0cce8b64c1b Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Tue, 26 May 2020 14:22:00 -0400 Subject: [PATCH 746/822] removed unused filter method --- src/components/dashboard/Ratings.js | 70 +++++++++++++---------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 9c0b42f..41754a3 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -44,7 +44,6 @@ function Ratings({ setFilter(""); // Returns the ratings getRatingAction(userid, accessToken); - }, [getRatingAction, userid, setFilter, accessToken]); if (isFetching) return ; @@ -55,45 +54,36 @@ function Ratings({ cols={screenWidth ? 2 : 5} cellHeight="auto" > - {ratings - .filter((movie) => - searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- -
- ); - })} + {ratings.map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ +
+ ); + })} ); } From 98ec4d6787becf5ec855c08aa1a72002961bf682 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 26 May 2020 11:34:15 -0700 Subject: [PATCH 747/822] open link in new tab --- package-lock.json | 3 ++- src/components/movies/MovieCard.js | 43 +++++++++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 048e117..0018023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7410,7 +7410,8 @@ }, "yargs-parser": { "version": "13.1.1", - "resolved": "", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 0c8d6e3..7c56a25 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -237,9 +237,10 @@ const useStyles = makeStyles((theme) => ({ // margin: 'auto', // backgroundColor: '#212120', // }, - root: { - // dislay:'flex', - // justifyContent:'center', + ExpansionRoot: { + margin:'auto', + // backgroundColor:'#00B392', +padding:'0 10%', }, btnsProviders: { backgroundColor: "#212120", @@ -249,15 +250,13 @@ const useStyles = makeStyles((theme) => ({ dislay: 'flex', justifyContent: 'center', margin: 'auto', - width: '80%', - backgroundColor: '#212120', + // width: '80%', + background: "rgb(23, 23, 23, .96)", + boxShadow: theme.shadows[5], + }, expansionPanalSummary: { - backgroundColor: 'white', margin: 'auto', - width: '80%', - backgroundColor: '#212120', - }, serviceInfo: { textAlign: 'center', @@ -498,13 +497,13 @@ function MovieCard({ {inRatings || yourRating ? "Your rating:" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} + "" + )} {page === "Recommendations" ? ( @@ -521,8 +520,8 @@ function MovieCard({ ) : ( - "" - )} + "" + )}
{page === "watchlist" ? ( //
setDeleteMode(!deleteMode)}> @@ -540,9 +539,9 @@ function MovieCard({ )} ) : ( - //
- "" - )} + //
+ "" + )} {page === "Onboarding" ? ( )} {page !== 'watchlist' && page !== 'Onboarding' ? ( -
+
} @@ -602,7 +601,7 @@ function MovieCard({ .map((serviceProviders) => { return (
- +
@@ -719,8 +718,8 @@ function MovieCard({ allowFullScreen > ) : ( - "" - )} + "" + )}
From 04010a1c75413f10ca41c46e7935ff29e0887156 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 26 May 2020 11:39:08 -0700 Subject: [PATCH 748/822] remove underline on hover --- src/components/movies/MovieCard.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 7c56a25..46dfd58 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -229,7 +229,7 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "space-evenly", }, trailerModal: { - marginTop: "10%", + marginTop: "5%", padding: "0 1.5rem", }, // gridProvider: { @@ -240,7 +240,7 @@ const useStyles = makeStyles((theme) => ({ ExpansionRoot: { margin:'auto', // backgroundColor:'#00B392', -padding:'0 10%', +padding:'0 15%', }, btnsProviders: { backgroundColor: "#212120", @@ -263,6 +263,9 @@ padding:'0 10%', }, Link: { textDecoration: "none", + "&:hover": { + textDecoration: "none", + }, }, serviceBtn: { textDecoration: 'none', From c5cbdac297a0e823663e6771da245042d76bc75e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 26 May 2020 11:42:04 -0700 Subject: [PATCH 749/822] styled service btns --- src/components/movies/MovieCard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 46dfd58..ab91d64 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -229,7 +229,7 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "space-evenly", }, trailerModal: { - marginTop: "5%", + margin: "3% 0", padding: "0 1.5rem", }, // gridProvider: { From 4f38b10cefebdb90f0cd2026ec964948969fa15e Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Tue, 26 May 2020 11:51:56 -0700 Subject: [PATCH 750/822] will not close moviecard, if not interested in mov --- src/components/movies/MovieCard.js | 90 ------------------------------ 1 file changed, 90 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ab91d64..1ffe904 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -415,7 +415,6 @@ function MovieCard({ const notWatch = { movie_id: movie.movie_id, user_id: userid }; notWatchListAction(userid, notWatch, accessToken); setRemoved(true); - handleClose(); }; const handleClickProviders = () => { @@ -616,96 +615,8 @@ function MovieCard({ ) : ( "" )} - {/* {page !== 'watchlist' && page !== 'Onboarding' ? ( - - - - - - - - {({ TransitionProps, placement }) => ( - - - - - {serviceProvider.map( - (serviceProviders, index) => { - return ( - - handleMenuItemClick(event, index) - } - > - - - - - ); - } - )} - - - - - )} - - - - ) : ( - "" - )} */}
- {page !== "Onboarding" ? ( ) : ( - "" - )} + "" + )} + {page === "Ratings" ? ( + + + + ) : ( + "" + )}
@@ -600,4 +619,5 @@ export default connect(mapStateToProps, { ratingAction, addToWatchlistAction, notWatchListAction, + removeRatingAction, })(MovieCard); From 8d6e6121676d9db4b7907df2d2e459fcaf3bea15 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 15:35:26 -0400 Subject: [PATCH 783/822] added remove ratings action --- src/store/actions/index.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/store/actions/index.js b/src/store/actions/index.js index d76b914..a4cfc65 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -1,5 +1,9 @@ import { loginAction } from "./loginAction.js"; -import { ratingAction, getRatingAction } from "./ratingAction.js"; +import { + ratingAction, + getRatingAction, + removeRatingAction, +} from "./ratingAction.js"; import { registerAction } from "./registerAction.js"; import { recommendationAction } from "./recommendationActions.js"; import { uploadAction, toggleIsUploaded } from "./uploadAction.js"; @@ -8,18 +12,18 @@ import { removeFromWatchlistAction, getWatchlistAction, } from "./watchlistActions.js"; -import { getMoviesAction } from "./movieAction" +import { getMoviesAction } from "./movieAction"; import { setFilter } from "./filterActions.js"; -import { notWatchListAction } from './notWatchListAction.js'; -import { serviceProviderAction } from './serviceProviderAction.js'; +import { notWatchListAction } from "./notWatchListAction.js"; +import { serviceProviderAction } from "./serviceProviderAction.js"; import { searchAction } from "./searchAction.js"; -import { +import { horrorLandingAction, comedyLandingAction, dramaLandingAction, romanceLandingAction, - staffLandingAction - } from "./landingPageAction"; + staffLandingAction, +} from "./landingPageAction"; export { loginAction, @@ -41,5 +45,6 @@ export { comedyLandingAction, dramaLandingAction, romanceLandingAction, - staffLandingAction + staffLandingAction, + removeRatingAction, }; From 86fa9f10e3951f32629b9df3df0fece2eef72b6f Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 15:35:42 -0400 Subject: [PATCH 784/822] created remove ratings actions --- src/store/actions/ratingAction.js | 67 +++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/src/store/actions/ratingAction.js b/src/store/actions/ratingAction.js index 8aab252..1a8dee8 100644 --- a/src/store/actions/ratingAction.js +++ b/src/store/actions/ratingAction.js @@ -5,26 +5,29 @@ export const ADDING_RATING_FAIL = "ADDING_RATING_FAIL"; export const FETCHING_RATINGS_START = "FETCHING_RATINGS_START"; export const FETCHING_RATINGS_SUCCESS = "FETCHING_RATINGS_SUCCESS"; export const FETCHING_RATINGS_FAIL = "FETCHING_RATINGS_FAIL"; +export const REMOVE_RATINGS_START = "REMOVE_RATINGS_START"; +export const REMOVE_RATINGS_SUCCESS = "REMOVE_RATINGS_SUCCESS"; +export const REMOVE_RATINGS_FAIL = "REMOVE_RATINGS_FAIL"; // RATINGS export function ratingAction(id, rating, token) { - return dispatch => { + return (dispatch) => { dispatch({ - type: ADDING_RATING_START + type: ADDING_RATING_START, }); axiosWithAuth(token) .post(`/${id}/add-movie-rating`, rating) - .then(res => { + .then((res) => { dispatch({ type: ADDING_RATING_SUCCESS, - payload: res.data + payload: res.data, }); }) - .catch(err => { + .catch((err) => { console.log("ERROR: ", err); dispatch({ type: ADDING_RATING_FAIL, - payload: err + payload: err, }); }); }; @@ -32,23 +35,61 @@ export function ratingAction(id, rating, token) { //GET RATINGS export function getRatingAction(id, token) { - return dispatch => { + return (dispatch) => { dispatch({ - type: FETCHING_RATINGS_START + type: FETCHING_RATINGS_START, }); axiosWithAuth(token) .get(`/${id}/get-ratings`) - .then(res => { + .then((res) => { dispatch({ type: FETCHING_RATINGS_SUCCESS, - payload: res.data + payload: res.data, }); }) - .catch(err => { + .catch((err) => { dispatch({ type: FETCHING_RATINGS_FAIL, - payload: err + payload: err, }); }); }; -} \ No newline at end of file +} + +export function removeRatingAction(id, removedRating, token) { + return (dispatch) => { + dispatch({ + type: REMOVE_RATINGS_START, + }); + console.log("this is the removed movie: ", removedRating); + axiosWithAuth(token) + .post(`/${id}/remove-rating`, removedRating) + .then((res) => { + dispatch({ + type: REMOVE_RATINGS_SUCCESS, + payload: res.data, + }); + axiosWithAuth(token) + .get(`/${id}/get-ratings`) + .then((res) => { + dispatch({ + type: FETCHING_RATINGS_SUCCESS, + payload: res.data, + }); + }) + .catch((err) => { + dispatch({ + type: FETCHING_RATINGS_FAIL, + payload: err, + }); + }); + }) + .catch((err) => { + console.log("ERROR: ", err); + dispatch({ + type: REMOVE_RATINGS_FAIL, + payload: err, + }); + }); + }; +} From e9788bbfc85f442c3fe60d314fcc5451340feb6e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 15:35:56 -0400 Subject: [PATCH 785/822] added remove state to reducer --- src/store/reducers/ratingReducer.js | 142 ++++++++++++++++------------ 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/src/store/reducers/ratingReducer.js b/src/store/reducers/ratingReducer.js index a8420f3..7303aec 100644 --- a/src/store/reducers/ratingReducer.js +++ b/src/store/reducers/ratingReducer.js @@ -1,64 +1,82 @@ import { - ADDING_RATING_START, - ADDING_RATING_SUCCESS, - ADDING_RATING_FAIL, + ADDING_RATING_START, + ADDING_RATING_SUCCESS, + ADDING_RATING_FAIL, + FETCHING_RATINGS_START, + FETCHING_RATINGS_SUCCESS, + FETCHING_RATINGS_FAIL, + REMOVE_RATINGS_START, + REMOVE_RATINGS_SUCCESS, + REMOVE_RATINGS_FAIL, +} from "../actions/ratingAction"; - FETCHING_RATINGS_START, - FETCHING_RATINGS_SUCCESS, - FETCHING_RATINGS_FAIL - } from "../actions/ratingAction"; - - const initialState = { - movies: [], - isAdding: false, - isFetching: false, - error: "" - }; - - export const rating = (state = initialState, action) => { - switch (action.type) { - // ADD RATING - case ADDING_RATING_START: - return { - ...state, - isAdding: true - } - // ADD RATING SUCCESS - case ADDING_RATING_SUCCESS: - return { - ...state, - isAdding: false, - - }; - // ADD RATING FAIL - case ADDING_RATING_FAIL: - return { - ...state, - isAdding: false, - error: action.payload - }; - // GET RATINGS - case FETCHING_RATINGS_START: - return { - ...state, - isFetching: true - } - // GET RATINGS SUCCESS - case FETCHING_RATINGS_SUCCESS: - return { - ...state, - isFetching: false, - movies: action.payload - }; - // GET RATINGS FAIL - case FETCHING_RATINGS_FAIL: - return { - ...state, - isFetching: false, - error: action.payload - }; - default: - return state; - } - }; - \ No newline at end of file +const initialState = { + movies: [], + isAdding: false, + isFetching: false, + error: "", +}; + +export const rating = (state = initialState, action) => { + switch (action.type) { + // ADD RATING + case ADDING_RATING_START: + return { + ...state, + isAdding: true, + }; + // ADD RATING SUCCESS + case ADDING_RATING_SUCCESS: + return { + ...state, + isAdding: false, + }; + // ADD RATING FAIL + case ADDING_RATING_FAIL: + return { + ...state, + isAdding: false, + error: action.payload, + }; + // GET RATINGS + case FETCHING_RATINGS_START: + return { + ...state, + isFetching: true, + }; + // GET RATINGS SUCCESS + case FETCHING_RATINGS_SUCCESS: + return { + ...state, + isFetching: false, + movies: action.payload, + }; + // GET RATINGS FAIL + case FETCHING_RATINGS_FAIL: + return { + ...state, + isFetching: false, + error: action.payload, + }; + // GET RATINGS + case REMOVE_RATINGS_START: + return { + ...state, + isFetching: true, + }; + // GET RATINGS SUCCESS + case REMOVE_RATINGS_SUCCESS: + return { + ...state, + }; + // GET RATINGS FAIL + case REMOVE_RATINGS_FAIL: + return { + ...state, + isFetching: false, + error: action.payload, + }; + default: + return state; + } +}; From 893ba73b19836ae0c412f7612f56e23e43c7d208 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 15:36:08 -0400 Subject: [PATCH 786/822] added placeholder image --- src/img/placeholderposter.jpeg | Bin 0 -> 28226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/img/placeholderposter.jpeg diff --git a/src/img/placeholderposter.jpeg b/src/img/placeholderposter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..56bd8b6b4a451d1614127c28c4a9514b3170abfa GIT binary patch literal 28226 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 Date: Thu, 28 May 2020 12:36:34 -0700 Subject: [PATCH 787/822] movie cards can be removed from watchlist --- src/components/dashboard/Watchlist.js | 1 + src/components/movies/MovieCard.js | 8 ++++---- src/store/actions/removeWatchListAction.js | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 934262b..5da92b9 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -93,6 +93,7 @@ function Watchlist({ trailer={movie.trailer_url} description={movie.description} genres={movie.genres} + movie_id={movie.movie_id} page="watchlist" image={ !posterURI || diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index c668ff6..2c9308b 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -380,8 +380,8 @@ function MovieCard({ setRemoved(true); }; const handleClickDeleteFromWatchlist = () => { - const removefromWatchlist = { movie_id: movie.movie_id, user_id: userid}; - removeWatchListAction( userid, removefromWatchlist, accessToken); + console.log('thisi sin move', movie_id) + removeWatchListAction( userid, movie_id, accessToken); setDeleted(true); } @@ -501,8 +501,8 @@ function MovieCard({ color="primary" > {!deleted && !removeInWatchlist - ? "Remove" - : "Removed from Results"} + ? "Remove from Watchlist" + : "Removed from Watchlist"} ) : ( diff --git a/src/store/actions/removeWatchListAction.js b/src/store/actions/removeWatchListAction.js index 28671bb..aac6d94 100644 --- a/src/store/actions/removeWatchListAction.js +++ b/src/store/actions/removeWatchListAction.js @@ -4,6 +4,7 @@ export const REMOVEFROMWATCHLIST_SUCCESS = 'REMOVEFROMWATCHLIST_SUCCESS'; export const REMOVEFROMWATCHLIST_FAIL = 'REMOVEFROMWATCHLIST_FAIL'; export function removeWatchListAction(id, movie_id, token) { + console.log('mvie id', movie_id) return(dispatch) => { dispatch({ type: REMOVEFROMWATCHLIST_START, @@ -11,11 +12,11 @@ export function removeWatchListAction(id, movie_id, token) { axiosWithAuth(token) .post(`/watchlist/${id}/remove/${movie_id}`) .then( res => { - console.log(res.data); dispatch({ type: REMOVEFROMWATCHLIST_SUCCESS, payload: res.data, }); + console.log('data from front end',res.data); }) .catch( err => { dispatch({ From 9665562b0cb9632b70d889e1966490a0a11fbec4 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 15:51:02 -0400 Subject: [PATCH 788/822] remove image --- src/img/placeholderposter.jpeg | Bin 28226 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/img/placeholderposter.jpeg diff --git a/src/img/placeholderposter.jpeg b/src/img/placeholderposter.jpeg deleted file mode 100644 index 56bd8b6b4a451d1614127c28c4a9514b3170abfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28226 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 Date: Thu, 28 May 2020 15:52:08 -0400 Subject: [PATCH 789/822] added accesibility to movie posters --- src/components/movies/MovieCard.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 18f6adc..56253ad 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -415,11 +415,7 @@ function MovieCard({ <>
- Random Movie poster as a placeholder. + {name}
From fa489bb5b3893a07ec2415fa7b3f03e980bb0bb7 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:07:11 -0700 Subject: [PATCH 790/822] clean up code, delete action/reducers not needed --- src/components/movies/MovieCard.js | 5 +- src/store/actions/index.js | 2 +- src/store/actions/removeWatchListAction.js | 28 ---- src/store/actions/watchlistActions.js | 35 +++++ src/store/reducers/index.js | 2 - src/store/reducers/removeWatchListReducer.js | 33 ---- src/store/reducers/watchlistReducer.js | 150 +++++++++++-------- 7 files changed, 123 insertions(+), 132 deletions(-) delete mode 100644 src/store/actions/removeWatchListAction.js delete mode 100644 src/store/reducers/removeWatchListReducer.js diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 2c9308b..2a6ee3a 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -293,7 +293,7 @@ function MovieCard({ notWatchListAction, notwatchlist, removeWatchListAction, - removewatchlist + // removewatchlist }) { //OKTA AUTH const { authState, authService } = useOktaAuth(); @@ -316,7 +316,7 @@ function MovieCard({ const notInWatchlist = notwatchlist.some( (movie) => movie.name === name && movie.year === year ); - const removeInWatchlist = removewatchlist.some( + const removeInWatchlist = watchlist.some( (movie) => movie.name === name &&movie.year === year ); const inRatings = ratings.some( @@ -612,7 +612,6 @@ const mapStateToProps = (state) => { watchlistError: state.watchlist.error, ratings: state.rating.movies, notwatchlist: state.notwatchlist.movies, - removewatchlist: state.removewatchlist.movies, }; }; export default connect(mapStateToProps, { diff --git a/src/store/actions/index.js b/src/store/actions/index.js index ea6748d..0368f90 100644 --- a/src/store/actions/index.js +++ b/src/store/actions/index.js @@ -11,7 +11,7 @@ import { getMoviesAction } from "./movieAction" import { setFilter } from "./filterActions.js"; import { notWatchListAction } from './notWatchListAction.js'; import { serviceProviderAction } from './serviceProviderAction.js'; -import { removeWatchListAction } from './removeWatchListAction.js'; +import { removeWatchListAction } from './watchlistActions.js'; import { searchAction } from "./searchAction.js"; import { horrorLandingAction, diff --git a/src/store/actions/removeWatchListAction.js b/src/store/actions/removeWatchListAction.js deleted file mode 100644 index aac6d94..0000000 --- a/src/store/actions/removeWatchListAction.js +++ /dev/null @@ -1,28 +0,0 @@ -import axiosWithAuth from "../../utils/axiosWithAuth.js"; -export const REMOVEFROMWATCHLIST_START = 'REMOVEFROMWATCHLIST_START'; -export const REMOVEFROMWATCHLIST_SUCCESS = 'REMOVEFROMWATCHLIST_SUCCESS'; -export const REMOVEFROMWATCHLIST_FAIL = 'REMOVEFROMWATCHLIST_FAIL'; - -export function removeWatchListAction(id, movie_id, token) { - console.log('mvie id', movie_id) - return(dispatch) => { - dispatch({ - type: REMOVEFROMWATCHLIST_START, - }); - axiosWithAuth(token) - .post(`/watchlist/${id}/remove/${movie_id}`) - .then( res => { - dispatch({ - type: REMOVEFROMWATCHLIST_SUCCESS, - payload: res.data, - }); - console.log('data from front end',res.data); - }) - .catch( err => { - dispatch({ - type: REMOVEFROMWATCHLIST_FAIL, - payload: err - }) - }) - } -} \ No newline at end of file diff --git a/src/store/actions/watchlistActions.js b/src/store/actions/watchlistActions.js index 1a98814..60cc8f0 100644 --- a/src/store/actions/watchlistActions.js +++ b/src/store/actions/watchlistActions.js @@ -7,6 +7,10 @@ export const FETCHING_WATCHLIST_START = "FETCHING_WATCHLIST_START"; export const FETCHING_WATCHLIST_SUCCESS = "FETCHING_WATCHLIST_SUCCESS"; export const FETCHING_WATCHLIST_FAIL = "FETCHING_WATCHLIST_FAIL"; +export const REMOVEFROMWATCHLIST_START = 'REMOVEFROMWATCHLIST_START'; +export const REMOVEFROMWATCHLIST_SUCCESS = 'REMOVEFROMWATCHLIST_SUCCESS'; +export const REMOVEFROMWATCHLIST_FAIL = 'REMOVEFROMWATCHLIST_FAIL'; + // ADD TO WATCHLIST export function addToWatchlistAction(id, movie, token) { return dispatch => { @@ -52,3 +56,34 @@ export function getWatchlistAction(id, token) { }); }; } +// POST REMOVEFROMWATCHLIST +export function removeWatchListAction(id, movie_id, token) { + console.log('mvie id', movie_id) + return (dispatch) => { + dispatch({ + type: REMOVEFROMWATCHLIST_START, + }); + axiosWithAuth(token) + .post(`/watchlist/${id}/remove/${movie_id}`) + .then(res => { + dispatch({ + type: REMOVEFROMWATCHLIST_SUCCESS, + payload: res.data, + }); + axiosWithAuth(token) + .get(`/${id}/get-watchlist`) + .then(res => { + dispatch({ + type: FETCHING_WATCHLIST_SUCCESS, + payload: res.data + }); + }) + }) + .catch(err => { + dispatch({ + type: REMOVEFROMWATCHLIST_FAIL, + payload: err + }) + }) + } +} diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 8582d1a..871e1f9 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -9,7 +9,6 @@ import { watchlist } from './watchlistReducer'; import { movie } from './movieReducer'; import { notwatchlist } from './notWatchListReducer'; import { serviceProvider } from './serviceProviderReducer'; -import { removewatchlist } from './removeWatchListReducer'; import { search } from "./searchReducer"; import { landingPageReducer } from './landingPageReducer'; @@ -25,7 +24,6 @@ export const reducer = combineReducers({ search, notwatchlist, serviceProvider, - removewatchlist, landingPageReducer }); diff --git a/src/store/reducers/removeWatchListReducer.js b/src/store/reducers/removeWatchListReducer.js deleted file mode 100644 index 22b0047..0000000 --- a/src/store/reducers/removeWatchListReducer.js +++ /dev/null @@ -1,33 +0,0 @@ -import { - REMOVEFROMWATCHLIST_START, - REMOVEFROMWATCHLIST_SUCCESS, - REMOVEFROMWATCHLIST_FAIL, -} from '../actions/removeWatchListAction' - -const initialState = { - movies: [], - isRemoving: false, - error: '', -} -export const removewatchlist = (state = initialState, action) => { - switch (action.type) { - case REMOVEFROMWATCHLIST_START: - return { - ...state, - isRemoving: true, - }; - case REMOVEFROMWATCHLIST_SUCCESS: - return { - ...state, - isRemoving: false, - }; - case REMOVEFROMWATCHLIST_FAIL: - return { - ...state, - isRemoving: false, - error: action.payload, - }; - default: - return state; - } -} \ No newline at end of file diff --git a/src/store/reducers/watchlistReducer.js b/src/store/reducers/watchlistReducer.js index c6c13d6..e8457b4 100644 --- a/src/store/reducers/watchlistReducer.js +++ b/src/store/reducers/watchlistReducer.js @@ -1,68 +1,88 @@ import { - ADDING_WATCHLIST_START, - ADDING_WATCHLIST_SUCCESS, - ADDING_WATCHLIST_FAIL, + ADDING_WATCHLIST_START, + ADDING_WATCHLIST_SUCCESS, + ADDING_WATCHLIST_FAIL, - FETCHING_WATCHLIST_START, - FETCHING_WATCHLIST_SUCCESS, - FETCHING_WATCHLIST_FAIL - } from "../actions/watchlistActions"; - - const initialState = { - movies: [], - isFetching: false, - isAdding: false, - isDeleting: false, - error: "" - }; - - export const watchlist = (state = initialState, action) => { - switch (action.type) { - // ADD TO WATCHLIST START - case ADDING_WATCHLIST_START: - return { - ...state, - isAdding: true - } - // ADD TO WATCHLIST SUCCESS - case ADDING_WATCHLIST_SUCCESS: - return { - ...state, - isAdding: false, - - }; - - // ADD TO WATCHLIST FAIL - case ADDING_WATCHLIST_FAIL: - return { - ...state, - isAdding: false, - error: action.payload - }; + FETCHING_WATCHLIST_START, + FETCHING_WATCHLIST_SUCCESS, + FETCHING_WATCHLIST_FAIL, - // GET WATCHLIST START - case FETCHING_WATCHLIST_START: - return { - ...state, - isFetching: true - } - // GET WATCHLIST SUCCESS - case FETCHING_WATCHLIST_SUCCESS: - return { - ...state, - isFetching: false, - movies: action.payload - }; - - // GET WATCHLIST FAIL - case FETCHING_WATCHLIST_FAIL: - return { - ...state, - isFetching: false, - error: action.payload - }; - - default: - return state; - } - }; \ No newline at end of file + REMOVEFROMWATCHLIST_START, + REMOVEFROMWATCHLIST_SUCCESS, + REMOVEFROMWATCHLIST_FAIL, +} from "../actions/watchlistActions"; + +const initialState = { + movies: [], + isFetching: false, + isAdding: false, + isRemoving: false, + error: "" +}; + +export const watchlist = (state = initialState, action) => { + switch (action.type) { + // ADD TO WATCHLIST START + case ADDING_WATCHLIST_START: + return { + ...state, + isAdding: true + } + // ADD TO WATCHLIST SUCCESS + case ADDING_WATCHLIST_SUCCESS: + return { + ...state, + isAdding: false, + + }; + + // ADD TO WATCHLIST FAIL + case ADDING_WATCHLIST_FAIL: + return { + ...state, + isAdding: false, + error: action.payload + }; + + // GET WATCHLIST START + case FETCHING_WATCHLIST_START: + return { + ...state, + isFetching: true + } + // GET WATCHLIST SUCCESS + case FETCHING_WATCHLIST_SUCCESS: + return { + ...state, + isFetching: false, + movies: action.payload + }; + + // GET WATCHLIST FAIL + case FETCHING_WATCHLIST_FAIL: + return { + ...state, + isFetching: false, + error: action.payload + }; + //POST REMOVE FROM WATCH LIST + case REMOVEFROMWATCHLIST_START: + return { + ...state, + isRemoving: true, + }; + case REMOVEFROMWATCHLIST_SUCCESS: + return { + ...state, + isRemoving: false, + }; + case REMOVEFROMWATCHLIST_FAIL: + return { + ...state, + isRemoving: false, + error: action.payload, + }; + default: + return state; + } +}; \ No newline at end of file From 3c25518e0c72600278af5e3ce824d00960e8a1dd Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:07:59 -0700 Subject: [PATCH 791/822] watchlist automatically refreshes with btn to remove movie --- src/store/actions/watchlistActions.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/store/actions/watchlistActions.js b/src/store/actions/watchlistActions.js index 60cc8f0..b959afa 100644 --- a/src/store/actions/watchlistActions.js +++ b/src/store/actions/watchlistActions.js @@ -33,7 +33,6 @@ export function addToWatchlistAction(id, movie, token) { }); }; } - // GET WATCHLIST export function getWatchlistAction(id, token) { return dispatch => { From 280ca7b394b64cd2194733bf36c8f7b82ca4ed26 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 16:11:08 -0400 Subject: [PATCH 792/822] add fix to scroll on firefox --- src/components/movies/MovieCard.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 56253ad..6e97a45 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -152,6 +152,7 @@ const useStyles = makeStyles((theme) => ({ boxShadow: theme.shadows[5], padding: theme.spacing(0, 6, 3), color: "white", + mozoverflowY: "scroll", }, DeleteMoviefromWatch: { backgroundColor: "white", From 46075aba0d28917ce7864c898a25a7b169dcc8d2 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:12:00 -0700 Subject: [PATCH 793/822] edited moviecard --- src/components/movies/MovieCard.js | 42 +++++++++++++------------- src/store/actions/watchlistActions.js | 2 +- src/store/reducers/watchlistReducer.js | 1 - 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 2a6ee3a..1457751 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -216,16 +216,16 @@ const useStyles = makeStyles((theme) => ({ dislay: 'flex', justifyContent: 'center', margin: 'auto', - textAlign:"center", + textAlign: "center", background: "rgb(23, 23, 23, .96)", boxShadow: theme.shadows[5], }, expansionPanalSummary: { margin: 'auto', - }, - heading:{ - margin:'auto', - }, + }, + heading: { + margin: 'auto', + }, serviceInfo: { textAlign: 'center', }, @@ -317,7 +317,7 @@ function MovieCard({ (movie) => movie.name === name && movie.year === year ); const removeInWatchlist = watchlist.some( - (movie) => movie.name === name &&movie.year === year + (movie) => movie.name === name && movie.year === year ); const inRatings = ratings.some( (movie) => movie.name === name && movie.year === year @@ -381,7 +381,7 @@ function MovieCard({ }; const handleClickDeleteFromWatchlist = () => { console.log('thisi sin move', movie_id) - removeWatchListAction( userid, movie_id, accessToken); + removeWatchListAction(userid, movie_id, accessToken); setDeleted(true); } @@ -463,7 +463,7 @@ function MovieCard({ color="primary" > {inRatings || yourRating - ? "Your rating:" + ? "Your Rated this Movie" : !added && !inWatchlist ? "Add to watchlist" : "In your watchlist"} @@ -492,19 +492,19 @@ function MovieCard({ )}
{page === "watchlist" ? ( - - - + + + ) : ( "" )} diff --git a/src/store/actions/watchlistActions.js b/src/store/actions/watchlistActions.js index b959afa..8bfd9b0 100644 --- a/src/store/actions/watchlistActions.js +++ b/src/store/actions/watchlistActions.js @@ -67,7 +67,7 @@ export function removeWatchListAction(id, movie_id, token) { .then(res => { dispatch({ type: REMOVEFROMWATCHLIST_SUCCESS, - payload: res.data, + // payload: res.data, }); axiosWithAuth(token) .get(`/${id}/get-watchlist`) diff --git a/src/store/reducers/watchlistReducer.js b/src/store/reducers/watchlistReducer.js index e8457b4..eb37c0e 100644 --- a/src/store/reducers/watchlistReducer.js +++ b/src/store/reducers/watchlistReducer.js @@ -74,7 +74,6 @@ export const watchlist = (state = initialState, action) => { case REMOVEFROMWATCHLIST_SUCCESS: return { ...state, - isRemoving: false, }; case REMOVEFROMWATCHLIST_FAIL: return { From 35a316517d05d8fd3eb82403d7d0e0bf4b33b5c2 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:18:00 -0700 Subject: [PATCH 794/822] movie card refreshed, but displays next movie modal in line --- src/store/actions/watchlistActions.js | 2 +- src/store/reducers/watchlistReducer.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/store/actions/watchlistActions.js b/src/store/actions/watchlistActions.js index 8bfd9b0..b959afa 100644 --- a/src/store/actions/watchlistActions.js +++ b/src/store/actions/watchlistActions.js @@ -67,7 +67,7 @@ export function removeWatchListAction(id, movie_id, token) { .then(res => { dispatch({ type: REMOVEFROMWATCHLIST_SUCCESS, - // payload: res.data, + payload: res.data, }); axiosWithAuth(token) .get(`/${id}/get-watchlist`) diff --git a/src/store/reducers/watchlistReducer.js b/src/store/reducers/watchlistReducer.js index eb37c0e..fd69a45 100644 --- a/src/store/reducers/watchlistReducer.js +++ b/src/store/reducers/watchlistReducer.js @@ -27,15 +27,13 @@ export const watchlist = (state = initialState, action) => { return { ...state, isAdding: true - } + }; // ADD TO WATCHLIST SUCCESS case ADDING_WATCHLIST_SUCCESS: return { ...state, isAdding: false, - }; - // ADD TO WATCHLIST FAIL case ADDING_WATCHLIST_FAIL: return { @@ -43,7 +41,6 @@ export const watchlist = (state = initialState, action) => { isAdding: false, error: action.payload }; - // GET WATCHLIST START case FETCHING_WATCHLIST_START: return { @@ -57,7 +54,6 @@ export const watchlist = (state = initialState, action) => { isFetching: false, movies: action.payload }; - // GET WATCHLIST FAIL case FETCHING_WATCHLIST_FAIL: return { From 6339d4a1aa37d4684b50d07f48c2c9cb61a58862 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:24:26 -0700 Subject: [PATCH 795/822] fixed padding on where to watch btn --- src/components/movies/MovieCard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 1457751..1fcd177 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -206,7 +206,7 @@ const useStyles = makeStyles((theme) => ({ }, ExpansionRoot: { margin: 'auto', - padding: '0 15%', + padding: '2% 25%', }, btnsProviders: { backgroundColor: "#212120", From 1f1d37f4c337bdbe193c4555096b00538a1e778f Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:26:24 -0700 Subject: [PATCH 796/822] changed to baseURL --- src/utils/axiosWithAuth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/axiosWithAuth.js b/src/utils/axiosWithAuth.js index a15fb46..2707cc7 100644 --- a/src/utils/axiosWithAuth.js +++ b/src/utils/axiosWithAuth.js @@ -8,7 +8,7 @@ const axiosWithAuth = (accessToken) => { headers: { Authorization: `Bearer ${accessToken}` }, - baseURL: 'http://localhost:5000/api/users', + baseURL: baseURL, }) } export default axiosWithAuth; \ No newline at end of file From a36844a0c5c6495a6b90908ab85bf4c2f8031ff2 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:42:37 -0700 Subject: [PATCH 797/822] movie modal closes when removed from watchlist --- src/components/movies/MovieCard.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 385045b..ffbfdbd 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -378,6 +378,7 @@ function MovieCard({ console.log('thisi sin move', movie_id) removeWatchListAction(userid, movie_id, accessToken); setDeleted(true); + handleClose(); } const handleClickProviders = () => { @@ -477,6 +478,20 @@ function MovieCard({ ) : ( "" )} + {page === "Ratings" ? ( + + + + ) : ( + "" + )}
{page === "watchlist" ? ( @@ -596,20 +611,6 @@ function MovieCard({ ) : ( "" )} - {page === "Ratings" ? ( - - - - ) : ( - "" - )}
From a4d372fedd2ff1c61e515a0761b070656508b857 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 13:44:42 -0700 Subject: [PATCH 798/822] removed commented out code --- src/components/movies/MovieCard.js | 59 ++++++++++++------------------ 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index ffbfdbd..6122998 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -39,7 +39,6 @@ const styles = (theme) => ({ justifyContent: "space-between", }, closeButton: { - // paddingLeft: "200px", color: theme.palette.grey[500], }, }); @@ -192,7 +191,6 @@ const useStyles = makeStyles((theme) => ({ }, starsModal: { justifyContent: "center", - // display: "flex", fontSize: "3vw", }, actionBtn: { @@ -359,7 +357,6 @@ function MovieCard({ addToWatchlistAction(userid, movie, accessToken); setAdded(true); }; - const deleteRating = (e) => { e.preventDefault(); const RatingDeletion = { @@ -368,7 +365,6 @@ function MovieCard({ }; removeRatingAction(userid, RatingDeletion, accessToken); }; - const handleClickRemove = () => { const notWatch = { movie_id: movie.movie_id, user_id: userid }; notWatchListAction(userid, notWatch, accessToken); @@ -380,7 +376,6 @@ function MovieCard({ setDeleted(true); handleClose(); } - const handleClickProviders = () => { axiosWithAuth(accessToken) .get(`${userid}/service-providers/${movie.movie_id}`) @@ -393,13 +388,11 @@ function MovieCard({ }); setOpen((prevOpen) => !prevOpen); }; - const multiFunctions = () => { handleClose(); handleClickStar(); onboardingRating(); }; - const onboardingRating = () => { setNumRatings({ ...numRatings, num: numRatings.num + 1 }); console.log("number of ratings is " + numRatings.num); @@ -409,7 +402,6 @@ function MovieCard({
{movie.name} - {/*

{name}

*/}
) : ( - "" - )} - + "" + )} {page === "Recommendations" ? ( - - ) : ( - "" - )} + + ) : ( + "" + )}
{page === "watchlist" ? ( @@ -508,9 +499,8 @@ function MovieCard({ ) : ( - "" - )} - + "" + )} {page === "Onboarding" ? ( } - // eslint-disable-next-line react/jsx-no-duplicate-props emptyIcon={
) : ( - "" - )} + "" + )}
{page !== "Onboarding" ? ( @@ -609,8 +598,8 @@ function MovieCard({ allowFullScreen > ) : ( - "" - )} + "" + )}
From 123baa95339cf5306c9e5236ff3d22b203c9c289 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 14:23:11 -0700 Subject: [PATCH 799/822] add where to watch on recommendations page and watchlist --- src/components/dashboard/Recommendations.js | 1 + src/components/movies/MovieCard.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index 4717538..f98a4a7 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -84,6 +84,7 @@ function Recommendations({ : true ) .map((movie, index) => { + console.log('this is movie id', movie.movie_id) let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 6122998..e9a05e8 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -542,7 +542,7 @@ function MovieCard({ /> )} - {page !== 'watchlist' && page !== 'Onboarding' && page !== "Recommendations" ? ( + {page !== 'Onboarding' ? (
Date: Thu, 28 May 2020 14:28:35 -0700 Subject: [PATCH 800/822] removed unused code --- src/components/dashboard/Recommendations.js | 5 ++--- src/components/dashboard/Watchlist.js | 2 -- src/components/movies/MovieCard.js | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index f98a4a7..fc337d5 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -22,7 +22,7 @@ const useStyles = makeStyles((theme) => ({ textAlign: "center", [theme.breakpoints.down("xs")]: { Title: { - fontSize:'1rem' + fontSize: '1rem' }, }, }, @@ -35,7 +35,7 @@ const useStyles = makeStyles((theme) => ({ movieCard: { "&:hover": { transform: 'scale(1.1)', - transitionDuration:'.5s' + transitionDuration: '.5s' }, }, })); @@ -84,7 +84,6 @@ function Recommendations({ : true ) .map((movie, index) => { - console.log('this is movie id', movie.movie_id) let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 5da92b9..366d58e 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -48,7 +48,6 @@ function Watchlist({ const { authState } = useOktaAuth(); const { accessToken } = authState; - const [deleteMode, setDeleteMode] = useState(false); //for matieral-ui const styles = useStyles(); const screenWidth = widthFinder(window.innerWidth); @@ -60,7 +59,6 @@ function Watchlist({ }, [getWatchlistAction, userid, isDeleting, setFilter, accessToken]); if (isFetching) return ; - else if (isDeleting) return ; else return ( <> diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index e9a05e8..0e91b61 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -287,8 +287,6 @@ function MovieCard({ handleClickStar, numRatings, setNumRatings, - deleteMode, - setDeleteMode, notWatchListAction, notwatchlist, removeWatchListAction, From db23ac84313d368b1487a914885834d6b29613e7 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 14:34:30 -0700 Subject: [PATCH 801/822] fixed text size of headers in each page --- src/components/dashboard/Explore.js | 5 +++++ src/components/dashboard/Ratings.js | 5 +++++ src/components/dashboard/Recommendations.js | 4 ++-- src/components/dashboard/Watchlist.js | 5 +++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 9d99c06..4d607b7 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -34,6 +34,11 @@ const useStyles = makeStyles((theme) => ({ transitionDuration:'.5s' }, }, + [theme.breakpoints.down("xs")]: { + Title: { + fontSize: '2rem' + }, + }, })); function Explore({ isFetching, diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index 9fd03ff..b82f74e 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -18,6 +18,11 @@ const useStyles = makeStyles((theme) => ({ fontSize: "3rem", textAlign: "center", }, + [theme.breakpoints.down("xs")]: { + Title: { + fontSize: '2rem' + }, + }, })); function Ratings({ userid, isFetching, getRatingAction, ratings, setFilter }) { //OKTA AUTH diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index fc337d5..e759a40 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -20,11 +20,11 @@ const useStyles = makeStyles((theme) => ({ Title: { fontSize: "3rem", textAlign: "center", + }, [theme.breakpoints.down("xs")]: { Title: { - fontSize: '1rem' + fontSize: '2rem' }, - }, }, cardGrid: { paddingTop: theme.spacing(4), diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 366d58e..874021e 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -34,6 +34,11 @@ const useStyles = makeStyles((theme) => ({ transitionDuration:'.5s' }, }, + [theme.breakpoints.down("xs")]: { + Title: { + fontSize: '2rem' + }, + }, })); function Watchlist({ userid, From d267eda704ef2b3f4f07e528a6679b01c9e19175 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 14:44:50 -0700 Subject: [PATCH 802/822] fixed issue #152 --- src/components/dashboard/Explore.js | 5 +++-- src/components/dashboard/Navigation.js | 2 +- src/components/dashboard/Recommendations.js | 4 ++-- src/components/dashboard/Watchlist.js | 4 ++-- src/components/layout/LoadingScreen.js | 18 +++++++++++++----- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 4d607b7..1e366ca 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -21,10 +21,11 @@ const useStyles = makeStyles((theme) => ({ Title: { fontSize: "3rem", textAlign: "center", + paddingTop:'2%', }, cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), + paddingTop: theme.spacing(0), + paddingBottom: theme.spacing(2), paddingRight: theme.spacing(1), paddingLeft: theme.spacing(1), }, diff --git a/src/components/dashboard/Navigation.js b/src/components/dashboard/Navigation.js index 3ec2d94..ef6fbad 100644 --- a/src/components/dashboard/Navigation.js +++ b/src/components/dashboard/Navigation.js @@ -105,7 +105,7 @@ const useStyles = makeStyles((theme) => ({ }, content: { flexGrow: 1, - padding: theme.spacing(3), + padding: theme.spacing(2), transition: theme.transitions.create("margin", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index e759a40..e8c9ee1 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -27,8 +27,8 @@ const useStyles = makeStyles((theme) => ({ }, }, cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), + paddingTop: theme.spacing(2), + paddingBottom: theme.spacing(2), paddingRight: theme.spacing(1), paddingLeft: theme.spacing(1), }, diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 874021e..5c8d891 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -23,8 +23,8 @@ const useStyles = makeStyles((theme) => ({ textAlign: "center", }, cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), + paddingTop: theme.spacing(2), + paddingBottom: theme.spacing(2), paddingRight: theme.spacing(1), paddingLeft: theme.spacing(1), }, diff --git a/src/components/layout/LoadingScreen.js b/src/components/layout/LoadingScreen.js index bd22277..352d128 100644 --- a/src/components/layout/LoadingScreen.js +++ b/src/components/layout/LoadingScreen.js @@ -29,6 +29,14 @@ const useStyles = makeStyles((theme) => ({ lineHeight: '2rem', color: '#ffffff', }, + [theme.breakpoints.down("xs")]: { + loadingComponenth4: { + fontSize: '2rem' + }, + loadingComponentp:{ + fontSize: '1rem' + }, + }, })); function LoadingScreen({ @@ -45,15 +53,15 @@ function LoadingScreen({ data-test={ifDev("loading-screen-component")} > {isUploading ? ( -

Uploading files...

+

Uploading Files...

) : isFetchingWatchlist ? ( -

Loading watchlist...

+

Loading Watchlist...

) : isFetchingRecommendations ? ( -

Loading recommendations...

+

Loading Recommendations...

) : isFetchingRatings ? ( -

Loading ratings...

+

Loading Ratings...

) : isFetchingExplore ? ( -

Loading search results...

+

Loading Movies to Explore...

) : null} Date: Thu, 28 May 2020 15:48:21 -0700 Subject: [PATCH 803/822] fix styling on register page --- src/components/auth/Register.js | 194 ++++++++++++++++--- src/css/main.css | 1 - src/scss/components/_app.scss | 2 +- src/scss/components/_onboarding.scss | 156 +++++++-------- src/scss/components/_onboardingNavLinks.scss | 10 +- 5 files changed, 253 insertions(+), 110 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 369684e..f523e90 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -8,12 +8,150 @@ import { Link, useHistory } from "react-router-dom"; import Picture3 from "../../img/couch-popcorn.png"; import Typography from "@material-ui/core/Typography"; import Box from "@material-ui/core/Box"; - +import { makeStyles } from "@material-ui/core/styles"; +import { Button } from "@material-ui/core"; // Navbar Register import RegisterNavLinks from "../layout/nav-layouts/RegisterNavLinks"; //OKTA import { useOktaAuth } from "@okta/okta-react"; +const useStyles = makeStyles((theme) => ({ + root: { + fontFamily: 'Work Sans', + color: 'white', + margin: '0 auto', + width: '100%', + minHeight: '100vh', + backgroundColor: '#212120' + }, + onboardingNav: { + color: 'white', + display: 'flex', + width: '95%', + margin: '0 auto', + justifyContent: 'flex-end', + alignItems: 'center', + padding: '1.1% 1%', + textAlign: 'center', + }, + boxContainer: { + display: 'flex', + justifyContent: 'space-between', + margin: '0 auto', + width: '85%', + }, + boxLeft: { + width: '45%', + margin: '0 1%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + textAlign: 'left', + maxWidth: '100%', + boxSizing: 'border-box', + }, + textContainer: { + whiteSpace: 'nowrap', + }, + h1: { + fontSize: '5vw', + }, + h5: { + fontSize: '1.5vw', + fontWeight: 'normal', + paddingTop: '2rem', + }, + imageWrapper: { + width: '75%', + padding: '5%, 0' + }, + logo: { + width: '100%', + }, + //box right + boxRight: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', borderRadius: '4px', + background: '#212120', + width: '100%', + height: '550px', + }, + form: { + width: '50%', + display: 'flex', + justifyContent: 'center', + flexDirection: 'column', + alignItems: 'center', + }, + bottomForm: { + width: '100%', + display: 'flex', + flexDirection: 'column-reverse', + margin: 0, + }, + btnContainer: { + width: '100%', + display: 'flex', + alignItems: 'center', + flexDirection: 'column', + paddingBottom: '15px', + }, + signupBtn: { + width: '100%', + maxWidth: '100%', + height: '50px', + background: '#00B392', + color: '#212120', + marginBottom: '2%', + '&:hover':{ + boxShadow: '0 0 6px #00B392', + color:'#00B392', + }, + }, + fbBtn:{ + width: '100%', + height: '50px', + backgroundColor: '#3A5A97', + borderRadius: '4px', + boxShadow: '0 3px 4px 0 rgba(0, 0, 0, .25)', + marginTop: '2%', + '&:hover':{ + boxShadow: '0 0 6px #4285f4', + }, + '&:active':{ + backgroundColor:'white', + } + }, + fbIconWrapper:{ + position: 'absolute', + marginTop: '4px', + marginLeft: '1px', + width: '40px', + height: '40px', + borderRadius: '2px', + }, + fbIcon:{ + marginTop: '11px', + marginLeft: '11px', + width: '18px', + height: '18px', + }, + btnText:{ + margin: '6% 1% 0 30%', + color: 'white', + fontzsize: '14px', + letterSpacing: '0.2px', + fontFamily: "Roboto", + }, + [theme.breakpoints.down("xs")]: { + onboardingNav: { + flexDirection: 'column', + }, + }, +})); + function Copyright() { return ( @@ -32,6 +170,7 @@ function Copyright() { const Register = (props) => { const history = useHistory(); + const styles = useStyles(); const { authState, authService } = useOktaAuth(); const login = async () => authService.login("/register"); @@ -62,52 +201,59 @@ const Register = (props) => { return (
{/* NAVIGATION */} -
+
{/* MAIN PAGE CONTENT */} -
-
-
-

+
+
+
+

Your movies,
your way.

-
+
{" "} Groa helps you pick the perfect film... so you
can save your popcorn for the good stuff.
-
- Graphic +
+ Graphic
{/* FORM STARTS */} -
+
{/* */} -
-
-
- -

- OR + +

+ --------- OR ---------

-
-
+
+
Facebook Icon
-

+

Login with Facebook

@@ -116,9 +262,7 @@ const Register = (props) => {
- -
); }; diff --git a/src/css/main.css b/src/css/main.css index fb20236..85335dd 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -71,7 +71,6 @@ #root .lowercase { text-transform: lowercase; } #root .App { - min-height: 100vh; background-color: #212120; } #root .container.register-component, #root .container.login-component { diff --git a/src/scss/components/_app.scss b/src/scss/components/_app.scss index b842285..6cd224d 100644 --- a/src/scss/components/_app.scss +++ b/src/scss/components/_app.scss @@ -1,5 +1,5 @@ .App { - min-height: 100vh; + // min-height: 100vh; background-color: #212120; } diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 31ef4ae..2e32d8a 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -1,79 +1,79 @@ .container.register-component, .container.login-component { - font-family: $workSans; - color: $white; - background: $black; - margin: 0 auto; - width: 100%; - min-height: 100vh; + // font-family: $workSans; + // color: $white; + // background: $black; + // margin: 0 auto; + // width: 100%; + // min-height: 100vh; .onboarding-nav { - color: $white; - display: flex; - width: 95%; - margin: 0 auto; - justify-content: flex-end; - padding: 1.1% 1%; + // color: $white; + // display: flex; + // width: 95%; + // margin: 0 auto; + // justify-content: flex-end; + // padding: 1.1% 1%; } .box-container { - display: flex; - justify-content: space-between; - margin: 0 auto; - width: 85%; + // display: flex; + // justify-content: space-between; + // margin: 0 auto; + // width: 85%; } .box-left { - width: 45%; - margin: 0 1%; - @include display-flex(); - flex-direction: column; - align-items: center; - text-align: left; - max-width: 100%; - box-sizing: border-box; - - .text-container { - white-space: nowrap; - - h1 { - font-size: 5vw; - } + // width: 45%; + // margin: 0 1%; + // @include display-flex(); + // flex-direction: column; + // align-items: center; + // text-align: left; + // max-width: 100%; + // box-sizing: border-box; + + // .text-container { + // white-space: nowrap; + + // h1 { + // font-size: 5vw; + // } + + // h5 { + // font-size: 1.5vw; + // font-weight: normal; + // padding-top: 2rem; + // } + // } - h5 { - font-size: 1.5vw; - font-weight: normal; - padding-top: 2rem; - } - } + // .image-wrapper { + // width: 75%; + // padding: 5% 0; - .image-wrapper { - width: 75%; - padding: 5% 0; - - .logo { - width: 100%; - } - } - } + // .logo { + // width: 100%; + // } + // } + // } .box-right { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 5%; - border-radius: 4px; - background: $black; - width: 100%; - height: 550px; + // display: flex; + // flex-direction: column; + // justify-content: center; + // align-items: center; + // margin: 5%; + // border-radius: 4px; + // background: $black; + // width: 100%; + // height: 550px; .form { - width: 50%; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; + // width: 50%; + // display: flex; + // justify-content: center; + // flex-direction: column; + // align-items: center; } .form-control { @@ -93,10 +93,10 @@ } .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; + // width: 100%; + // display: flex; + // flex-direction: column-reverse; + // margin: 0; .check-box-container { display: flex; @@ -111,24 +111,24 @@ } .btn-container { - width: 100%; - display: flex; - align-items: center; - flex-direction: column; - padding-bottom: 15px; + // width: 100%; + // display: flex; + // align-items: center; + // flex-direction: column; + // padding-bottom: 15px; .signup-btn, button.login-btn { // align-self: end; - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: $turqoise; - color: $black; - font-size: 14px; - margin-bottom: 2%; + // border: none; + // width: 100%; + // max-width: 100%; + // height: 50px; + // border-radius: 4px; + // background: $turqoise; + // color: $black; + // font-size: 14px; + // margin-bottom: 2%; } .fancy { diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index 31f970a..523ed34 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -1,14 +1,14 @@ .register.nav, .login.nav { - font-family: $workSans; - display: flex; + // font-family: $workSans; + // display: flex; justify-content: space-between; - align-items: center; + // align-items: center; width: 100%; - text-align: center; + // text-align: center; @media (max-width: 600px) { - flex-direction: column; + // flex-direction: column; } img { From 10a5c3fedf2e2fb3c85e4eb23138fbf3852beff4 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Thu, 28 May 2020 18:49:24 -0400 Subject: [PATCH 804/822] added overflow to paper --- src/components/movies/MovieCard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 6e97a45..9ef46ec 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -152,7 +152,7 @@ const useStyles = makeStyles((theme) => ({ boxShadow: theme.shadows[5], padding: theme.spacing(0, 6, 3), color: "white", - mozoverflowY: "scroll", + overflowY: "scroll", }, DeleteMoviefromWatch: { backgroundColor: "white", From c722ca85612288270e946bb36d36673332b8eff2 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 16:25:59 -0700 Subject: [PATCH 805/822] register navigation styling fixed --- src/components/auth/Register.js | 66 +- .../layout/nav-layouts/RegisterNavLinks.js | 36 +- src/css/main.css | 358 +------ src/scss/components/_app.scss | 2 +- src/scss/components/_onboarding.scss | 882 +++++++++--------- 5 files changed, 530 insertions(+), 814 deletions(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index f523e90..1586dc3 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -73,10 +73,11 @@ const useStyles = makeStyles((theme) => ({ display: 'flex', flexDirection: 'column', justifyContent: 'center', - alignItems: 'center', borderRadius: '4px', + alignItems: 'center', + borderRadius: '4px', background: '#212120', width: '100%', - height: '550px', + // height: '550px', }, form: { width: '50%', @@ -105,26 +106,26 @@ const useStyles = makeStyles((theme) => ({ background: '#00B392', color: '#212120', marginBottom: '2%', - '&:hover':{ + '&:hover': { boxShadow: '0 0 6px #00B392', - color:'#00B392', + color: '#00B392', }, }, - fbBtn:{ + fbBtn: { width: '100%', height: '50px', backgroundColor: '#3A5A97', borderRadius: '4px', boxShadow: '0 3px 4px 0 rgba(0, 0, 0, .25)', marginTop: '2%', - '&:hover':{ + '&:hover': { boxShadow: '0 0 6px #4285f4', }, - '&:active':{ - backgroundColor:'white', + '&:active': { + backgroundColor: 'white', } }, - fbIconWrapper:{ + fbIconWrapper: { position: 'absolute', marginTop: '4px', marginLeft: '1px', @@ -132,23 +133,62 @@ const useStyles = makeStyles((theme) => ({ height: '40px', borderRadius: '2px', }, - fbIcon:{ + fbIcon: { marginTop: '11px', marginLeft: '11px', width: '18px', height: '18px', }, - btnText:{ + btnText: { margin: '6% 1% 0 30%', color: 'white', fontzsize: '14px', letterSpacing: '0.2px', fontFamily: "Roboto", }, + [theme.breakpoints.down("xs")]: { onboardingNav: { flexDirection: 'column', }, + boxContainer: { + flexDirection: 'column', + alignItems: "center", + width:'100%' + }, + boxLeft: { + width: '80%', + margin: 0, + padding: 0, + }, + textContainer: { + margin: '0 auto', + width: '100%', + }, + h1: { + display: 'none', + }, + h5: { + display: 'none', + }, + imageWrapper: { + display: 'none', + }, + logo: { + display: 'none', + }, + boxRight: { + margin: '10% 0', + background: "#212120", + height: '100%', + }, + form: { + maxWidth: '100%', + width:'80%' + }, + btnText: { + margin: '4% 2% 0 35%', + }, }, })); @@ -243,7 +283,7 @@ const Register = (props) => { Login with Email

- --------- OR --------- + ----------- OR -----------

@@ -262,7 +302,7 @@ const Register = (props) => {
- +
); }; diff --git a/src/components/layout/nav-layouts/RegisterNavLinks.js b/src/components/layout/nav-layouts/RegisterNavLinks.js index a2ae36e..0537d8a 100644 --- a/src/components/layout/nav-layouts/RegisterNavLinks.js +++ b/src/components/layout/nav-layouts/RegisterNavLinks.js @@ -3,12 +3,42 @@ import { ifDev } from "../../../utils/removeAttribute.js"; // import { Link } from "react-router-dom"; // styling imports import GroaLogo from "../../../img/groa-logo-nav.png"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + registerNav: { + fontFamily: 'Work Sans', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + width: '100%', + textAlign: 'center' + }, + img: { + alignItems: 'center', + height: '2.5rem', + width: 'auto', + }, + + [theme.breakpoints.down("xs")]: { + registerNav: { + display: 'flex', + flexDirection: "column", + }, + accessAccount:{ + paddingTop:'5%', + fontSize: '20px', + }, + }, +})); export default function RegisterNavLinks() { + const styles = useStyles(); + return ( -
- Groa Logo -

Welcome

+
+ Groa Logo +

Access Your Account

); } diff --git a/src/css/main.css b/src/css/main.css index 85335dd..2242aaf 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -71,366 +71,12 @@ #root .lowercase { text-transform: lowercase; } #root .App { + min-height: 100vh; background-color: #212120; } - #root .container.register-component, - #root .container.login-component { - font-family: "Work Sans", sans-serif; - color: white; - background: #212120; - margin: 0 auto; - width: 100%; - min-height: 100vh; } - #root .container.register-component .onboarding-nav, - #root .container.login-component .onboarding-nav { - color: white; - display: flex; - width: 95%; - margin: 0 auto; - justify-content: flex-end; - padding: 1.1% 1%; } - #root .container.register-component .box-container, - #root .container.login-component .box-container { - display: flex; - justify-content: space-between; - margin: 0 auto; - width: 85%; } - #root .container.register-component .box-left, - #root .container.login-component .box-left { - width: 45%; - margin: 0 1%; - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - align-items: center; - text-align: left; - max-width: 100%; - box-sizing: border-box; } - #root .container.register-component .box-left .text-container, - #root .container.login-component .box-left .text-container { - white-space: nowrap; } - #root .container.register-component .box-left .text-container h1, - #root .container.login-component .box-left .text-container h1 { - font-size: 5vw; } - #root .container.register-component .box-left .text-container h5, - #root .container.login-component .box-left .text-container h5 { - font-size: 1.5vw; - font-weight: normal; - padding-top: 2rem; } - #root .container.register-component .box-left .image-wrapper, - #root .container.login-component .box-left .image-wrapper { - width: 75%; - padding: 5% 0; } - #root .container.register-component .box-left .image-wrapper .logo, - #root .container.login-component .box-left .image-wrapper .logo { - width: 100%; } - #root .container.register-component .box-right, - #root .container.login-component .box-right { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 5%; - border-radius: 4px; - background: #212120; - width: 100%; - height: 550px; } - #root .container.register-component .box-right .form, - #root .container.login-component .box-right .form { - width: 50%; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; } - #root .container.register-component .box-right .form-control, - #root .container.login-component .box-right .form-control { - border-radius: 4px; - border: 1px solid #d8d8d8; - max-width: 320px; - width: 100%; - height: auto; - padding: 2.7% 1.7%; - margin: 2.6% auto; - margin-bottom: 1rem; } - #root .container.register-component .box-right input::placeholder, - #root .container.login-component .box-right input::placeholder { - font-size: 1.1rem; - color: #d8d8d8; } - #root .container.register-component .box-right .bottom-form, - #root .container.login-component .box-right .bottom-form { - width: 100%; - display: flex; - flex-direction: column-reverse; - margin: 0; } - #root .container.register-component .box-right .bottom-form .check-box-container, - #root .container.login-component .box-right .bottom-form .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; } - #root .container.register-component .box-right .bottom-form .check-box-container p, - #root .container.login-component .box-right .bottom-form .check-box-container p { - color: black; - white-space: nowrap; } - #root .container.register-component .box-right .bottom-form .btn-container, - #root .container.login-component .box-right .bottom-form .btn-container { - width: 100%; - display: flex; - align-items: center; - flex-direction: column; - padding-bottom: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-right .bottom-form .btn-container button.login-btn { - border: none; - width: 100%; - max-width: 100%; - height: 50px; - border-radius: 4px; - background: #00B392; - color: #212120; - font-size: 14px; - margin-bottom: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy, - #root .container.login-component .box-right .bottom-form .btn-container .fancy { - line-height: 0.5; - text-align: center; - margin: 1% 0; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span { - display: inline-block; - position: relative; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - position: absolute; - height: 5px; - border-bottom: 1px solid white; - top: 0; - width: 104px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:before { - right: 100%; - margin-right: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-right .bottom-form .btn-container .fancy span:after { - left: 100%; - margin-left: 15px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn { - width: 100%; - height: 50px; - background-color: white; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - background-color: white; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .google-icon, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .google-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 7% 2% 0 30%; - color: #212120; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .google-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .google-btn:active { - background: white; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn { - width: 100%; - height: 50px; - background-color: #3A5A97; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); - margin-top: 2%; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .fb-icon, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .fb-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 7% 2% 0 30%; - color: white; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:hover, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:hover { - box-shadow: 0 0 6px #4285f4; } - #root .container.register-component .box-right .bottom-form .btn-container .fb-btn:active, - #root .container.login-component .box-right .bottom-form .btn-container .fb-btn:active { - background: white; } - #root .container.register-component .box-right .bottomAccount, - #root .container.login-component .box-right .bottomAccount { - display: flex; - flex-direction: column; - padding: 5%; } - #root .container.register-component .box-right .bottomAccount .loginAccount, - #root .container.login-component .box-right .bottomAccount .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; } - #root .container.register-component .box-right .bottomAccount .link, - #root .container.login-component .box-right .bottomAccount .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - flex-direction: column-reverse; - align-items: center; - color: white; } - #root .container.register-component .box-right .bottomAccount .link:hover, - #root .container.login-component .box-right .bottomAccount .link:hover { - color: #00b392; - font-weight: bold; } - #root .container.register-component .box-right .callingError, - #root .container.login-component .box-right .callingError { - color: red; - display: flex; - justify-content: center; } - @media (max-width: 1068px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - font-size: 10vw; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - font-size: 3vw; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - width: 100%; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - width: 100%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - margin: 0 auto; - padding: 0; - max-width: 100%; - width: 100%; - color: white; } - #root .container.register-component .box-container .box-right .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .google-btn .btn-text { - margin: 4% 2% 0 38%; } - #root .container.register-component .box-container .box-right .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 38%; } } - -@media (max-width: 1068px) and (max-width: 600px) { - #root .container.register-component .box-container, - #root .container.login-component .box-container { - flex-direction: column; - align-items: center; } - #root .container.register-component .box-container .box-left, - #root .container.login-component .box-container .box-left { - width: 80%; - margin: 0; - padding: 0; } - #root .container.register-component .box-container .box-left .text-container, - #root .container.login-component .box-container .box-left .text-container { - margin: 0 auto; - width: 100%; } - #root .container.register-component .box-container .box-left .text-container h1, - #root .container.login-component .box-container .box-left .text-container h1 { - display: none; } - #root .container.register-component .box-container .box-left .text-container h5, - #root .container.login-component .box-container .box-left .text-container h5 { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper, - #root .container.login-component .box-container .box-left .image-wrapper { - display: none; } - #root .container.register-component .box-container .box-left .image-wrapper .logo, - #root .container.login-component .box-container .box-left .image-wrapper .logo { - display: none; } - #root .container.register-component .box-container .box-right, - #root .container.login-component .box-container .box-right { - margin: 2%; - padding: 0%; - background: #212120; - height: 100%; } - #root .container.register-component .box-container .box-right .form, - #root .container.login-component .box-container .box-right .form { - max-width: 100%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.register-component .box-container .box-right .bottom-form .btn-container button.login-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .signup-btn, - #root .container.login-component .box-container .box-right .bottom-form .btn-container button.login-btn { - margin-top: 3%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fancy span:after, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:before, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fancy span:after { - content: ""; - width: 800%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .google-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text, - #root .container.login-component .box-container .box-right .bottom-form .btn-container .fb-btn .btn-text { - margin: 4% 2% 0 35%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount { - padding: 2%; } - #root .container.register-component .box-container .box-right .bottom-form .bottomAccount .loginAccount, - #root .container.login-component .box-container .box-right .bottom-form .bottomAccount .loginAccount { - font-size: 9px; } } #root .register.nav, #root .login.nav { - font-family: "Work Sans", sans-serif; - display: flex; justify-content: space-between; - align-items: center; - width: 100%; - text-align: center; } - @media (max-width: 600px) { - #root .register.nav, - #root .login.nav { - flex-direction: column; } } + width: 100%; } #root .register.nav img, #root .login.nav img { align-items: center; diff --git a/src/scss/components/_app.scss b/src/scss/components/_app.scss index 6cd224d..b842285 100644 --- a/src/scss/components/_app.scss +++ b/src/scss/components/_app.scss @@ -1,5 +1,5 @@ .App { - // min-height: 100vh; + min-height: 100vh; background-color: #212120; } diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss index 2e32d8a..a3f7692 100644 --- a/src/scss/components/_onboarding.scss +++ b/src/scss/components/_onboarding.scss @@ -1,441 +1,441 @@ -.container.register-component, -.container.login-component { - // font-family: $workSans; - // color: $white; - // background: $black; - // margin: 0 auto; - // width: 100%; - // min-height: 100vh; - - .onboarding-nav { - // color: $white; - // display: flex; - // width: 95%; - // margin: 0 auto; - // justify-content: flex-end; - // padding: 1.1% 1%; - } - - .box-container { - // display: flex; - // justify-content: space-between; - // margin: 0 auto; - // width: 85%; - } - - .box-left { - // width: 45%; - // margin: 0 1%; - // @include display-flex(); - // flex-direction: column; - // align-items: center; - // text-align: left; - // max-width: 100%; - // box-sizing: border-box; - - // .text-container { - // white-space: nowrap; - - // h1 { - // font-size: 5vw; - // } - - // h5 { - // font-size: 1.5vw; - // font-weight: normal; - // padding-top: 2rem; - // } - // } - - // .image-wrapper { - // width: 75%; - // padding: 5% 0; - - // .logo { - // width: 100%; - // } - // } - // } - - .box-right { - // display: flex; - // flex-direction: column; - // justify-content: center; - // align-items: center; - // margin: 5%; - // border-radius: 4px; - // background: $black; - // width: 100%; - // height: 550px; - - .form { - // width: 50%; - // display: flex; - // justify-content: center; - // flex-direction: column; - // align-items: center; - } - - .form-control { - border-radius: 4px; - border: 1px solid #d8d8d8; - max-width: 320px; - width: 100%; - height: auto; - padding: 2.7% 1.7%; - margin: 2.6% auto; - margin-bottom: 1rem; - } - - input::placeholder { - font-size: 1.1rem; - color: #d8d8d8; - } - - .bottom-form { - // width: 100%; - // display: flex; - // flex-direction: column-reverse; - // margin: 0; - - .check-box-container { - display: flex; - flex-direction: row; - padding-top: 13px; - align-items: center; - - p { - color: black; - white-space: nowrap; - } - } - - .btn-container { - // width: 100%; - // display: flex; - // align-items: center; - // flex-direction: column; - // padding-bottom: 15px; - - .signup-btn, - button.login-btn { - // align-self: end; - // border: none; - // width: 100%; - // max-width: 100%; - // height: 50px; - // border-radius: 4px; - // background: $turqoise; - // color: $black; - // font-size: 14px; - // margin-bottom: 2%; - } - - .fancy { - line-height: 0.5; - text-align: center; - margin: 1% 0; - } - - .fancy span { - display: inline-block; - position: relative; - } - - .fancy span:before, - .fancy span:after { - content: ""; - position: absolute; - height: 5px; - border-bottom: 1px solid white; - top: 0; - width: 104px; - } - - .fancy span:before { - right: 100%; - margin-right: 15px; - } - - .fancy span:after { - left: 100%; - margin-left: 15px; - } - - //Gogole Sign in btn - .google-btn { - width: 100%; - height: 50px; - background-color: $white; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); - margin-top: 2%; - - .google-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - background-color: $white; - } - - .google-icon { - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; - } - - .btn-text { - // float: right; - margin: 7% 2% 0 30%; - color: $black; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; - } - - &:hover { - box-shadow: 0 0 6px $google-blue; - } - - &:active { - background: $white; - } - } - - .fb-btn { - width: 100%; - height: 50px; - background-color: #3A5A97; - border-radius: 4px; - box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); - margin-top: 2%; - - .fb-icon-wrapper { - position: absolute; - margin-top: 4px; - margin-left: 1px; - width: 40px; - height: 40px; - border-radius: 2px; - // background-color: $white; - } - - .fb-icon { - // position: absolute; - margin-top: 11px; - margin-left: 11px; - width: 18px; - height: 18px; - } - - .btn-text { - // float: right; - margin: 7% 2% 0 30%; - color: $white; - font-size: 14px; - letter-spacing: 0.2px; - font-family: "Roboto"; - } - - &:hover { - box-shadow: 0 0 6px $google-blue; - } - - &:active { - background: $white; - } - } - } - } - - .bottomAccount { - display: flex; - flex-direction: column; - padding: 5%; - - .loginAccount { - text-align: center; - color: #2477e5; - font-size: 18px; - } - - .link { - display: flex; - width: 100%; - height: auto; - font-size: 1rem; - text-decoration: none; - // justify-content: flex-end; - flex-direction: column-reverse; - align-items: center; - color: $white; - - &:hover { - color: $turqoise3; - font-weight: bold; - } - } - - } - - .callingError { - color: red; - display: flex; - justify-content: center; - } - - // .about-us{ - // display: flex; - - // justify-content: space-evenly; - // text-align: center; - // font-size: 14px; - // } - } - - @media (max-width: 1068px) { - .box-container { - flex-direction: column; - align-items: center; - - .box-left { - width: 80%; - margin: 0; - padding: 0; - - .text-container { - margin: 0 auto; - width: 100%; - h1 { - font-size: 10vw; - } - - h5 { - font-size: 3vw; - } - } - .image-wrapper { - width: 100%; - } - } - - .box-right { - width: 100%; - margin: 0; - padding: 0; - - .form { - margin: 0 auto; - padding: 0; - max-width: 100%; - width: 100%; - color: $white; - } - - .btn-container { - .google-btn { - .btn-text { - // float: right; - margin: 4% 2% 0 38%; - } - } - - .fb-btn { - .btn-text { - // float: right; - margin: 4% 2% 0 38%; - } - } - } - } - } - - @media (max-width: 600px) { - .box-container { - flex-direction: column; - align-items: center; - - .box-left { - width: 80%; - margin: 0; - padding: 0; - - .text-container { - margin: 0 auto; - width: 100%; - - h1 { - display: none; - } - - h5 { - display: none; - } - } - - .image-wrapper { - display: none; - - .logo { - display: none; - } - } - } - - .box-right { - margin: 2%; - padding: 0%; - // border-radius: 4px; - background: $black; - // width: 100%; - height: 100%; - - .form { - max-width: 100% - } - - .bottom-form { - .btn-container { - - .signup-btn, - button.login-btn { - margin-top: 3%; - } - - .fancy span:before, - .fancy span:after { - content: ""; - - width: 800%; - } - - .google-btn { - .btn-text { - margin: 4% 2% 0 35%; - } - } - - .fb-btn { - .btn-text { - margin: 4% 2% 0 35%; - } - } - } - - .bottomAccount { - padding: 2%; - - .loginAccount { - font-size: 9px; - } - } - } - } - } - } - } -} \ No newline at end of file +// .container.register-component, +// .container.login-component { +// // font-family: $workSans; +// // color: $white; +// // background: $black; +// // margin: 0 auto; +// // width: 100%; +// // min-height: 100vh; + +// .onboarding-nav { +// // color: $white; +// // display: flex; +// // width: 95%; +// // margin: 0 auto; +// // justify-content: flex-end; +// // padding: 1.1% 1%; +// } + +// .box-container { +// // display: flex; +// // justify-content: space-between; +// // margin: 0 auto; +// // width: 85%; +// } + +// .box-left { +// // width: 45%; +// // margin: 0 1%; +// // @include display-flex(); +// // flex-direction: column; +// // align-items: center; +// // text-align: left; +// // max-width: 100%; +// // box-sizing: border-box; + +// // .text-container { +// // white-space: nowrap; + +// // h1 { +// // font-size: 5vw; +// // } + +// // h5 { +// // font-size: 1.5vw; +// // font-weight: normal; +// // padding-top: 2rem; +// // } +// // } + +// // .image-wrapper { +// // width: 75%; +// // padding: 5% 0; + +// // .logo { +// // width: 100%; +// // } +// // } +// // } + +// .box-right { +// // display: flex; +// // flex-direction: column; +// // justify-content: center; +// // align-items: center; +// // margin: 5%; +// // border-radius: 4px; +// // background: $black; +// // width: 100%; +// // height: 550px; + +// .form { +// // width: 50%; +// // display: flex; +// // justify-content: center; +// // flex-direction: column; +// // align-items: center; +// } + +// .form-control { +// border-radius: 4px; +// border: 1px solid #d8d8d8; +// max-width: 320px; +// width: 100%; +// height: auto; +// padding: 2.7% 1.7%; +// margin: 2.6% auto; +// margin-bottom: 1rem; +// } + +// input::placeholder { +// font-size: 1.1rem; +// color: #d8d8d8; +// } + +// .bottom-form { +// // width: 100%; +// // display: flex; +// // flex-direction: column-reverse; +// // margin: 0; + +// .check-box-container { +// display: flex; +// flex-direction: row; +// padding-top: 13px; +// align-items: center; + +// p { +// color: black; +// white-space: nowrap; +// } +// } + +// .btn-container { +// // width: 100%; +// // display: flex; +// // align-items: center; +// // flex-direction: column; +// // padding-bottom: 15px; + +// .signup-btn, +// button.login-btn { +// // align-self: end; +// // border: none; +// // width: 100%; +// // max-width: 100%; +// // height: 50px; +// // border-radius: 4px; +// // background: $turqoise; +// // color: $black; +// // font-size: 14px; +// // margin-bottom: 2%; +// } + +// .fancy { +// line-height: 0.5; +// text-align: center; +// margin: 1% 0; +// } + +// .fancy span { +// display: inline-block; +// position: relative; +// } + +// .fancy span:before, +// .fancy span:after { +// content: ""; +// position: absolute; +// height: 5px; +// border-bottom: 1px solid white; +// top: 0; +// width: 104px; +// } + +// .fancy span:before { +// right: 100%; +// margin-right: 15px; +// } + +// .fancy span:after { +// left: 100%; +// margin-left: 15px; +// } + +// //Gogole Sign in btn +// .google-btn { +// width: 100%; +// height: 50px; +// background-color: $white; +// border-radius: 4px; +// box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); +// margin-top: 2%; + +// .google-icon-wrapper { +// position: absolute; +// margin-top: 4px; +// margin-left: 1px; +// width: 40px; +// height: 40px; +// border-radius: 2px; +// background-color: $white; +// } + +// .google-icon { +// margin-top: 11px; +// margin-left: 11px; +// width: 18px; +// height: 18px; +// } + +// .btn-text { +// // float: right; +// margin: 7% 2% 0 30%; +// color: $black; +// font-size: 14px; +// letter-spacing: 0.2px; +// font-family: "Roboto"; +// } + +// &:hover { +// box-shadow: 0 0 6px $google-blue; +// } + +// &:active { +// background: $white; +// } +// } + +// .fb-btn { +// width: 100%; +// height: 50px; +// background-color: #3A5A97; +// border-radius: 4px; +// box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); +// margin-top: 2%; + +// .fb-icon-wrapper { +// position: absolute; +// margin-top: 4px; +// margin-left: 1px; +// width: 40px; +// height: 40px; +// border-radius: 2px; +// // background-color: $white; +// } + +// .fb-icon { +// // position: absolute; +// margin-top: 11px; +// margin-left: 11px; +// width: 18px; +// height: 18px; +// } + +// .btn-text { +// // float: right; +// margin: 7% 2% 0 30%; +// color: $white; +// font-size: 14px; +// letter-spacing: 0.2px; +// font-family: "Roboto"; +// } + +// &:hover { +// box-shadow: 0 0 6px $google-blue; +// } + +// &:active { +// background: $white; +// } +// } +// } +// } + +// .bottomAccount { +// display: flex; +// flex-direction: column; +// padding: 5%; + +// .loginAccount { +// text-align: center; +// color: #2477e5; +// font-size: 18px; +// } + +// .link { +// display: flex; +// width: 100%; +// height: auto; +// font-size: 1rem; +// text-decoration: none; +// // justify-content: flex-end; +// flex-direction: column-reverse; +// align-items: center; +// color: $white; + +// &:hover { +// color: $turqoise3; +// font-weight: bold; +// } +// } + +// } + +// .callingError { +// color: red; +// display: flex; +// justify-content: center; +// } + +// // .about-us{ +// // display: flex; + +// // justify-content: space-evenly; +// // text-align: center; +// // font-size: 14px; +// // } +// } + +// @media (max-width: 1068px) { +// .box-container { +// flex-direction: column; +// align-items: center; + +// .box-left { +// width: 80%; +// margin: 0; +// padding: 0; + +// .text-container { +// margin: 0 auto; +// width: 100%; +// h1 { +// font-size: 10vw; +// } + +// h5 { +// font-size: 3vw; +// } +// } +// .image-wrapper { +// width: 100%; +// } +// } + +// .box-right { +// width: 100%; +// margin: 0; +// padding: 0; + +// .form { +// margin: 0 auto; +// padding: 0; +// max-width: 100%; +// width: 100%; +// color: $white; +// } + +// .btn-container { +// .google-btn { +// .btn-text { +// // float: right; +// margin: 4% 2% 0 38%; +// } +// } + +// .fb-btn { +// .btn-text { +// // float: right; +// margin: 4% 2% 0 38%; +// } +// } +// } +// } +// } + +// @media (max-width: 600px) { +// .box-container { +// flex-direction: column; +// align-items: center; + +// .box-left { +// width: 80%; +// margin: 0; +// padding: 0; + +// .text-container { +// margin: 0 auto; +// width: 100%; + +// h1 { +// display: none; +// } + +// h5 { +// display: none; +// } +// } + +// .image-wrapper { +// display: none; + +// .logo { +// display: none; +// } +// } +// } + +// .box-right { +// margin: 2%; +// padding: 0%; +// // border-radius: 4px; +// background: $black; +// // width: 100%; +// height: 100%; + +// .form { +// // max-wix/dth: 100% +// } + +// .bottom-form { +// .btn-container { + +// .signup-btn, +// button.login-btn { +// margin-top: 3%; +// } + +// .fancy span:before, +// .fancy span:after { +// content: ""; + +// width: 800%; +// } + +// .google-btn { +// .btn-text { +// margin: 4% 2% 0 35%; +// } +// } + +// .fb-btn { +// .btn-text { +// margin: 4% 2% 0 35%; +// } +// } +// } + +// .bottomAccount { +// padding: 2%; + +// .loginAccount { +// font-size: 9px; +// } +// } +// } +// } +// } +// } +// } +// } \ No newline at end of file From 5f43c1e8cef0ac48121d291bc398e79287ad7741 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 16:52:08 -0700 Subject: [PATCH 806/822] fixed issue #153 --- src/components/auth/OnboardingPlatform.js | 34 +++++---- src/components/auth/PostOnboarding.js | 26 ++++--- src/css/main.css | 19 ----- src/scss/components/_onboardingNavLinks.scss | 76 ++++++++++---------- 4 files changed, 73 insertions(+), 82 deletions(-) diff --git a/src/components/auth/OnboardingPlatform.js b/src/components/auth/OnboardingPlatform.js index 389b9f3..92c3f1a 100644 --- a/src/components/auth/OnboardingPlatform.js +++ b/src/components/auth/OnboardingPlatform.js @@ -6,17 +6,18 @@ import { Link } from "react-router-dom"; import OnboardingImg from "../../img/happy-running-person.png"; //material-ui import { makeStyles } from "@material-ui/core/styles"; +import { Button } from "@material-ui/core"; const useStyles = makeStyles((theme) => ({ root: { - // margin: '0 auto', + margin: '0 auto', display: "flex", background: "#212120", padding: "2%", fontFamily: 'Work Sans', }, onboardingPlateformImg: { - width: "40%", + width: "30%", padding: "3%", }, onboardingText: { @@ -24,8 +25,7 @@ const useStyles = makeStyles((theme) => ({ justifyContent: "center", flexDirection: "column", padding: "3%", - color: "white", - width: "60%", + color:'white', }, onboardingh1: { fontSize: "35px", @@ -42,29 +42,35 @@ const useStyles = makeStyles((theme) => ({ }, onboardingLink: { textAlign: "center", - fontSize: "25px", padding: "2%", + textDecoration:'none', }, onboardingBut: { - backgroundColor: "#00E6BC", width: "100%", - color: "white", - padding: "2%", + height:'7vh', + background: '#00B392', + color: '#212120', borderRadius: "4px", - "&:hover": { - backgroundColor: "white", - color: "#00E6BC", + '&:hover': { + boxShadow: '0 0 6px #00B392', + color: '#00B392', }, }, [theme.breakpoints.down("xs")]: { root: { - flexDirection: "column", + flexDirection: "column-reverse", + textAlign:'center', + // width:'100%', + }, + onboardingText:{ + // justifyContent:'center', + // width:'90%', }, onboardingPlateformImg: { display: "block", marginLeft: "auto", marginRight: "auto", - width: "60%", + width: "40%", }, }, })); @@ -91,7 +97,7 @@ function OnboardingPlatform({ userid }) { personal movie AI!

- +
diff --git a/src/components/auth/PostOnboarding.js b/src/components/auth/PostOnboarding.js index 8406358..ac0882b 100644 --- a/src/components/auth/PostOnboarding.js +++ b/src/components/auth/PostOnboarding.js @@ -10,9 +10,11 @@ import { Link } from "react-router-dom"; import PostOnboardingImg from "../../img/post-onboarding-man.png"; //material-ui import { makeStyles } from "@material-ui/core/styles"; +import { Button } from "@material-ui/core"; //okta import { useOktaAuth } from "@okta/okta-react/dist/OktaContext"; + const useStyles = makeStyles((theme) => ({ root: { display: "flex", @@ -21,7 +23,7 @@ const useStyles = makeStyles((theme) => ({ fontFamily: 'Work Sans', }, PostOnboardingImg: { - width: "50%", + width: "45%", padding: "3%", }, onboardingText: { @@ -46,29 +48,31 @@ const useStyles = makeStyles((theme) => ({ }, onboardingLink: { textAlign: "center", - fontSize: "25px", + // fontSize: "25px", padding: "2%", + textDecoration:'none', }, onboardingBut: { - backgroundColor: "#00E6BC", width: "100%", - color: "#FFFFFF", - padding: "2%", + height:'7vh', + background: '#00B392', + color: '#212120', borderRadius: "4px", - "&:hover": { - backgroundColor: "white", - color: "#00E6BC", + '&:hover': { + boxShadow: '0 0 6px #00B392', + color: '#00B392', }, }, [theme.breakpoints.down("xs")]: { root: { - flexDirection: "column", + flexDirection: "column-reverse", + textAlign:'center', }, PostOnboardingImg: { display: "block", marginLeft: "auto", marginRight: "auto", - width: "60%", + width: "50%", }, }, })); @@ -117,7 +121,7 @@ function PostOnboarding({ className={classes.onboardingLink} to={`/${userid}/recommendations`} > - +
diff --git a/src/css/main.css b/src/css/main.css index 2242aaf..e4a3321 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -73,25 +73,6 @@ #root .App { min-height: 100vh; background-color: #212120; } - #root .register.nav, - #root .login.nav { - justify-content: space-between; - width: 100%; } - #root .register.nav img, - #root .login.nav img { - align-items: center; - height: 2.5rem; - width: auto; } - #root .register.nav .signin-title, - #root .login.nav .signin-title { - display: flex; - color: white; } - @media (max-width: 600px) { - #root .signin-title { - display: flex; - justify-content: flex-start; - margin-top: 2%; - font-size: 20px; } } #root .mainContainer { background: #212120; padding: 1.1% 1%; diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss index 523ed34..b4637b3 100644 --- a/src/scss/components/_onboardingNavLinks.scss +++ b/src/scss/components/_onboardingNavLinks.scss @@ -1,43 +1,43 @@ -.register.nav, -.login.nav { - // font-family: $workSans; - // display: flex; - justify-content: space-between; - // align-items: center; - width: 100%; - // text-align: center; +// .register.nav, +// .login.nav { +// // font-family: $workSans; +// // display: flex; +// justify-content: space-between; +// // align-items: center; +// width: 100%; +// // text-align: center; - @media (max-width: 600px) { - // flex-direction: column; - } +// @media (max-width: 600px) { +// // flex-direction: column; +// } - img { - align-items: center; - height: 2.5rem; - width: auto; - } +// img { +// align-items: center; +// height: 2.5rem; +// width: auto; +// } - .signin-title { - display: flex; - color: white; - // align-items: flex-start;; - } -} +// .signin-title { +// display: flex; +// color: white; +// // align-items: flex-start;; +// } +// } -@media (max-width: 600px) { - // img { - // position: absolute; - // width: 136px; - // height: 38px; - // left: 130px; - // top: 102px; - // } +// @media (max-width: 600px) { +// // img { +// // position: absolute; +// // width: 136px; +// // height: 38px; +// // left: 130px; +// // top: 102px; +// // } - .signin-title { - display: flex; - justify-content: flex-start; - margin-top: 2%; - font-size: 20px; - // text-decoration: none; - } -} \ No newline at end of file +// // .signin-title { +// // display: flex; +// // justify-content: flex-start; +// // margin-top: 2%; +// // font-size: 20px; +// // text-decoration: none; +// } +// } \ No newline at end of file From a2391b3c2b6a434593d3b22ba536bfed7d2dffe4 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 16:54:05 -0700 Subject: [PATCH 807/822] edit on post onboarding --- src/components/auth/PostOnboarding.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/PostOnboarding.js b/src/components/auth/PostOnboarding.js index ac0882b..8568e68 100644 --- a/src/components/auth/PostOnboarding.js +++ b/src/components/auth/PostOnboarding.js @@ -121,7 +121,7 @@ function PostOnboarding({ className={classes.onboardingLink} to={`/${userid}/recommendations`} > - +

From b7c65c665bad9b963b301aaa7522e4bce587f482 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 16:56:18 -0700 Subject: [PATCH 808/822] deleted unused scss --- src/scss/components/_congratulations.scss | 55 --- src/scss/components/_explore.scss | 86 ---- src/scss/components/_loadingScreen.scss | 27 -- src/scss/components/_onboarding.scss | 441 ------------------- src/scss/components/_onboardingNavLinks.scss | 43 -- src/scss/components/_ratings.scss | 98 ----- src/scss/components/_recommendations.scss | 82 ---- src/scss/components/_watchlist.scss | 60 --- 8 files changed, 892 deletions(-) delete mode 100644 src/scss/components/_congratulations.scss delete mode 100644 src/scss/components/_explore.scss delete mode 100644 src/scss/components/_loadingScreen.scss delete mode 100644 src/scss/components/_onboarding.scss delete mode 100644 src/scss/components/_onboardingNavLinks.scss delete mode 100644 src/scss/components/_ratings.scss delete mode 100644 src/scss/components/_recommendations.scss delete mode 100644 src/scss/components/_watchlist.scss diff --git a/src/scss/components/_congratulations.scss b/src/scss/components/_congratulations.scss deleted file mode 100644 index b150ffe..0000000 --- a/src/scss/components/_congratulations.scss +++ /dev/null @@ -1,55 +0,0 @@ -// .CongratsPage{ -// border: 2px solid #000A12; -// background:#000A12; -// height: 100vh; -// font-family: $workSans; - -// .CenterBox{ -// display:flex; -// margin-top: 10%; -// justify-content: center; - -// .congratsForm{ -// display: flex; -// justify-content: center; -// background: white; -// width: 600px; -// height: 600px; - -// .textHolder{ -// text-align: center; -// margin-top: 10%; -// width: 550px; -// height: 350px; - -// h1{ -// font-size: 35px; -// padding-left: 80px; -// padding-right: 50px; -// margin-top: 10px; -// font-weight: 400px; -// } -// h2{ -// font-size: 20px; -// padding-top: 15px; -// padding-bottom: 15px; -// padding-left: 9px; -// } -// .image{ -// display: flex; -// justify-content: center; -// margin: 16px; -// } -// button{ -// font-size: 20px; -// width: 220px; -// height: 51px; -// margin-top: 43px; -// background:#00B392; -// border-radius: 5px; -// border:none; -// } -// } -// } -// } -// } \ No newline at end of file diff --git a/src/scss/components/_explore.scss b/src/scss/components/_explore.scss deleted file mode 100644 index 2f5c0e0..0000000 --- a/src/scss/components/_explore.scss +++ /dev/null @@ -1,86 +0,0 @@ -// .container.explore { -// font-family: $workSans; -// background: $black; -// display: flex; -// flex-direction: column; -// min-height: 100vh; -// .movie-cards { -// width: 75%; -// margin: 3% auto; -// display: flex; -// flex-direction: row; -// flex-wrap: wrap; -// justify-content: space-evenly; -// .box { -// border-radius: 5px; -// overflow: hidden; -// width: 30vw; -// height: 30vw; -// max-width: 33%; -// margin: 2.5%; -// display: flex; -// flex-direction: column; -// .top-content { -// display: flex; -// position: relative; -// .aspect-ratio-wrapper { -// padding-bottom: 80%; -// position: relative; -// width: 60%; -// overflow: hidden; -// img { -// height: 100%; -// position: absolute; -// right: 0; -// object-fit: cover; -// } -// } -// .text-container { -// color: black; -// background-color: $white; -// width: 45%; -// padding: 2.5%; -// font-size: 1.5vw; -// p { -// padding: .5rem 0; -// } -// } -// } -// .action-panel { -// display: flex; -// flex-direction: column; -// align-items: flex-end; -// height: auto; -// width: 100%; -// padding: 1vw 0; -// background-color: $gray2; -// >* { -// width: 50%; -// text-align: left; -// margin: 1vw; -// } -// p{ -// color: $turqoise2; -// } -// .stars{ -// font-size: 2.5vw; -// } -// .watchlist-button { -// background-color: inherit; -// color: inherit; -// border: none; -// padding: 0; -// font: inherit; -// cursor: pointer; -// outline: inherit; -// color: $turqoise2; -// font-size: 1.5vw; -// &:hover { -// text-decoration: underline; -// } -// } -// } -// } -// } -// } - \ No newline at end of file diff --git a/src/scss/components/_loadingScreen.scss b/src/scss/components/_loadingScreen.scss deleted file mode 100644 index ecf9696..0000000 --- a/src/scss/components/_loadingScreen.scss +++ /dev/null @@ -1,27 +0,0 @@ -// .container.loading-screen { - // background:#000A12; - // display: flex; - // flex-direction: column; - // justify-content: center; - // height: 100vh; - // font-family: $workSans; - -// h4, -// p, -// .loading-component { -// margin: 4.5% auto; -// } -// h4 { -// font-size: 2.5rem; -// color: #ffffff; -// text-align: center; -// font-weight: 700; -// } -// p { -// font-size: 1.4rem; -// text-align: center; -// line-height: 2rem; -// color: #ffffff; - -// } -// } diff --git a/src/scss/components/_onboarding.scss b/src/scss/components/_onboarding.scss deleted file mode 100644 index a3f7692..0000000 --- a/src/scss/components/_onboarding.scss +++ /dev/null @@ -1,441 +0,0 @@ -// .container.register-component, -// .container.login-component { -// // font-family: $workSans; -// // color: $white; -// // background: $black; -// // margin: 0 auto; -// // width: 100%; -// // min-height: 100vh; - -// .onboarding-nav { -// // color: $white; -// // display: flex; -// // width: 95%; -// // margin: 0 auto; -// // justify-content: flex-end; -// // padding: 1.1% 1%; -// } - -// .box-container { -// // display: flex; -// // justify-content: space-between; -// // margin: 0 auto; -// // width: 85%; -// } - -// .box-left { -// // width: 45%; -// // margin: 0 1%; -// // @include display-flex(); -// // flex-direction: column; -// // align-items: center; -// // text-align: left; -// // max-width: 100%; -// // box-sizing: border-box; - -// // .text-container { -// // white-space: nowrap; - -// // h1 { -// // font-size: 5vw; -// // } - -// // h5 { -// // font-size: 1.5vw; -// // font-weight: normal; -// // padding-top: 2rem; -// // } -// // } - -// // .image-wrapper { -// // width: 75%; -// // padding: 5% 0; - -// // .logo { -// // width: 100%; -// // } -// // } -// // } - -// .box-right { -// // display: flex; -// // flex-direction: column; -// // justify-content: center; -// // align-items: center; -// // margin: 5%; -// // border-radius: 4px; -// // background: $black; -// // width: 100%; -// // height: 550px; - -// .form { -// // width: 50%; -// // display: flex; -// // justify-content: center; -// // flex-direction: column; -// // align-items: center; -// } - -// .form-control { -// border-radius: 4px; -// border: 1px solid #d8d8d8; -// max-width: 320px; -// width: 100%; -// height: auto; -// padding: 2.7% 1.7%; -// margin: 2.6% auto; -// margin-bottom: 1rem; -// } - -// input::placeholder { -// font-size: 1.1rem; -// color: #d8d8d8; -// } - -// .bottom-form { -// // width: 100%; -// // display: flex; -// // flex-direction: column-reverse; -// // margin: 0; - -// .check-box-container { -// display: flex; -// flex-direction: row; -// padding-top: 13px; -// align-items: center; - -// p { -// color: black; -// white-space: nowrap; -// } -// } - -// .btn-container { -// // width: 100%; -// // display: flex; -// // align-items: center; -// // flex-direction: column; -// // padding-bottom: 15px; - -// .signup-btn, -// button.login-btn { -// // align-self: end; -// // border: none; -// // width: 100%; -// // max-width: 100%; -// // height: 50px; -// // border-radius: 4px; -// // background: $turqoise; -// // color: $black; -// // font-size: 14px; -// // margin-bottom: 2%; -// } - -// .fancy { -// line-height: 0.5; -// text-align: center; -// margin: 1% 0; -// } - -// .fancy span { -// display: inline-block; -// position: relative; -// } - -// .fancy span:before, -// .fancy span:after { -// content: ""; -// position: absolute; -// height: 5px; -// border-bottom: 1px solid white; -// top: 0; -// width: 104px; -// } - -// .fancy span:before { -// right: 100%; -// margin-right: 15px; -// } - -// .fancy span:after { -// left: 100%; -// margin-left: 15px; -// } - -// //Gogole Sign in btn -// .google-btn { -// width: 100%; -// height: 50px; -// background-color: $white; -// border-radius: 4px; -// box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); -// margin-top: 2%; - -// .google-icon-wrapper { -// position: absolute; -// margin-top: 4px; -// margin-left: 1px; -// width: 40px; -// height: 40px; -// border-radius: 2px; -// background-color: $white; -// } - -// .google-icon { -// margin-top: 11px; -// margin-left: 11px; -// width: 18px; -// height: 18px; -// } - -// .btn-text { -// // float: right; -// margin: 7% 2% 0 30%; -// color: $black; -// font-size: 14px; -// letter-spacing: 0.2px; -// font-family: "Roboto"; -// } - -// &:hover { -// box-shadow: 0 0 6px $google-blue; -// } - -// &:active { -// background: $white; -// } -// } - -// .fb-btn { -// width: 100%; -// height: 50px; -// background-color: #3A5A97; -// border-radius: 4px; -// box-shadow: 0 3px 4px 0 rgba(0, 0, 0, .25); -// margin-top: 2%; - -// .fb-icon-wrapper { -// position: absolute; -// margin-top: 4px; -// margin-left: 1px; -// width: 40px; -// height: 40px; -// border-radius: 2px; -// // background-color: $white; -// } - -// .fb-icon { -// // position: absolute; -// margin-top: 11px; -// margin-left: 11px; -// width: 18px; -// height: 18px; -// } - -// .btn-text { -// // float: right; -// margin: 7% 2% 0 30%; -// color: $white; -// font-size: 14px; -// letter-spacing: 0.2px; -// font-family: "Roboto"; -// } - -// &:hover { -// box-shadow: 0 0 6px $google-blue; -// } - -// &:active { -// background: $white; -// } -// } -// } -// } - -// .bottomAccount { -// display: flex; -// flex-direction: column; -// padding: 5%; - -// .loginAccount { -// text-align: center; -// color: #2477e5; -// font-size: 18px; -// } - -// .link { -// display: flex; -// width: 100%; -// height: auto; -// font-size: 1rem; -// text-decoration: none; -// // justify-content: flex-end; -// flex-direction: column-reverse; -// align-items: center; -// color: $white; - -// &:hover { -// color: $turqoise3; -// font-weight: bold; -// } -// } - -// } - -// .callingError { -// color: red; -// display: flex; -// justify-content: center; -// } - -// // .about-us{ -// // display: flex; - -// // justify-content: space-evenly; -// // text-align: center; -// // font-size: 14px; -// // } -// } - -// @media (max-width: 1068px) { -// .box-container { -// flex-direction: column; -// align-items: center; - -// .box-left { -// width: 80%; -// margin: 0; -// padding: 0; - -// .text-container { -// margin: 0 auto; -// width: 100%; -// h1 { -// font-size: 10vw; -// } - -// h5 { -// font-size: 3vw; -// } -// } -// .image-wrapper { -// width: 100%; -// } -// } - -// .box-right { -// width: 100%; -// margin: 0; -// padding: 0; - -// .form { -// margin: 0 auto; -// padding: 0; -// max-width: 100%; -// width: 100%; -// color: $white; -// } - -// .btn-container { -// .google-btn { -// .btn-text { -// // float: right; -// margin: 4% 2% 0 38%; -// } -// } - -// .fb-btn { -// .btn-text { -// // float: right; -// margin: 4% 2% 0 38%; -// } -// } -// } -// } -// } - -// @media (max-width: 600px) { -// .box-container { -// flex-direction: column; -// align-items: center; - -// .box-left { -// width: 80%; -// margin: 0; -// padding: 0; - -// .text-container { -// margin: 0 auto; -// width: 100%; - -// h1 { -// display: none; -// } - -// h5 { -// display: none; -// } -// } - -// .image-wrapper { -// display: none; - -// .logo { -// display: none; -// } -// } -// } - -// .box-right { -// margin: 2%; -// padding: 0%; -// // border-radius: 4px; -// background: $black; -// // width: 100%; -// height: 100%; - -// .form { -// // max-wix/dth: 100% -// } - -// .bottom-form { -// .btn-container { - -// .signup-btn, -// button.login-btn { -// margin-top: 3%; -// } - -// .fancy span:before, -// .fancy span:after { -// content: ""; - -// width: 800%; -// } - -// .google-btn { -// .btn-text { -// margin: 4% 2% 0 35%; -// } -// } - -// .fb-btn { -// .btn-text { -// margin: 4% 2% 0 35%; -// } -// } -// } - -// .bottomAccount { -// padding: 2%; - -// .loginAccount { -// font-size: 9px; -// } -// } -// } -// } -// } -// } -// } -// } \ No newline at end of file diff --git a/src/scss/components/_onboardingNavLinks.scss b/src/scss/components/_onboardingNavLinks.scss deleted file mode 100644 index b4637b3..0000000 --- a/src/scss/components/_onboardingNavLinks.scss +++ /dev/null @@ -1,43 +0,0 @@ -// .register.nav, -// .login.nav { -// // font-family: $workSans; -// // display: flex; -// justify-content: space-between; -// // align-items: center; -// width: 100%; -// // text-align: center; - -// @media (max-width: 600px) { -// // flex-direction: column; -// } - -// img { -// align-items: center; -// height: 2.5rem; -// width: auto; -// } - -// .signin-title { -// display: flex; -// color: white; -// // align-items: flex-start;; -// } -// } - -// @media (max-width: 600px) { -// // img { -// // position: absolute; -// // width: 136px; -// // height: 38px; -// // left: 130px; -// // top: 102px; -// // } - -// // .signin-title { -// // display: flex; -// // justify-content: flex-start; -// // margin-top: 2%; -// // font-size: 20px; -// // text-decoration: none; -// } -// } \ No newline at end of file diff --git a/src/scss/components/_ratings.scss b/src/scss/components/_ratings.scss deleted file mode 100644 index ce26b46..0000000 --- a/src/scss/components/_ratings.scss +++ /dev/null @@ -1,98 +0,0 @@ -// .container.ratings { -// font-family: $workSans; -// background: $black; -// display: flex; -// flex-direction: column; -// min-height: 100vh; - -// .movie-cards { -// width: 75%; -// margin: 3% auto; -// display: flex; -// flex-direction: row; -// flex-wrap: wrap; -// justify-content: space-evenly; - -// .box { -// border-radius: 5px; -// overflow: hidden; -// width: 30vw; -// height: 30vw; -// max-width: 33%; -// margin: 2.5%; -// display: flex; -// flex-direction: column; - -// .top-content { -// display: flex; -// position: relative; - -// .aspect-ratio-wrapper { -// padding-bottom: 80%; -// position: relative; -// width: 60%; -// overflow: hidden; - -// img { -// height: 100%; -// position: absolute; -// right: 0; -// object-fit: cover; -// } -// } - -// .text-container { -// color: black; -// background-color: $white; -// width: 45%; -// padding: 2.5%; -// font-size: 1.5vw; - -// p { -// padding: .5rem 0; -// } -// } -// } - -// .action-panel { -// display: flex; -// flex-direction: column; -// align-items: flex-end; -// height: auto; -// width: 100%; -// padding: 1vw 0; -// background-color: $gray2; - -// >* { -// width: 50%; -// text-align: left; -// margin: 1vw; -// } - -// p { -// color: $turqoise2; -// } - -// .stars { -// font-size: 2.5vw; -// } - -// .watchlist-button { -// background-color: inherit; -// color: inherit; -// border: none; -// padding: 0; -// font: inherit; -// cursor: pointer; -// outline: inherit; -// color: $turqoise2; -// font-size: 1.5vw; - -// &:hover { -// text-decoration: underline; -// } -// } -// } -// } -// } -// } \ No newline at end of file diff --git a/src/scss/components/_recommendations.scss b/src/scss/components/_recommendations.scss deleted file mode 100644 index 5d8a4ff..0000000 --- a/src/scss/components/_recommendations.scss +++ /dev/null @@ -1,82 +0,0 @@ -// .container.recommendations { -// font-family: $workSans; -// background: $black; -// display: flex; -// flex-direction: column; -// min-height: 100vh; -// .movie-cards { -// width: 75%; -// margin: 3% auto; -// display: flex; -// flex-direction: row; -// flex-wrap: wrap; -// justify-content: space-evenly; -// .box { -// border-radius: 5px; -// overflow: hidden; -// width: 30vw; -// height: 30vw; -// max-width: 33%; -// margin: 2.5%; -// display: flex; -// flex-direction: column; -// .top-content { -// display: flex; -// position: relative; -// .aspect-ratio-wrapper { -// padding-bottom: 80%; -// position: relative; -// width: 60%; -// overflow: hidden; -// // img { -// // height: 100%; -// // position: absolute; -// // right: 0; -// // object-fit: cover; -// // } -// } -// .text-container { -// color: black; -// background-color: $white; -// width: 45%; -// padding: 2.5%; -// font-size: 1.5vw; -// p { -// padding: .5rem 0; -// } -// } -// } -// .action-panel { -// display: flex; -// flex-direction: column; -// align-items: flex-end; -// height: auto; -// width: 100%; -// padding: 1vw 0; -// background-color: $gray2; -// >* { -// width: 50%; -// text-align: left; -// margin: 1vw; -// } -// .stars{ -// font-size: 2.5vw; -// } -// .watchlist-button { -// background-color: inherit; -// color: inherit; -// border: none; -// padding: 0; -// font: inherit; -// cursor: pointer; -// outline: inherit; -// color: $turqoise2; -// font-size: 1.5vw; -// &:hover { -// text-decoration: underline; -// } -// } -// } -// } -// } -// } \ No newline at end of file diff --git a/src/scss/components/_watchlist.scss b/src/scss/components/_watchlist.scss deleted file mode 100644 index f79421c..0000000 --- a/src/scss/components/_watchlist.scss +++ /dev/null @@ -1,60 +0,0 @@ -// .watchlist-container { -// font-family: $workSans; -// background:$black; -// display: flex; -// flex-direction: column; -// min-height: 100vh; -// .movie-cards { -// width: 20%; -// margin: 0% auto; -// display: flex; -// flex-direction: row; -// flex-wrap: wrap; -// .movie-card-container { -// position: relative; -// margin: 0 auto; -// width: 30%; -// .box { -// border-radius: 5px; -// overflow: hidden; -// width: 100%; -// display: flex; -// flex-direction: column; - -// img { -// width: 20vw; -// height: 33.33vw; -// } -// .text-container { -// display: flex; -// flex-direction: column; -// } -// @media screen and (max-width: 600px) { -// } -// .text-container { -// display: none; -// } -// .action-panel { -// display: none; -// } -// } -// .delete-button { -// position: absolute; -// right: 1vw; -// top: 2vw; -// border-radius: 100%; -// height: 2vw; -// width: 2vw; -// padding: 0; -// cursor: pointer; -// outline: inherit; -// white-space: nowrap; -// font-size: 1vw; -// background-color: $gray2; -// color: $white; -// font-weight: bold; -// } -// } -// } -// } - \ No newline at end of file From e7e05a68db8ac3c7bde112c69906ca5700176dfe Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 16:58:22 -0700 Subject: [PATCH 809/822] update title on explore page --- src/components/dashboard/Explore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 1e366ca..5b16113 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -80,7 +80,7 @@ function Explore({ else return ( <> -

Search for Your Favorite Movies

+

Search Your Favorite Movies

{isSearching ? ( Date: Thu, 28 May 2020 17:21:53 -0700 Subject: [PATCH 810/822] fixed nav on landing page --- src/components/LandingPage.js | 17 +++++++-- .../layout/nav-layouts/LandingNavLinks.js | 35 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/components/LandingPage.js b/src/components/LandingPage.js index 5fe0a26..10ae7f5 100644 --- a/src/components/LandingPage.js +++ b/src/components/LandingPage.js @@ -24,6 +24,17 @@ import { useOktaAuth } from "@okta/okta-react"; const useStyles = makeStyles((theme) => ({ + onboardingNav:{ + color: 'white', + display: 'flex', + width: '95%', + margin: '0 auto', + justifyContent: 'flex-end', + alignItems: 'center', + padding: '1.1% 1%', + textAlign: 'center', + fontSize:'1rem', + }, testDiv: { margin: "auto", width: "80%", @@ -173,9 +184,9 @@ const LandingPage = ({ return (
- +
@@ -187,7 +198,7 @@ const LandingPage = ({
- groa + groa
({ + registerNav: { + fontFamily: 'Work Sans', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + width: '100%', + textAlign: 'center' + }, + img: { + alignItems: 'center', + height: '2.5rem', + width: 'auto', + }, + + [theme.breakpoints.down("xs")]: { + registerNav: { + display: 'flex', + flexDirection: "column", + }, + accessAccount:{ + paddingTop:'5%', + fontSize: '20px', + }, + }, +})); export default function RegisterNavLinks() { + const styles = useStyles(); return ( -
- Groa Logo -
+
+ Groa Logo +

Explore Groa

+
); } From 669226c8c1d5dff1250ade3f3e539859cf52fd04 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Thu, 28 May 2020 17:29:34 -0700 Subject: [PATCH 811/822] fixed btn on landing page --- src/components/LandingPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LandingPage.js b/src/components/LandingPage.js index 10ae7f5..5544eed 100644 --- a/src/components/LandingPage.js +++ b/src/components/LandingPage.js @@ -67,7 +67,7 @@ const useStyles = makeStyles((theme) => ({ fontSize: '60px', }, '& button':{ - margin: "5vh", + margin:"3vh auto", width:"100%", height:"8vh", fontSize:"30px", From 14c3fe95747342a5f7ffbfac08d90fb949f00759 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:42:42 -0400 Subject: [PATCH 812/822] ran linter --- src/components/dashboard/Ratings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/Ratings.js b/src/components/dashboard/Ratings.js index b82f74e..bc4292d 100644 --- a/src/components/dashboard/Ratings.js +++ b/src/components/dashboard/Ratings.js @@ -20,7 +20,7 @@ const useStyles = makeStyles((theme) => ({ }, [theme.breakpoints.down("xs")]: { Title: { - fontSize: '2rem' + fontSize: "2rem", }, }, })); From 85fa4d8e744394ad273fee172cf4fca7572937f0 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:43:19 -0400 Subject: [PATCH 813/822] made it >= to show if there is one movie in state --- src/components/dashboard/RatingsMovieSlider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dashboard/RatingsMovieSlider.js b/src/components/dashboard/RatingsMovieSlider.js index e728807..ddded3b 100644 --- a/src/components/dashboard/RatingsMovieSlider.js +++ b/src/components/dashboard/RatingsMovieSlider.js @@ -99,7 +99,7 @@ const LandingMovieSlider = ({ movieRatings, heading }) => {

{heading}

- {movieRatings.length > 1 ? ( + {movieRatings.length >= 1 ? ( <> From cb9a0c45dddd9e7d629cad92dda3de9a0302a42b Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:43:38 -0400 Subject: [PATCH 814/822] removed duplicate style --- src/components/dashboard/RatingsTileBar.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/components/dashboard/RatingsTileBar.js b/src/components/dashboard/RatingsTileBar.js index 5a947d1..38a2b64 100644 --- a/src/components/dashboard/RatingsTileBar.js +++ b/src/components/dashboard/RatingsTileBar.js @@ -34,13 +34,6 @@ const useStyles = makeStyles((theme) => ({ posterImg: { width: "100%", }, - movieList: { - minWidth: "15%", - margin: "10px", - }, - posterImg: { - width: "100%", - }, customArrow: { display: "flex", justifyContent: "center", @@ -101,7 +94,7 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - transform: 'scale(1.1)', + transform: "scale(1.1)", }, }, })); From 07fc700fd6be21e8a57c2379614455ab9452d7c5 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:43:47 -0400 Subject: [PATCH 815/822] ran linter --- src/components/dashboard/Recommendations.js | 28 ++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index e8c9ee1..54ef09a 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -21,10 +21,10 @@ const useStyles = makeStyles((theme) => ({ fontSize: "3rem", textAlign: "center", }, - [theme.breakpoints.down("xs")]: { - Title: { - fontSize: '2rem' - }, + [theme.breakpoints.down("xs")]: { + Title: { + fontSize: "2rem", + }, }, cardGrid: { paddingTop: theme.spacing(2), @@ -34,8 +34,8 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - transform: 'scale(1.1)', - transitionDuration: '.5s' + transform: "scale(1.1)", + transitionDuration: ".5s", }, }, })); @@ -78,9 +78,9 @@ function Recommendations({ .filter((movie) => searchTerm !== "" ? movie.title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) : true ) .map((movie, index) => { @@ -99,13 +99,13 @@ function Recommendations({ description={movie.description} movie_id={movie.movie_id} trailer={movie.trailer_url} - page={'Recommendations'} + page={"Recommendations"} image={ !posterURI || - posterURI === "None" || - posterURI === "No poster" || - posterURI === "No Poster" || - posterURI === "Not in table" + posterURI === "None" || + posterURI === "No poster" || + posterURI === "No Poster" || + posterURI === "Not in table" ? unsplashUrl : moviePoster } From 7032dd25eb260fc96ee2c2cfe3eaafbc5c40914e Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:43:58 -0400 Subject: [PATCH 816/822] ran linter --- src/components/dashboard/Watchlist.js | 96 +++++++++++++-------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 5c8d891..9ecf893 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -1,10 +1,7 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect } from "react"; // tools import { connect } from "react-redux"; -import { - getWatchlistAction, - setFilter, -} from "../../store/actions/index.js"; +import { getWatchlistAction, setFilter } from "../../store/actions/index.js"; // Screen width util import widthFinder from "../../utils/widthFinder.js"; @@ -30,13 +27,13 @@ const useStyles = makeStyles((theme) => ({ }, movieCard: { "&:hover": { - transform: 'scale(1.1)', - transitionDuration:'.5s' + transform: "scale(1.1)", + transitionDuration: ".5s", }, }, [theme.breakpoints.down("xs")]: { Title: { - fontSize: '2rem' + fontSize: "2rem", }, }, })); @@ -67,51 +64,52 @@ function Watchlist({ else return ( <> -

My Watchlist

- - {watchlist - .filter((movie) => - searchTerm !== "" - ? movie.primary_title - .toString() - .toLowerCase() - .includes(searchTerm.toLowerCase()) - : true - ) - .map((movie, index) => { - let posterURI = movie.poster_url; - let unsplashUrl = - "https://source.unsplash.com/collection/1736993/500x650"; - let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; - return ( -
- My Watchlist + + {watchlist + .filter((movie) => + searchTerm !== "" + ? movie.primary_title + .toString() + .toLowerCase() + .includes(searchTerm.toLowerCase()) + : true + ) + .map((movie, index) => { + let posterURI = movie.poster_url; + let unsplashUrl = + "https://source.unsplash.com/collection/1736993/500x650"; + let moviePoster = `https://image.tmdb.org/t/p/w500${posterURI}?api_key=${process.env.REACT_APP_TMDB_API_KEY}`; + return ( +
+ -
- ); - })}; -
+ ? unsplashUrl + : moviePoster + } + /> +
+ ); + })} + ; +
); } From a221ed7eda04821f9d4c627ccb9c1059969e2593 Mon Sep 17 00:00:00 2001 From: Steven <38477361+Steven-matos@users.noreply.github.com> Date: Fri, 29 May 2020 10:44:09 -0400 Subject: [PATCH 817/822] ran linter --- src/components/movies/MovieCard.js | 76 +++++++++++++++--------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index bed8de3..a3b2a4c 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -204,8 +204,8 @@ const useStyles = makeStyles((theme) => ({ padding: "0 1.5rem", }, ExpansionRoot: { - margin: 'auto', - padding: '2% 25%', + margin: "auto", + padding: "2% 25%", }, btnsProviders: { backgroundColor: "#212120", @@ -369,11 +369,11 @@ function MovieCard({ setRemoved(true); }; const handleClickDeleteFromWatchlist = () => { - console.log('thisi sin move', movie_id) + console.log("thisi sin move", movie_id); removeWatchListAction(userid, movie_id, accessToken); setDeleted(true); handleClose(); - } + }; const handleClickProviders = () => { axiosWithAuth(accessToken) .get(`${userid}/service-providers/${movie.movie_id}`) @@ -443,13 +443,13 @@ function MovieCard({ {inRatings || yourRating ? "Your Rated this Movie" : !added && !inWatchlist - ? "Add to watchlist" - : "In your watchlist"} + ? "Add to watchlist" + : "In your watchlist"} ) : ( - "" - )} + "" + )} {page === "Recommendations" ? ( + ) : ( - "" - )} + "" + )}
{page === "watchlist" ? ( @@ -497,8 +497,8 @@ function MovieCard({ ) : ( - "" - )} + "" + )} {page === "Onboarding" ? ( ) : ( - - } - emptyIcon={ - - } - name={name} - value={rated ? rated : rating} - onChange={handleChange} - /> - - )} - {page !== 'Onboarding' ? ( + + } + emptyIcon={ + + } + name={name} + value={rated ? rated : rating} + onChange={handleChange} + /> + + )} + {page !== "Onboarding" ? (
) : ( - "" - )} + "" + )}
{page !== "Onboarding" ? ( @@ -596,8 +596,8 @@ function MovieCard({ allowFullScreen > ) : ( - "" - )} + "" + )}
From 07c4e4f2aaafcee7c44d7c5486e54aa380a4609f Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 29 May 2020 11:51:18 -0700 Subject: [PATCH 818/822] added imdb rating on recommendations page --- src/components/auth/Onboarding.js | 4 +-- src/components/dashboard/Explore.js | 3 ++ src/components/dashboard/Recommendations.js | 2 ++ src/components/dashboard/Watchlist.js | 3 +- src/components/movies/MovieCard.js | 36 +++++++++++++++++---- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 76d018d..48e2d08 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -31,8 +31,8 @@ const useStyles = makeStyles((theme) => ({ paddingTop:'2%', }, cardGrid: { - paddingTop: theme.spacing(4), - paddingBottom: theme.spacing(4), + paddingTop: theme.spacing(2), + paddingBottom: theme.spacing(2), paddingRight: theme.spacing(1), paddingLeft: theme.spacing(1), }, diff --git a/src/components/dashboard/Explore.js b/src/components/dashboard/Explore.js index 5b16113..3543606 100644 --- a/src/components/dashboard/Explore.js +++ b/src/components/dashboard/Explore.js @@ -102,6 +102,8 @@ function Explore({ ) .slice(0, cardAmount) .map((movie, index) => { + console.log('this is the movie ', movie) + /* Checks if the film is in ratings */ const isRated = (film) => { return film.title === movie.title && film.year === movie.year; @@ -122,6 +124,7 @@ function Explore({ movie_id={movie.movie_id} description={movie.description} trailer={movie.trailer_url} + avg_rating={movie.avg_rating} rated={rated ? rated.rating : null} image={ !posterURI || diff --git a/src/components/dashboard/Recommendations.js b/src/components/dashboard/Recommendations.js index e8c9ee1..3aeacf7 100644 --- a/src/components/dashboard/Recommendations.js +++ b/src/components/dashboard/Recommendations.js @@ -84,6 +84,7 @@ function Recommendations({ : true ) .map((movie, index) => { + console.log('this is the movie ', movie) let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; @@ -98,6 +99,7 @@ function Recommendations({ genres={movie.genres} description={movie.description} movie_id={movie.movie_id} + avg_rating={movie.avg_rating} trailer={movie.trailer_url} page={'Recommendations'} image={ diff --git a/src/components/dashboard/Watchlist.js b/src/components/dashboard/Watchlist.js index 5c8d891..e42d750 100644 --- a/src/components/dashboard/Watchlist.js +++ b/src/components/dashboard/Watchlist.js @@ -82,7 +82,8 @@ function Watchlist({ .includes(searchTerm.toLowerCase()) : true ) - .map((movie, index) => { + .map((movie, index) => { + console.log('this is the movie ', movie) let posterURI = movie.poster_url; let unsplashUrl = "https://source.unsplash.com/collection/1736993/500x650"; diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index bed8de3..29840e2 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -81,10 +81,6 @@ const useStyles = makeStyles((theme) => ({ color: "#00B392", paddingTop: "1%", }, - year: { - fontSize: "18px", - paddingBottom: "1%", - }, descriptionModal: { color: "white", fontSize: "15px", @@ -164,9 +160,28 @@ const useStyles = makeStyles((theme) => ({ movieContentDiv: { margin: "auto", }, + yearGenreModal: { + display: 'flex', + justifyContent: 'space-between', + padding:"2% 0" + }, + year: { + fontSize: "18px", + }, genresModal: { fontStyle: "italic", - paddingTop: "3%", + }, + rateGenreModal: { + display: 'flex', + }, + imdbImg: { + height: '40%', + }, + avgRatingModal: { + fontSize: "1rem", + paddingLeft: "3%", + display:'flex', + alignItems:'center', }, actionButtons: { display: "flex", @@ -283,6 +298,7 @@ function MovieCard({ trailer, description, genres, + avg_rating, page, handleClickStar, numRatings, @@ -424,9 +440,15 @@ function MovieCard({

{name}

-

{year}

+
+

{year}

+

{genres}

+

{description}

-

{genres}

+
+ +

{avg_rating}/10

+
{page !== "Onboarding" && page !== "watchlist" ? ( From 85bc3c5ffc1ef4ed992ff3076d9d0c7a27cb7134 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 29 May 2020 11:53:34 -0700 Subject: [PATCH 819/822] fixed styling on genre --- src/components/movies/MovieCard.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index 29840e2..b2be555 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -170,6 +170,8 @@ const useStyles = makeStyles((theme) => ({ }, genresModal: { fontStyle: "italic", + display:'flex', + alignItems:'center', }, rateGenreModal: { display: 'flex', From 98c8eb2c47d4947b541b8dfcd45d2ff28c87c06f Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Fri, 29 May 2020 12:09:38 -0700 Subject: [PATCH 820/822] on show ratings on rec. page --- src/components/auth/Onboarding.js | 5 +++++ src/components/movies/MovieCard.js | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index 48e2d08..eebf7dd 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -42,6 +42,11 @@ const useStyles = makeStyles((theme) => ({ transitionDuration:'.5s' }, }, + [theme.breakpoints.down("xs")]: { + Title: { + fontSize: '2rem' + }, + }, })); function Alert(props) { diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index b2be555..a5db18a 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -447,10 +447,14 @@ function MovieCard({

{genres}

{description}

+ {page === "Recommendations" ? (

{avg_rating}/10

+ ) : ( + "" + )}
{page !== "Onboarding" && page !== "watchlist" ? ( From 1823862c715e648a0ea4326e03862e0db69ebae7 Mon Sep 17 00:00:00 2001 From: Juana Villalpando Date: Sun, 31 May 2020 17:52:36 -0700 Subject: [PATCH 821/822] add imdb rating on recomendations page /10 --- src/components/auth/Onboarding.js | 2 +- src/components/movies/MovieCard.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/auth/Onboarding.js b/src/components/auth/Onboarding.js index eebf7dd..57381e7 100644 --- a/src/components/auth/Onboarding.js +++ b/src/components/auth/Onboarding.js @@ -42,7 +42,7 @@ const useStyles = makeStyles((theme) => ({ transitionDuration:'.5s' }, }, - [theme.breakpoints.down("xs")]: { + [theme.breakpoints.down("xs")]: { Title: { fontSize: '2rem' }, diff --git a/src/components/movies/MovieCard.js b/src/components/movies/MovieCard.js index a5db18a..64439b3 100644 --- a/src/components/movies/MovieCard.js +++ b/src/components/movies/MovieCard.js @@ -450,7 +450,7 @@ function MovieCard({ {page === "Recommendations" ? (
-

{avg_rating}/10

+

{avg_rating * 2 }/10

) : ( "" From 2e5462825def74def2c615b2d28f78755f6091f1 Mon Sep 17 00:00:00 2001 From: MDS <7471385+moviedatascience@users.noreply.github.com> Date: Sat, 22 Aug 2020 14:04:30 -0400 Subject: [PATCH 822/822] Fixing broken privacy policy link --- src/components/auth/Register.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/auth/Register.js b/src/components/auth/Register.js index 1586dc3..80d4ec2 100644 --- a/src/components/auth/Register.js +++ b/src/components/auth/Register.js @@ -201,7 +201,7 @@ function Copyright() { {" "} 2020 {"."} - + GROƁ Privacy Policy