From d9f2ea8001a09c453c33fa40503ca161c41a6cfb Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 17 Oct 2019 19:48:43 -0700 Subject: [PATCH 01/43] added in banner --- src/assets/Banners/Calcumon-Banner1.png | Bin 0 -> 39336 bytes src/components/Login/index.tsx | 1 + src/components/Signup/index.tsx | 54 ++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 src/assets/Banners/Calcumon-Banner1.png diff --git a/src/assets/Banners/Calcumon-Banner1.png b/src/assets/Banners/Calcumon-Banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..1849bf130741b400363979658676e4accca47c65 GIT binary patch literal 39336 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 { @@ -17,13 +20,56 @@ class Signup extends React.Component { username: 'name', email: "@gmail.com", password: 'password', - correctPassword: 'Same Password' + correctPassword: 'Same Password', + error: false }; } + + handleSignIn = () =>{ + //#TODO update url to meet api standard + fetch("/auth", { + method: "post", + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + username: this.state.username, + password: this.state.password + }) + }).then((response) => response.json()) + .then((data) => { + // TODO: find what data backend sends us + if (!data.status) { + this.setState({ error : true }); + } else { + // TODO: Update redux to call authenticate action as true + } + }) + .catch((err) => { + console.log(err) + this.setState({ error : true }); + }) + + } + render() { - return (
-

hello

-
); + return (
+ this.setState({ username : e.target.value})} + required autoFocus /> + this.setState({ password : e.target.value})} + required /> + +
); } } From 5b9b800d3c55980dc4f710140581a2528e2f32f1 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Fri, 18 Oct 2019 09:48:01 -0700 Subject: [PATCH 02/43] added in some css for the login components. Now working on merging the reduxSetup to the Master branch --- src/components/Login/index.tsx | 1 + src/components/Login/styles/login.css | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 src/components/Login/styles/login.css diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 60b0305..062a223 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -4,6 +4,7 @@ import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import {Link} from 'react-router-dom' +import './styles/login.css'; import { setAuthentication } from '../../actions/authentication' diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css new file mode 100644 index 0000000..cf160fd --- /dev/null +++ b/src/components/Login/styles/login.css @@ -0,0 +1,4 @@ +body { + background-color: #f6f8ff; + background-image: url('../../../assets/Banners/Calcumon-Banner1.png'); +} \ No newline at end of file From cfce7982b08b36ca2c53cf6973a0b23e5fbb38f6 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Fri, 18 Oct 2019 11:51:51 -0700 Subject: [PATCH 03/43] added in webpack to fix the autofill feature that changes the background color and resize the text. Still playing with the feature --- src/App.tsx | 6 +-- src/components/Login/index.tsx | 11 ++--- src/components/Login/styles/login.css | 59 ++++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 579dec7..69a0a60 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,8 +16,8 @@ import Login from './components/Login/index' import Dashboard from './components/landingPage/index' // this will check authenication -import { setAuthentication } from './actions/authentication' -import request from './utils/request'; +// import { setAuthentication } from './actions/authentication' +// import request from './utils/request'; //This is for authenicated route import AuthenicatedRoute from './highOrderComponents/AuthenicatedRoute'; @@ -38,7 +38,7 @@ export default class App extends React.Component { {/* TODO: user={"Add variable from redux store"} */} - s + ); diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 062a223..875118d 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -69,11 +69,11 @@ class Login extends React.Component { render() { // TODO: If redux authenticated is true: redirect to user dashboard - return ( -
+ return (
+
this.setState({ username : e.target.value})} required autoFocus /> @@ -84,10 +84,11 @@ class Login extends React.Component { placeholder="Password" onChange={(e) => this.setState({ password : e.target.value})} required /> - + }}>Sign In +
) } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index cf160fd..f4f7b19 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -1,4 +1,61 @@ body { - background-color: #f6f8ff; + background-color: #F1FFCC; background-image: url('../../../assets/Banners/Calcumon-Banner1.png'); +} + +.inputContainer{ + position: absolute; + width: 300px; + height: 200px; + z-index: 15; + top: 50%; + left: 50%; + margin: -100px 0 0 -150px; + display: grid; + grid-auto-rows: auto auto auto; +} + +#inputUsername{ + border: none; + border-radius: 7px; + background-color: #C7C0F4; + margin: 10px; + text-align: center; + box-shadow: none; + font-size: 20px; +} + +/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ +#inputUsername:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; +} + + + +#inputPassword{ + -webkit-text-fill-color: #C7C0F4 !important; + border: none; + border-radius: 7px; + margin: 10px; + text-align: center; + box-shadow: none; + background-color: #C7C0F4; + font-size: 20px; +} +/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ +#inputPassword:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; + -webkit-text-fill-color: black +} + +#submitButton { + margin-top: 25px; + margin-left: 49px; + padding-left: -20px; + padding-right: -20px; + width: 200px; + background-color: #D6F091; + border: none; + border-radius: 7px; + font-size: 20px; } \ No newline at end of file From 64c511dae618eae7d868bf5eb057ed69221a1538 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 21 Oct 2019 09:41:01 -0700 Subject: [PATCH 04/43] added in api url --- .env.development | 1 + .env.production | 1 + package-lock.json | 521 +++++++++++++++++++++++- package.json | 8 +- src/App.tsx | 2 + src/components/Login/index.tsx | 42 +- src/components/Login/styles/login.css | 14 +- src/components/Signup/index.tsx | 48 ++- src/components/Signup/styles/Signup.css | 67 +++ 9 files changed, 658 insertions(+), 46 deletions(-) create mode 100644 src/components/Signup/styles/Signup.css diff --git a/.env.development b/.env.development index e69de29..daeb648 100644 --- a/.env.development +++ b/.env.development @@ -0,0 +1 @@ +https://hercalcumon.herokuapp.com/ \ No newline at end of file diff --git a/.env.production b/.env.production index e69de29..f83c82c 100644 --- a/.env.production +++ b/.env.production @@ -0,0 +1 @@ +https://hercalcumon.herokuapp.com/g \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3a267ae..45ed778 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,6 +1330,47 @@ "@babel/types": "^7.3.0" } }, + "@types/chai": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.3.tgz", + "integrity": "sha512-VRw2xEGbll3ZiTQ4J02/hUjNqZoue1bMhoo2dgM2LXjDdyaq4q80HgBDHwpI0/VKlo4Eg+BavyQMv/NYgTetzA==" + }, + "@types/chai-enzyme": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@types/chai-enzyme/-/chai-enzyme-0.6.7.tgz", + "integrity": "sha512-vV64mBF86MfmjaIijZY/3iPaJ9SwoXx35wt//KPXKicKtYb2K7xoh/ocXOXGnqRRszTTJSDPMHoJKyeLNx0rYQ==", + "requires": { + "@types/chai": "*", + "@types/cheerio": "*", + "@types/enzyme": "*", + "@types/react": "*" + } + }, + "@types/cheerio": { + "version": "0.22.13", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.13.tgz", + "integrity": "sha512-OZd7dCUOUkiTorf97vJKwZnSja/DmHfuBAroe1kREZZTCf/tlFecwHhsOos3uVHxeKGZDwzolIrCUApClkdLuA==", + "requires": { + "@types/node": "*" + } + }, + "@types/enzyme": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.3.tgz", + "integrity": "sha512-f/Kcb84sZOSZiBPCkr4He9/cpuSLcKRyQaEE20Q30Prx0Dn6wcyMAWI0yofL6yvd9Ht9G7EVkQeRqK0n5w8ILw==", + "requires": { + "@types/cheerio": "*", + "@types/react": "*" + } + }, + "@types/enzyme-adapter-react-16": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.5.tgz", + "integrity": "sha512-K7HLFTkBDN5RyRmU90JuYt8OWEY2iKUn43SDWEoBOXd/PowUWjLZ3Q6qMBiQuZeFYK/TOstaZxsnI0fXoAfLpg==", + "requires": { + "@types/enzyme": "*" + } + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1772,6 +1813,24 @@ } } }, + "airbnb-prop-types": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", + "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "dev": true, + "requires": { + "array.prototype.find": "^2.1.0", + "function.prototype.name": "^1.1.1", + "has": "^1.0.3", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.9.0" + } + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -1929,6 +1988,47 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.find": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0" + } + }, + "array.prototype.flat": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz", + "integrity": "sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + } + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2770,6 +2870,14 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chai-enzyme": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/chai-enzyme/-/chai-enzyme-1.0.0-beta.1.tgz", + "integrity": "sha512-vWT101M7qjq6kM/29G4vHrgLM4Mj1gCnKuvOSF03s8pFVsqol4B6USoGM/aYRKqaaIHs8/AxmHjWGFplQWhIQw==", + "requires": { + "html": "^1.0.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2785,6 +2893,69 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -4294,6 +4465,12 @@ "path-type": "^3.0.0" } }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -4512,6 +4689,128 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, + "enzyme": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz", + "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "html-element-map": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-regex": "^1.0.4", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.1.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz", + "integrity": "sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.12.1", + "enzyme-shallow-equal": "^1.0.0", + "has": "^1.0.3", + "object.assign": "^4.1.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "react-is": "^16.10.2", + "react-test-renderer": "^16.0.0-0", + "semver": "^5.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", + "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "enzyme-adapter-utils": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz", + "integrity": "sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==", + "dev": true, + "requires": { + "airbnb-prop-types": "^2.15.0", + "function.prototype.name": "^1.1.1", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.1", + "prop-types": "^15.7.2", + "semver": "^5.7.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "enzyme-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz", + "integrity": "sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.0.1" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -5727,11 +6026,29 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1", + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "functions-have-names": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", + "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5882,9 +6199,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", + "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -6089,11 +6406,36 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, + "html": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/html/-/html-1.0.0.tgz", + "integrity": "sha1-pUT6nqVJK/s6LMqCEKEL57WvH2E=", + "requires": { + "concat-stream": "^1.4.7" + } + }, "html-comment-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" }, + "html-element-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.1.0.tgz", + "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + }, + "dependencies": { + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + } + } + }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -6431,6 +6773,12 @@ "binary-extensions": "^1.0.0" } }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -6533,6 +6881,12 @@ "kind-of": "^3.0.2" } }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -6600,6 +6954,18 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -8051,6 +8417,24 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "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.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8443,6 +8827,12 @@ } } }, + "moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8516,6 +8906,27 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "nearley": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.0.tgz", + "integrity": "sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8771,6 +9182,12 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, "object-is": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", @@ -10230,6 +10647,17 @@ "react-is": "^16.8.1" } }, + "prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -10330,6 +10758,22 @@ "performance-now": "^2.1.0" } }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10598,6 +11042,30 @@ "workbox-webpack-plugin": "4.3.1" } }, + "react-test-renderer": { + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.10.2.tgz", + "integrity": "sha512-k9Qzyev6cTIcIfrhgrFlYQAFxh5EEDO6ALNqYqmKsWVA7Q/rUMTay5nD3nthi6COmYsd4ghVYyi8U86aoeMqYQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.16.2" + }, + "dependencies": { + "scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10691,6 +11159,12 @@ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" }, + "reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "dev": true + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -11065,6 +11539,16 @@ "inherits": "^2.0.1" } }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -11918,6 +12402,37 @@ } } }, + "string.prototype.trim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", + "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", diff --git a/package.json b/package.json index b6aa1b6..2777356 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { + "@types/chai-enzyme": "^0.6.7", + "@types/enzyme": "^3.10.3", + "@types/enzyme-adapter-react-16": "^1.0.5", "@types/jest": "^24.0.18", "@types/node": "^12.7.3", "@types/react": "^16.9.2", @@ -11,6 +14,7 @@ "@types/react-router-dom": "^5.1.0", "@types/redux": "^3.6.0", "axios": "^0.19.0", + "chai-enzyme": "^1.0.0-beta.1", "react": "^16.9.0", "react-dom": "^16.9.0", "react-redux": "^7.1.1", @@ -42,6 +46,8 @@ ] }, "devDependencies": { - "@types/redux-thunk": "^2.1.0" + "@types/redux-thunk": "^2.1.0", + "enzyme": "^3.10.0", + "enzyme-adapter-react-16": "^1.15.1" } } diff --git a/src/App.tsx b/src/App.tsx index 69a0a60..39da2f9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -23,6 +23,7 @@ import Dashboard from './components/landingPage/index' import AuthenicatedRoute from './highOrderComponents/AuthenicatedRoute'; import reducers from './reducers'; +import Signup from './components/Signup'; const store = createStore(reducers) {/* TODO: Add after login form is moved out of landing page: */} @@ -35,6 +36,7 @@ export default class App extends React.Component {
+ {/* TODO: user={"Add variable from redux store"} */} diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 875118d..32a802b 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { request } from 'http'; import { connect } from 'react-redux' import { bindActionCreators } from 'redux' -import {Link} from 'react-router-dom' +import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' import './styles/login.css'; @@ -69,27 +69,29 @@ class Login extends React.Component { render() { // TODO: If redux authenticated is true: redirect to user dashboard - return (
+ return (<> +
- this.setState({ username : e.target.value})} - required autoFocus /> - this.setState({ password : e.target.value})} - required /> - -
+ + this.setState({ username : e.target.value})} + required autoFocus /> + this.setState({ password : e.target.value})} + required /> +
+ ) } } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index f4f7b19..499e481 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -1,8 +1,8 @@ body { background-color: #F1FFCC; - background-image: url('../../../assets/Banners/Calcumon-Banner1.png'); } + .inputContainer{ position: absolute; width: 300px; @@ -11,8 +11,15 @@ body { top: 50%; left: 50%; margin: -100px 0 0 -150px; - display: grid; - grid-auto-rows: auto auto auto; + display: flex; + flex-direction: column; +} + +/* We need an svg here. This image will cause screen sizing issues */ +.header{ + padding-top: 20px; + height: 400px; + width: 400px; } #inputUsername{ @@ -23,6 +30,7 @@ body { text-align: center; box-shadow: none; font-size: 20px; + color: #383838 } /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 7d9f92b..ab89212 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { bool } from 'prop-types'; import { booleanLiteral } from '@babel/types'; +import {Link} from 'react-router-dom' +import './styles/Signup.css' export interface Props { signUpAuthenication: Function; } @@ -51,25 +53,33 @@ class Signup extends React.Component { } render() { - return (
- this.setState({ username : e.target.value})} - required autoFocus /> - this.setState({ password : e.target.value})} - required /> - -
); + return ( +
+
+ this.setState({ username : e.target.value})} + required autoFocus /> + this.setState({ password : e.target.value})} + required /> + +
+

Already Registered?

+
LOGIN
+
+
+
+ ); } } diff --git a/src/components/Signup/styles/Signup.css b/src/components/Signup/styles/Signup.css new file mode 100644 index 0000000..66e9bcf --- /dev/null +++ b/src/components/Signup/styles/Signup.css @@ -0,0 +1,67 @@ +body { + background-color: #F1FFCC; + +} +.header{ + background-image: url('../../../assets/Banners/Calcumon-Banner1.png'); +} + +.signUpContainer{ + position: absolute; + width: 300px; + height: 200px; + z-index: 15; + top: 50%; + left: 50%; + margin: -100px 0 0 -150px; + display: flex; + flex-direction: column; +} + +#inputUsername{ + border: none; + border-radius: 7px; + background-color: #C7C0F4; + margin: 10px; + text-align: center; + box-shadow: none; + font-size: 20px; + color: #383838 +} + +/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ +#inputUsername:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; +} + + + +#inputPassword{ + -webkit-text-fill-color: #C7C0F4 !important; + border: none; + border-radius: 7px; + margin: 10px; + text-align: center; + box-shadow: none; + background-color: #C7C0F4; + font-size: 20px; + color: #383838 +} +/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ +#inputPassword:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; + -webkit-text-fill-color: black +} + +#submitButton { + margin-top: 25px; + margin-left: 49px; + padding-left: -20px; + padding-right: -20px; + width: 200px; + background-color: #D6F091; + border: none; + border-radius: 7px; + font-size: 20px; + color: #383838 +} \ No newline at end of file From cfc1a9d865ee4d432d9aac9acc5a465f477df73f Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 21 Oct 2019 10:00:06 -0700 Subject: [PATCH 05/43] added in addition information. Make a link to the user signup page --- .env.production | 2 +- src/App.tsx | 2 +- src/components/Login/index.tsx | 6 ++++++ src/utils/request.tsx | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.env.production b/.env.production index f83c82c..daeb648 100644 --- a/.env.production +++ b/.env.production @@ -1 +1 @@ -https://hercalcumon.herokuapp.com/g \ No newline at end of file +https://hercalcumon.herokuapp.com/ \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 39da2f9..00b1153 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -36,7 +36,7 @@ export default class App extends React.Component {
- + {/* TODO: user={"Add variable from redux store"} */} diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 32a802b..704bcc8 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -4,6 +4,8 @@ import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' +import { Link } from 'react-router-dom'; + import './styles/login.css'; import { setAuthentication } from '../../actions/authentication' @@ -90,6 +92,10 @@ class Login extends React.Component { // TODO: validate data function this.handleSignIn() }}>Sign In +
+

New Here?

+ +
) diff --git a/src/utils/request.tsx b/src/utils/request.tsx index c58b192..4369313 100644 --- a/src/utils/request.tsx +++ b/src/utils/request.tsx @@ -13,7 +13,7 @@ export interface IRequestBody { const request = (path= '', method = 'get', body = null) => { const token = localStorage.getItem('token') - + return fetch(`${process.env.REACT_APP_BACKEND}${path}`, { method: method, headers: { From a7eab2dec953cb7e19797a99e2673305109fdf3a Mon Sep 17 00:00:00 2001 From: Nolan Kovacik Date: Wed, 23 Oct 2019 13:17:33 -0700 Subject: [PATCH 06/43] [upd] gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 24cdedf..672662a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# vscode +/.vscode + # dependencies /node_modules /.pnp @@ -20,4 +23,4 @@ npm-debug.log* yarn-debug.log* -yarn-error.log* \ No newline at end of file +yarn-error.log* From f4831930f29ffc7179ef2498fc34535ee416e652 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Wed, 23 Oct 2019 13:25:15 -0700 Subject: [PATCH 07/43] fixed png working --- src/actions/authentication.tsx | 18 ++++++++++- src/components/Login/index.tsx | 14 ++++----- src/components/Login/styles/login.css | 1 - src/components/Signup/index.tsx | 42 +++++++++---------------- src/components/Signup/styles/Signup.css | 4 ++- src/constants/authConstants.tsx | 0 src/reducers/authentication.tsx | 2 ++ src/utils/signupRequest.tsx | 20 ++++++++++++ 8 files changed, 64 insertions(+), 37 deletions(-) create mode 100644 src/constants/authConstants.tsx create mode 100644 src/utils/signupRequest.tsx diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index fcf682e..b1c3636 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -2,7 +2,7 @@ import { ActionCreator, Dispatch } from 'redux'; import { ThunkAction } from 'redux-thunk'; import request from '../utils/request' - +import signUpRequest from '../utils/signupRequest' export const SET_AUTHENTICATION = 'SET_AUTHENTICATION' @@ -33,4 +33,20 @@ export const setAuthentication = ( claim : AUTH_STATE )=> ({ // // .then(response => this.props.setAuthentication(response.data)) // // .catch(err => this.props.setAuthentication(null)) // } +// } + +// #setup login actions +// export const signIn = (payload) => { +// return { +// type: signIn, +// payload +// } +// } + +// #Setup SignUp actions +// export const signUp = (payload) => { +// return { +// type: signUp, +// payload +// } // } \ No newline at end of file diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 704bcc8..df26ac2 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -71,21 +71,21 @@ class Login extends React.Component { render() { // TODO: If redux authenticated is true: redirect to user dashboard - return (<> - + return ( + <> +
- this.setState({ username : e.target.value})} required autoFocus /> this.setState({ password : e.target.value})} required />
-
+
) } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 499e481..7c42d28 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -53,7 +53,6 @@ body { /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ #inputPassword:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; - -webkit-text-fill-color: black } #submitButton { diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index ab89212..15251a6 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -11,7 +11,7 @@ export interface State { username: string; email?: string; password: string; - correctPassword: string; + verifiedPassword: string; error: boolean; } @@ -19,37 +19,18 @@ class Signup extends React.Component { constructor(props: Props) { super(props); this.state = { - username: 'name', - email: "@gmail.com", - password: 'password', - correctPassword: 'Same Password', + username: '', + email: "", + password: '', + verifiedPassword: '', error: false }; } handleSignIn = () =>{ //#TODO update url to meet api standard - fetch("/auth", { - method: "post", - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ - username: this.state.username, - password: this.state.password - }) - }).then((response) => response.json()) - .then((data) => { - // TODO: find what data backend sends us - if (!data.status) { - this.setState({ error : true }); - } else { - // TODO: Update redux to call authenticate action as true - } - }) - .catch((err) => { - console.log(err) - this.setState({ error : true }); - }) - + + this.props.signUpAuthenication({username:this.state.username,email:this.state.email,password:this.state.password}) } render() { @@ -69,13 +50,20 @@ class Signup extends React.Component { placeholder="Password" onChange={(e) => this.setState({ password : e.target.value})} required /> + this.setState({ verifiedPassword : e.target.value})} + required />

Already Registered?

-
LOGIN
+
diff --git a/src/components/Signup/styles/Signup.css b/src/components/Signup/styles/Signup.css index 66e9bcf..71c050b 100644 --- a/src/components/Signup/styles/Signup.css +++ b/src/components/Signup/styles/Signup.css @@ -3,7 +3,9 @@ body { } .header{ - background-image: url('../../../assets/Banners/Calcumon-Banner1.png'); + padding-top: 20px; + height: 400px; + width: 400px; } .signUpContainer{ diff --git a/src/constants/authConstants.tsx b/src/constants/authConstants.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index 4e5131a..fda76b0 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -18,6 +18,8 @@ export const authentication : Reducer = (state = AUTHEN case SET_AUTHENTICATION: const { user, pending } = action.payload return { user, pending } + // case login: + // const { username, } default: return state } diff --git a/src/utils/signupRequest.tsx b/src/utils/signupRequest.tsx new file mode 100644 index 0000000..92fc493 --- /dev/null +++ b/src/utils/signupRequest.tsx @@ -0,0 +1,20 @@ +export interface IRequestBody { + email?: string; + username: string; + password: string; +} + +const signUpRequest = (body:IRequestBody) => { + + return fetch(`${process.env.REACT_APP_BACKEND}/user/${body.username}`, { + method: 'post', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + body: JSON.stringify(body) + }) + +} + +export default signUpRequest From 9541de00b4de5ab119730f2809c23655c5080c12 Mon Sep 17 00:00:00 2001 From: Nolan Kovacik Date: Wed, 23 Oct 2019 13:34:54 -0700 Subject: [PATCH 08/43] [fmt] configuring indentation (2 spaces) --- public/manifest.json | 2 +- src/App.tsx | 32 ++-- src/components/Login/index.tsx | 149 +++++++++--------- src/components/Signup/index.tsx | 46 +++--- src/components/landingPage/index.tsx | 18 +-- src/highOrderComponents/AuthenicatedRoute.tsx | 10 +- src/reducers/authentication.tsx | 6 +- src/utils/request.tsx | 6 +- src/utils/signupRequest.tsx | 2 +- 9 files changed, 135 insertions(+), 136 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index d1c1d1d..080d6c7 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -16,7 +16,7 @@ "src": "logo512.png", "type": "image/png", "sizes": "512x512" - } + } ], "start_url": ".", "display": "standalone", diff --git a/src/App.tsx b/src/App.tsx index 00b1153..f8033b1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,7 @@ import { connect } from "react-redux"; import { bindActionCreators } from 'redux'; -// Components +// Components // import SignUp from './components/Signup/index' import Login from './components/Login/index' import Dashboard from './components/landingPage/index' @@ -30,19 +30,19 @@ const store = createStore(reducers) export default class App extends React.Component { render(){ - return ( - - -
- - - - {/* TODO: user={"Add variable from redux store"} */} - - -
-
-
- ); + return ( + + +
+ + + + {/* TODO: user={"Add variable from redux store"} */} + + +
+
+
+ ); + } } -} \ No newline at end of file diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index df26ac2..ddc1a07 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -12,94 +12,93 @@ import { setAuthentication } from '../../actions/authentication' // TODO: What will be in our LoginInterface? interface IErrorLoginState { - showErrorMessage: Boolean; - username: string; - password: string; - error: boolean; + showErrorMessage: Boolean; + username: string; + password: string; + error: boolean; } interface Props{ - setAuthentication: Function; - request: Function + setAuthentication: Function; + request: Function } class Login extends React.Component { - - constructor(props: Props){ - super(props) - this.state = { - showErrorMessage: false, - username: '', - password: '', - error: false, - } + + constructor(props: Props){ + super(props) + this.state = { + showErrorMessage: false, + username: '', + password: '', + error: false, } + } - // TODO: integrate in LOGIN component - // componentDidMount(){ - // request('/auth/token') - // .then(response => this.props.setAuthentication(response.data)) - // .catch(err => this.props.setAuthentication(null)) - // } + // TODO: integrate in LOGIN component + // componentDidMount(){ + // request('/auth/token') + // .then(response => this.props.setAuthentication(response.data)) + // .catch(err => this.props.setAuthentication(null)) + // } - handleSignIn = () =>{ - //#TODO update url to meet api standard - fetch("/auth", { - method: "post", - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ - username: this.state.username, - password: this.state.password - }) - }).then((response) => response.json()) - .then((data) => { - // TODO: find what data backend sends us - if (!data.status) { - this.setState({ error : true }); - } else { - // TODO: Update redux to call authenticate action as true - } - }) - .catch((err) => { - console.log(err) - this.setState({ error : true }); - }) - + handleSignIn = () =>{ + //#TODO update url to meet api standard + fetch("/auth", { + method: "post", + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + username: this.state.username, + password: this.state.password + }) + }).then((response) => response.json()) + .then((data) => { + // TODO: find what data backend sends us + if (!data.status) { + this.setState({ error : true }); + } else { + // TODO: Update redux to call authenticate action as true } + }).catch((err) => { + console.log(err) + this.setState({ error : true }); + }) + + } - render() { - // TODO: If redux authenticated is true: redirect to user dashboard + render() { + // TODO: If redux authenticated is true: redirect to user dashboard return ( - <> - -
- this.setState({ username : e.target.value})} - required autoFocus /> - this.setState({ password : e.target.value})} - required /> - -
-

New Here?

- -
-
- - ) -} + <> + +
+ this.setState({ username : e.target.value})} + required autoFocus /> + this.setState({ password : e.target.value})} + required /> + +
+

New Here?

+ +
+
+ + ) + } } -export default Login; \ No newline at end of file +export default Login; diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 15251a6..4460f8d 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -6,7 +6,7 @@ import './styles/Signup.css' export interface Props { signUpAuthenication: Function; } - + export interface State { username: string; email?: string; @@ -14,11 +14,11 @@ export interface State { verifiedPassword: string; error: boolean; } - + class Signup extends React.Component { constructor(props: Props) { super(props); - this.state = { + this.state = { username: '', email: "", password: '', @@ -28,33 +28,33 @@ class Signup extends React.Component { } handleSignIn = () =>{ - //#TODO update url to meet api standard - + //#TODO update url to meet api standard + this.props.signUpAuthenication({username:this.state.username,email:this.state.email,password:this.state.password}) } - render() { - return ( + render() { + return (
- this.setState({ username : e.target.value})} required autoFocus /> - this.setState({ password : e.target.value})} required /> - this.setState({ verifiedPassword : e.target.value})} required /> -
-

New Here?

- -
+
+

New Here?

+ +
) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 3afada8..6c4405d 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -1,15 +1,15 @@ import React from 'react'; - export interface LandingPageProps { } - class LandingPage extends React.Component { render() { - return (
-

hello

-
); + return ( +
+

hello

+
+ ); } } From 601e4b3c00c60b0169345a09336532b790997cef Mon Sep 17 00:00:00 2001 From: Nolan Kovacik Date: Wed, 23 Oct 2019 14:56:45 -0700 Subject: [PATCH 12/43] [upd] main logo arrangement centering logo and fixing its size overall --- src/components/Login/index.tsx | 78 +++++++++++++++++---------- src/components/Login/styles/login.css | 9 ++-- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index bdc146a..c9f4e98 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -45,8 +45,8 @@ class Login extends React.Component { handleSignIn = () =>{ //#TODO update url to meet api standard - fetch("/auth", { - method: "post", + fetch('/auth', { + method: 'post', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ username: this.state.username, @@ -56,13 +56,13 @@ class Login extends React.Component { .then((data) => { // TODO: find what data backend sends us if (!data.status) { - this.setState({ error : true }); + this.setState({ error: true }); } else { // TODO: Update redux to call authenticate action as true } }).catch((err) => { console.log(err) - this.setState({ error : true }); + this.setState({ error: true }); }) } @@ -72,30 +72,54 @@ class Login extends React.Component { return ( <> - -
- this.setState({ username : e.target.value})} - required autoFocus /> - this.setState({ password : e.target.value})} - required /> - -
-

New Here?

- -
+ + +
+ { + this.setState({ username: e.target.value}) + }} + required + autoFocus + /> + + { + this.setState({ password: e.target.value}) + }} + required + />
+ + + +

already registered?

+ + + + ) } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 38c0da6..1212382 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -15,9 +15,11 @@ body { } /* Waiting for SVG */ -.header { - padding-top: 20px; - width: 400px; +.splash-logo { + display: block; + margin: 15vh auto 0 auto; + width: 300px; + min-width: 65vw; } #inputUsername{ @@ -31,7 +33,6 @@ body { color: #383838 } - /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ #inputPassword:-webkit-autofill { box-shadow: 0 0 0 1000px #C7C0F4 inset !important; From b60f41c2e912372a062a452c15cc029afc3a5c83 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Wed, 23 Oct 2019 18:15:30 -0700 Subject: [PATCH 13/43] Auth reworks I made First I removed the utils folder. Second I am adding in tests for api calls in login folder. Added in constants folder, so I can save the constant action types to clean up the code, make it more readable. Debating on removing to clean up the code. Going to rework the reducer. Now trying to configure the api call to check out what is given in the response. --- .env.development | 2 +- .env.production | 2 +- src/actions/authentication.tsx | 40 ++++++++++--------- src/components/Login/index.tsx | 32 ++++++--------- src/components/Signup/index.tsx | 1 + src/constants/authConstants.tsx | 5 +++ src/highOrderComponents/AuthenicatedRoute.tsx | 2 +- src/reducers/authentication.tsx | 10 +++-- src/utils/request.tsx | 30 -------------- src/utils/signupRequest.tsx | 20 ---------- 10 files changed, 49 insertions(+), 95 deletions(-) delete mode 100644 src/utils/request.tsx delete mode 100644 src/utils/signupRequest.tsx diff --git a/.env.development b/.env.development index daeb648..f587d2d 100644 --- a/.env.development +++ b/.env.development @@ -1 +1 @@ -https://hercalcumon.herokuapp.com/ \ No newline at end of file +https://calcumon-user-api.herokuapp.com \ No newline at end of file diff --git a/.env.production b/.env.production index daeb648..f587d2d 100644 --- a/.env.production +++ b/.env.production @@ -1 +1 @@ -https://hercalcumon.herokuapp.com/ \ No newline at end of file +https://calcumon-user-api.herokuapp.com \ No newline at end of file diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index b1c3636..824876f 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -1,18 +1,23 @@ import { ActionCreator, Dispatch } from 'redux'; import { ThunkAction } from 'redux-thunk'; -import request from '../utils/request' -import signUpRequest from '../utils/signupRequest' +// export const SET_AUTHENTICATION = 'SET_AUTHENTICATION' -export const SET_AUTHENTICATION = 'SET_AUTHENTICATION' +import { SET_AUTHENTICATION, LOG_IN } from '../constants/authConstants' + export interface AUTH_STATE { user: string | null; // TODO: confirm that this is a string OR is it a boolean? How are you tracking auth success pending: boolean; } +export interface LOGIN_STATE { + username: string; + password: string; +} + export interface AUTH_ACTION_TYPE { type: typeof SET_AUTHENTICATION, payload: AUTH_STATE @@ -26,22 +31,19 @@ export const setAuthentication = ( claim : AUTH_STATE )=> ({ payload: claim, }) -//#Setup getUser login and signUpUSer actions -// export const getUser = () => { -// return Dispatch => { -// // request('/auth/token') -// // .then(response => this.props.setAuthentication(response.data)) -// // .catch(err => this.props.setAuthentication(null)) -// } -// } - -// #setup login actions -// export const signIn = (payload) => { -// return { -// type: signIn, -// payload -// } -// } + + +export interface LOG_IN { + type: typeof LOG_IN, + payload: LOGIN_STATE +} + +export const signIn = (payload: LOGIN_STATE) => { + return { + type: typeof LOG_IN, + payload + } +} // #Setup SignUp actions // export const signUp = (payload) => { diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index ddc1a07..271e600 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -4,6 +4,7 @@ import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' + import { Link } from 'react-router-dom'; import './styles/login.css'; @@ -44,27 +45,18 @@ class Login extends React.Component { handleSignIn = () =>{ - //#TODO update url to meet api standard - fetch("/auth", { - method: "post", - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ - username: this.state.username, - password: this.state.password + // this.props.logIn({username: this.state.username, password: this.state.password}) + + return fetch(`${process.env.REACT_APP_BACKEND}auth/login`, + method: 'post', + headers: { + 'Content-Type': 'application/json', + 'accept': 'application/json' + }, + {username: this.state.username, password: this.state.password}) + .then((response)=>{ + console.log(response) }) - }).then((response) => response.json()) - .then((data) => { - // TODO: find what data backend sends us - if (!data.status) { - this.setState({ error : true }); - } else { - // TODO: Update redux to call authenticate action as true - } - }).catch((err) => { - console.log(err) - this.setState({ error : true }); - }) - } render() { diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 4460f8d..50d0546 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -31,6 +31,7 @@ class Signup extends React.Component { //#TODO update url to meet api standard this.props.signUpAuthenication({username:this.state.username,email:this.state.email,password:this.state.password}) + .then(Response=>Response.data) } render() { diff --git a/src/constants/authConstants.tsx b/src/constants/authConstants.tsx index e69de29..6407106 100644 --- a/src/constants/authConstants.tsx +++ b/src/constants/authConstants.tsx @@ -0,0 +1,5 @@ +const SET_AUTHENTICATION: String = 'SET_AUTHENTICATION' + +const LOG_IN: String = 'LOG_IN' + +export {SET_AUTHENTICATION, LOG_IN} diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index a04b00a..f0e4474 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -34,7 +34,7 @@ class AuthenticatedRoute extends Component { )}/> } else { - return + return } } diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index e289646..d25af46 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -1,5 +1,7 @@ import { Reducer } from 'redux'; -import { SET_AUTHENTICATION, AUTH_STATE, AUTH_ACTION_TYPE, ACTION_TYPE } from '../actions/authentication'; +import { AUTH_STATE, AUTH_ACTION_TYPE, ACTION_TYPE } from '../actions/authentication'; + +import { SET_AUTHENTICATION, LOG_IN } from '../constants/authConstants' // export const posts = (state=[], action) => { // switch(action.type){ @@ -11,6 +13,7 @@ import { SET_AUTHENTICATION, AUTH_STATE, AUTH_ACTION_TYPE, ACTION_TYPE } from '. const AUTHENTICATION_INITIAL_STATE : AUTH_STATE = { user: null, pending: true, + } export const authentication : Reducer = (state = AUTHENTICATION_INITIAL_STATE, action: AUTH_ACTION_TYPE) : AUTH_STATE => { @@ -18,8 +21,9 @@ export const authentication : Reducer = (state = AUTHEN case SET_AUTHENTICATION: const { user, pending } = action.payload return { user, pending } - // case login: - // const { username, } + // case LOG_IN: + // case LOG_OUT: + // case SIGN_UP: default: return state } diff --git a/src/utils/request.tsx b/src/utils/request.tsx deleted file mode 100644 index 0ef628b..0000000 --- a/src/utils/request.tsx +++ /dev/null @@ -1,30 +0,0 @@ - -export interface IRequest { - path: string; - method: string; -} - -export interface IRequestBody { - username: string; - password: string; -} - -//request is for user login -const request = (path= '', method = 'get', body = null) => { - - const token = localStorage.getItem('token') - - return fetch(`${process.env.REACT_APP_BACKEND}${path}`, { - method: method, - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': token ? `Bearer ${token}` : '' - }, - body: JSON.stringify(body) - }) -} - -//#Build a addUserRequest function - -export default request diff --git a/src/utils/signupRequest.tsx b/src/utils/signupRequest.tsx deleted file mode 100644 index 329261f..0000000 --- a/src/utils/signupRequest.tsx +++ /dev/null @@ -1,20 +0,0 @@ -export interface IRequestBody { - email?: string; - username: string; - password: string; -} - -const signUpRequest = (body:IRequestBody) => { - - return fetch(`${process.env.REACT_APP_BACKEND}/user/${body.username}`, { - method: 'post', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - body: JSON.stringify(body) - }) - -} - -export default signUpRequest From f9ad8d655a3073e1ac11dbb3d23c409e8b116273 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Wed, 23 Oct 2019 19:35:33 -0700 Subject: [PATCH 14/43] working on getting this handleSignIn working --- src/components/Login/index.tsx | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index db59fde..a69c10b 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -10,6 +10,7 @@ import { Link } from 'react-router-dom'; import './styles/login.css'; import { setAuthentication } from '../../actions/authentication' +import { object } from 'prop-types'; // TODO: What will be in our LoginInterface? interface IErrorLoginState { @@ -24,6 +25,17 @@ interface Props{ request: Function } +interface requestBody { + username: string; + password: string; +} + +interface responseBody { + status: string; + message: string; + Authorization: string; +} + class Login extends React.Component { constructor(props: Props) { @@ -47,14 +59,16 @@ class Login extends React.Component { handleSignIn = () =>{ // this.props.logIn({username: this.state.username, password: this.state.password}) - return fetch(`${process.env.REACT_APP_BACKEND}auth/login`, + const body: requestBody = {username: this.state.username, password: this.state.password} + + return fetch(`${process.env.REACT_APP_BACKEND}auth/login`, { method: 'post', headers: { - 'Content-Type': 'application/json', - 'accept': 'application/json' + 'accept': 'application/json', + 'Content-Type': 'application/json' }, - {username: this.state.username, password: this.state.password}) - .then((response)=>{ + body: JSON.stringify(body) + }).then((response: responseBody)=> void { console.log(response) }) } From 085b39fb9004a83adf76cb97d152312853fcdccb Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 24 Oct 2019 11:17:24 -0700 Subject: [PATCH 15/43] fixed fetch request bug. Probably fixed cors error --- src/components/Login/index.tsx | 23 +++++++++++++---------- src/components/Signup/index.tsx | 23 ++++++++++++++++++----- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index a69c10b..c218e07 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import { request } from 'http'; import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' @@ -10,7 +9,8 @@ import { Link } from 'react-router-dom'; import './styles/login.css'; import { setAuthentication } from '../../actions/authentication' -import { object } from 'prop-types'; +import { async } from 'q'; + // TODO: What will be in our LoginInterface? interface IErrorLoginState { @@ -56,26 +56,28 @@ class Login extends React.Component { // } - handleSignIn = () =>{ + handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) - + console.log("I am here") const body: requestBody = {username: this.state.username, password: this.state.password} - return fetch(`${process.env.REACT_APP_BACKEND}auth/login`, { + return fetch(`https://calcumon-user-api.herokuapp.com/auth/login`, { method: 'post', headers: { 'accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(body) - }).then((response: responseBody)=> void { + }) + .then((response)=>{ console.log(response) + }) + .catch(err=>{console.log(err)}) } render() { // TODO: If redux authenticated is true: redirect to user dashboard - return ( <> { -

already registered?

+

New Here?

From 0b08ac5a9f32bd59f37eeb6545a7031548f73b39 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 24 Oct 2019 12:07:34 -0700 Subject: [PATCH 16/43] addedin successful login and signup fetch calls, now working on adding in logout --- src/components/Login/index.tsx | 2 +- src/components/Signup/index.tsx | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index c218e07..1a2faaf 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -71,7 +71,7 @@ class Login extends React.Component { }) .then((response)=>{ console.log(response) - + }) .catch(err=>{console.log(err)}) } diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 940b9e0..560d132 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -27,7 +27,7 @@ class Signup extends React.Component { }; } - handleSignIn = () =>{ + handleSignUp = () =>{ //#TODO update url to meet api standard fetch(`https://calcumon-user-api.herokuapp.com/user/`,{ @@ -36,7 +36,10 @@ class Signup extends React.Component { 'accept': 'application/json', 'Content-Type': 'application/json' }, - body: JSON.stringify({email: this.state.password, username: this.state.username, password: this.state.password}) + body: JSON.stringify({email: this.state.email, username: this.state.username, password: this.state.password}) + }) + .then((response)=>{ + console.log(response) }) } @@ -73,7 +76,7 @@ class Signup extends React.Component { required /> */}

Already Registered?

From e94d1c386dab10aa1adecae42f3bda8466587126 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 24 Oct 2019 12:25:54 -0700 Subject: [PATCH 17/43] added in working login and signup --- src/components/Login/index.tsx | 3 +-- src/components/Login/styles/login.css | 9 +++++++-- src/constants/authConstants.tsx | 6 ++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 1a2faaf..7ca3b5b 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -109,8 +109,6 @@ class Login extends React.Component { }} required /> -
- +
) diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 1212382..432126d 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -5,7 +5,7 @@ body { .inputContainer{ position: absolute; width: 300px; - height: 200px; + height: 500px; z-index: 15; top: 50%; left: 50%; @@ -30,9 +30,14 @@ body { text-align: center; box-shadow: none; font-size: 20px; - color: #383838 + color: #383838; + } +input { + height: 100px; + width: 250px; +} /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ #inputPassword:-webkit-autofill { box-shadow: 0 0 0 1000px #C7C0F4 inset !important; diff --git a/src/constants/authConstants.tsx b/src/constants/authConstants.tsx index 6407106..b7490df 100644 --- a/src/constants/authConstants.tsx +++ b/src/constants/authConstants.tsx @@ -2,4 +2,10 @@ const SET_AUTHENTICATION: String = 'SET_AUTHENTICATION' const LOG_IN: String = 'LOG_IN' +// const LOG_OUT: stirng = 'LOG_OUT' + +// const SIGN_UP: String = 'SIGN_UP' + export {SET_AUTHENTICATION, LOG_IN} + +// LOG_OUT, LOG_OUT \ No newline at end of file From a3328f4eac44e1c24e6946258c69c5fd209e8a2f Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Fri, 25 Oct 2019 12:49:52 -0700 Subject: [PATCH 18/43] reading response data now --- src/actions/authentication.tsx | 28 +++++++++++++++++++++++++++- src/components/Login/index.tsx | 14 ++++++++------ src/components/landingPage/index.tsx | 5 +++++ src/constants/authConstants.tsx | 8 +++----- src/reducers/authentication.tsx | 5 ++--- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index 824876f..cab2e95 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -6,18 +6,26 @@ import { ThunkAction } from 'redux-thunk'; -import { SET_AUTHENTICATION, LOG_IN } from '../constants/authConstants' +import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' export interface AUTH_STATE { user: string | null; // TODO: confirm that this is a string OR is it a boolean? How are you tracking auth success pending: boolean; } +//login State export interface LOGIN_STATE { username: string; password: string; } +//Sign Up State +export interface SIGN_UP_STATE { + gmail?: string; + usermame: string; + password: string; +} + export interface AUTH_ACTION_TYPE { type: typeof SET_AUTHENTICATION, payload: AUTH_STATE @@ -38,6 +46,11 @@ export interface LOG_IN { payload: LOGIN_STATE } +export interface SIGN_UP { + type: typeof SIGN_UP, + payload: SIGN_UP_STATE +} + export const signIn = (payload: LOGIN_STATE) => { return { type: typeof LOG_IN, @@ -45,6 +58,19 @@ export const signIn = (payload: LOGIN_STATE) => { } } +export const signUp = (payload: SIGN_UP_STATE) => { + return { + type: typeof SIGN_UP, + payload + } +} + +export const logOut = () => { + return { + type: typeof LOG_OUT + } +} + // #Setup SignUp actions // export const signUp = (payload) => { // return { diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 7ca3b5b..d66c72a 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -39,7 +39,7 @@ interface responseBody { class Login extends React.Component { constructor(props: Props) { - super(props) + super(props); this.state = { showErrorMessage: false, username: '', @@ -62,16 +62,18 @@ class Login extends React.Component { const body: requestBody = {username: this.state.username, password: this.state.password} return fetch(`https://calcumon-user-api.herokuapp.com/auth/login`, { - method: 'post', + method: 'POST', headers: { 'accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(body) - }) - .then((response)=>{ - console.log(response) - + }).then(response=>{ + return response.json() + }).then((data)=>{ + // this.props.history.push('/dashboard') + // this.props.logIn(data.body) + console.log(data) }) .catch(err=>{console.log(err)}) } diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 6c4405d..a1b7f6a 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -3,7 +3,12 @@ export interface LandingPageProps { } +// export interface LandingPageState { + +// } + class LandingPage extends React.Component { + render() { return (
diff --git a/src/constants/authConstants.tsx b/src/constants/authConstants.tsx index b7490df..0edc1ff 100644 --- a/src/constants/authConstants.tsx +++ b/src/constants/authConstants.tsx @@ -2,10 +2,8 @@ const SET_AUTHENTICATION: String = 'SET_AUTHENTICATION' const LOG_IN: String = 'LOG_IN' -// const LOG_OUT: stirng = 'LOG_OUT' +const SIGN_UP: String = 'SIGN_UP' -// const SIGN_UP: String = 'SIGN_UP' +const LOG_OUT: String = 'LOG_OUT' -export {SET_AUTHENTICATION, LOG_IN} - -// LOG_OUT, LOG_OUT \ No newline at end of file +export { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } \ No newline at end of file diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index d25af46..a59af81 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -1,7 +1,7 @@ import { Reducer } from 'redux'; import { AUTH_STATE, AUTH_ACTION_TYPE, ACTION_TYPE } from '../actions/authentication'; -import { SET_AUTHENTICATION, LOG_IN } from '../constants/authConstants' +import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' // export const posts = (state=[], action) => { // switch(action.type){ @@ -12,8 +12,7 @@ import { SET_AUTHENTICATION, LOG_IN } from '../constants/authConstants' const AUTHENTICATION_INITIAL_STATE : AUTH_STATE = { user: null, - pending: true, - + pending: true } export const authentication : Reducer = (state = AUTHENTICATION_INITIAL_STATE, action: AUTH_ACTION_TYPE) : AUTH_STATE => { From b7fffbea635d7e340898bda7479b573e327f006b Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Fri, 25 Oct 2019 14:48:35 -0700 Subject: [PATCH 19/43] adding in the logout to the Autenicated route, so log out will be in every authenitaced route --- src/App.tsx | 5 ++-- src/components/Login/index.tsx | 8 +++---- src/components/landingPage/index.tsx | 24 +++++++++++++++++++ src/highOrderComponents/AuthenicatedRoute.tsx | 7 ++++-- src/reducers/authentication.tsx | 10 ++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index fc331d3..c9f100a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -26,8 +26,9 @@ import Signup from './components/Signup'; const store = createStore(reducers) {/* TODO: Add after login form is moved out of landing page: */} -export default class App extends React.Component { +//add logout to authenitacted routes +export default class App extends React.Component { render(){ return ( @@ -37,7 +38,7 @@ export default class App extends React.Component { {/* TODO: user={"Add variable from redux store"} */} - +
diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index d66c72a..c675b78 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -58,7 +58,6 @@ class Login extends React.Component { handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) - console.log("I am here") const body: requestBody = {username: this.state.username, password: this.state.password} return fetch(`https://calcumon-user-api.herokuapp.com/auth/login`, { @@ -75,7 +74,10 @@ class Login extends React.Component { // this.props.logIn(data.body) console.log(data) }) - .catch(err=>{console.log(err)}) + .catch(err=>{ + console.log(err) + // this.props.LogIn(err) + }) } render() { @@ -115,8 +117,6 @@ class Login extends React.Component { id='submitButton' type='submit' onClick={() => { - - // TODO: validate data function this.handleSignIn() }}> Sign In diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index a1b7f6a..bdc51f7 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -8,11 +8,35 @@ export interface LandingPageProps { // } class LandingPage extends React.Component { + handleSignOut = async () => { + return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { + method: 'POST', + headers: { + 'accept': 'application/json', + 'Content-Type': 'application/json' + }}) + .then((response)=>{ + response.json() + }) + .then((data)=>{ + // this.props.history.push('/') + // this.props.logOut(data) + }) + .catch((err)=>{ + console.log(err) + }) + } render() { return (

hello

+
); } diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index f0e4474..1b61eb4 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -4,6 +4,7 @@ import { Route, Redirect, RouteProps } from 'react-router-dom' import { connect } from 'react-redux' import { ReducersMapObject } from 'redux' +import { logOut } from '../actions/authentication' export interface IProps { path: string; @@ -12,10 +13,12 @@ export interface IProps { pending: boolean; } +//add in logout to authenitacted routes + class AuthenticatedRoute extends Component { render() { - const { pending, user, path, component } = this.props + const { pending, user, path, component, } = this.props // TODO: Use this? const authentication = { pending, @@ -27,7 +30,7 @@ class AuthenticatedRoute extends Component { } else if (user) { // TODO: Can't use Route - return ( + return ( <> diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index a59af81..9db56e8 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -21,8 +21,18 @@ export const authentication : Reducer = (state = AUTHEN const { user, pending } = action.payload return { user, pending } // case LOG_IN: + // const { Authorization, status } action.payload + // if(){ + // + //} + // localStorage.setItem('calcumontoken', Authorization) + //return { ...state, pending: false, user: Authorization} // case LOG_OUT: + //localStorage.setItem.removeItem('calcumontoken') + //return {...AUTHENTICATION_INITIAL_STATE, pending: false} // case SIGN_UP: + // const { Authorization, status } action.payload + //return { ...state, pending: false, username: Autherization} default: return state } From 76a59b72c4c64c0e3fa5e2d3d98a144834c1f882 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 28 Oct 2019 12:48:29 -0700 Subject: [PATCH 20/43] Log out bug working on log out bug with dispatch to Props --- src/App.tsx | 4 +-- src/actions/authentication.tsx | 19 ++-------- src/components/landingPage/index.tsx | 3 +- src/highOrderComponents/AuthenicatedRoute.tsx | 36 +++++++++++-------- src/reducers/authentication.tsx | 29 ++++++++------- 5 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c9f100a..0ccd883 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,7 +15,7 @@ import Login from './components/Login/index' import Dashboard from './components/landingPage/index' // this will check authenication -// import { setAuthentication } from './actions/authentication' +import { logOut } from './actions/authentication' // import request from './utils/request'; //This is for authenicated route @@ -38,7 +38,7 @@ export default class App extends React.Component { {/* TODO: user={"Add variable from redux store"} */} - +
diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index cab2e95..ed48b04 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -1,15 +1,10 @@ import { ActionCreator, Dispatch } from 'redux'; import { ThunkAction } from 'redux-thunk'; - -// export const SET_AUTHENTICATION = 'SET_AUTHENTICATION' - - - import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' export interface AUTH_STATE { - user: string | null; // TODO: confirm that this is a string OR is it a boolean? How are you tracking auth success + user: string | null; //This is string to keep token pending: boolean; } @@ -51,7 +46,7 @@ export interface SIGN_UP { payload: SIGN_UP_STATE } -export const signIn = (payload: LOGIN_STATE) => { +export const logIn = (payload: LOGIN_STATE) => { return { type: typeof LOG_IN, payload @@ -69,12 +64,4 @@ export const logOut = () => { return { type: typeof LOG_OUT } -} - -// #Setup SignUp actions -// export const signUp = (payload) => { -// return { -// type: signUp, -// payload -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index bdc51f7..363e752 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -1,4 +1,5 @@ import React from 'react'; + export interface LandingPageProps { } @@ -21,7 +22,7 @@ class LandingPage extends React.Component { }) .then((data)=>{ // this.props.history.push('/') - // this.props.logOut(data) + // this.props.logOut() }) .catch((err)=>{ console.log(err) diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index 1b61eb4..c77021e 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -5,39 +5,41 @@ import { Route, Redirect, RouteProps } from 'react-router-dom' import { connect } from 'react-redux' import { ReducersMapObject } from 'redux' import { logOut } from '../actions/authentication' - +import { statement } from '@babel/template' export interface IProps { - path: string; - user: boolean; + user?: String | null; component: React.ComponentType; pending: boolean; + path: string; +} + +export interface LogOutProp { + } //add in logout to authenitacted routes class AuthenticatedRoute extends Component { - render() { - const { pending, user, path, component, } = this.props - // TODO: Use this? - const authentication = { - pending, - user - } + constructor(props: IProps){ + super(props); + } + render() { + const { pending, user, component } = this.props if(pending && !user){ return
Loading...
} else if (user) { // TODO: Can't use Route - return ( + return ( <> - + )}/> } else { - return + return } } @@ -48,4 +50,10 @@ const mapStateToProps = (state: ReducersMapObject) => ({ authentication: state.authentication }) -export default connect(mapStateToProps)(AuthenticatedRoute) +const mapDispatchToProps = () => { + return { + logOut + } +} + +export default connect(mapStateToProps, mapDispatchToProps())(AuthenticatedRoute) diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index 9db56e8..d51ff7e 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -18,21 +18,20 @@ const AUTHENTICATION_INITIAL_STATE : AUTH_STATE = { export const authentication : Reducer = (state = AUTHENTICATION_INITIAL_STATE, action: AUTH_ACTION_TYPE) : AUTH_STATE => { switch(action.type){ case SET_AUTHENTICATION: - const { user, pending } = action.payload - return { user, pending } - // case LOG_IN: - // const { Authorization, status } action.payload - // if(){ - // - //} - // localStorage.setItem('calcumontoken', Authorization) - //return { ...state, pending: false, user: Authorization} - // case LOG_OUT: - //localStorage.setItem.removeItem('calcumontoken') - //return {...AUTHENTICATION_INITIAL_STATE, pending: false} - // case SIGN_UP: - // const { Authorization, status } action.payload - //return { ...state, pending: false, username: Autherization} + return { user: action.payload.user, pending: action.payload.pending } + case LOG_IN: + const {user, pending } = action.payload + if(!action.payload){ + console.log("error in login actions") + } + localStorage.setItem('calcumontoken', Authorization) + return { ...state, pending: false, user: Authorization} + case LOG_OUT: + localStorage.setItem.removeItem('calcumontoken') + return {...AUTHENTICATION_INITIAL_STATE, pending: false} + case SIGN_UP: + const { Authorization, status } = action.payload + return { ...state, pending: false, username: Autherization} default: return state } From bc57cb4667221b26ee48acc4e0355105c6cda8ab Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 28 Oct 2019 12:58:13 -0700 Subject: [PATCH 21/43] fixed up bugs login Signup and signOut reducers --- src/actions/authentication.tsx | 18 +++++++++++------- src/highOrderComponents/AuthenicatedRoute.tsx | 2 +- src/reducers/authentication.tsx | 18 ++++++++---------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index ed48b04..3c2ec60 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -4,21 +4,25 @@ import { ThunkAction } from 'redux-thunk'; import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' export interface AUTH_STATE { - user: string | null; //This is string to keep token - pending: boolean; + user?: string | null; //This is string to keep token + pending?: boolean; + status?: string, + message?: string, + Authorization?: string } //login State export interface LOGIN_STATE { - username: string; - password: string; + status: String, + message: String, + Authorization: String } //Sign Up State export interface SIGN_UP_STATE { - gmail?: string; - usermame: string; - password: string; + status: String, + message: String, + Authorization: String } export interface AUTH_ACTION_TYPE { diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index c77021e..7aaba51 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -34,7 +34,7 @@ class AuthenticatedRoute extends Component { // TODO: Can't use Route return ( <> - + )}/> } diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index d51ff7e..c450d37 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -20,18 +20,16 @@ export const authentication : Reducer = (state = AUTHEN case SET_AUTHENTICATION: return { user: action.payload.user, pending: action.payload.pending } case LOG_IN: - const {user, pending } = action.payload - if(!action.payload){ - console.log("error in login actions") - } - localStorage.setItem('calcumontoken', Authorization) - return { ...state, pending: false, user: Authorization} + if(!action.payload){ + console.log("error in login actions") + } + localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) + return { ...state, pending: false, user: action.payload.Authorization} case LOG_OUT: - localStorage.setItem.removeItem('calcumontoken') - return {...AUTHENTICATION_INITIAL_STATE, pending: false} + localStorage.removeItem('calcumontoken') + return {...AUTHENTICATION_INITIAL_STATE, pending: false} case SIGN_UP: - const { Authorization, status } = action.payload - return { ...state, pending: false, username: Autherization} + return { ...state, pending: false, user: action.payload.Authorization} default: return state } From 19856867f99e105ea1dcecf8ba831cebd6f90b1e Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 28 Oct 2019 13:41:23 -0700 Subject: [PATCH 22/43] history change --- src/components/Login/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index c675b78..e3e40ec 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -3,6 +3,8 @@ import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' +import { withRouter } from 'react-router-dom' + import { Link } from 'react-router-dom'; @@ -70,7 +72,7 @@ class Login extends React.Component { }).then(response=>{ return response.json() }).then((data)=>{ - // this.props.history.push('/dashboard') + this.props.history.push('/dashboard') // this.props.logIn(data.body) console.log(data) }) @@ -135,4 +137,4 @@ class Login extends React.Component { } } -export default Login; +export default withRouter(Login); From b1e50f12fefd301c32657d8b7694cf557cd776e9 Mon Sep 17 00:00:00 2001 From: Anisha Jain Date: Mon, 28 Oct 2019 13:57:55 -0700 Subject: [PATCH 23/43] AuthenticatedRoute can use logOut action --- src/highOrderComponents/AuthenicatedRoute.tsx | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index 7aaba51..713ab74 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -3,9 +3,9 @@ import React, { Component } from 'react' import { Route, Redirect, RouteProps } from 'react-router-dom' import { connect } from 'react-redux' -import { ReducersMapObject } from 'redux' +import { ReducersMapObject, Reducer } from 'redux' import { logOut } from '../actions/authentication' -import { statement } from '@babel/template' + export interface IProps { user?: String | null; component: React.ComponentType; @@ -13,20 +13,21 @@ export interface IProps { path: string; } -export interface LogOutProp { - +//add in logout to authenitacted routes +interface StateProps { + authentication: Reducer } -//add in logout to authenitacted routes +interface DispatchProps { + logOut: () => void +} +type Props = StateProps & DispatchProps & IProps -class AuthenticatedRoute extends Component { - constructor(props: IProps){ - super(props); - } +class AuthenticatedRoute extends Component { render() { - const { pending, user, component } = this.props + const { pending, user, component, logOut } = this.props if(pending && !user){ return
Loading...
} @@ -46,14 +47,14 @@ class AuthenticatedRoute extends Component { } -const mapStateToProps = (state: ReducersMapObject) => ({ +const mapStateToProps = (state: ReducersMapObject) : StateProps => ({ authentication: state.authentication }) -const mapDispatchToProps = () => { +const mapDispatchToProps = () : DispatchProps => { return { logOut } } -export default connect(mapStateToProps, mapDispatchToProps())(AuthenticatedRoute) +export default connect(mapStateToProps, mapDispatchToProps())(AuthenticatedRoute) From 3c61e5b1274a07bce1735dcfa333f5afc76d75fe Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Tue, 29 Oct 2019 16:02:10 -0700 Subject: [PATCH 24/43] added in update login. Still working on login --- src/components/Login/index.tsx | 57 +++++++++++++------ src/components/landingPage/index.tsx | 4 +- src/highOrderComponents/AuthenicatedRoute.tsx | 1 + src/reducers/authentication.tsx | 2 + 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index e3e40ec..831dfcc 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,18 +1,17 @@ import React from 'react'; -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' -import { withRouter } from 'react-router-dom' +import { withRouter, Redirect } from 'react-router-dom' + +import { connect } from 'react-redux' +import { ReducersMapObject, Reducer } from 'redux' +import { logIn } from '../../actions/authentication' import { Link } from 'react-router-dom'; import './styles/login.css'; -import { setAuthentication } from '../../actions/authentication' -import { async } from 'q'; - // TODO: What will be in our LoginInterface? interface IErrorLoginState { @@ -20,6 +19,7 @@ interface IErrorLoginState { username: string; password: string; error: boolean; + redirectPage: boolean; } interface Props{ @@ -32,13 +32,21 @@ interface requestBody { password: string; } -interface responseBody { - status: string; - message: string; - Authorization: string; + +export interface StateProps { + authentication: Reducer +} + + + +export interface DispatchProps { + logIn: () => void } -class Login extends React.Component { +type props = StateProps & DispatchProps & Props + + +class Login extends React.Component { constructor(props: Props) { super(props); @@ -47,6 +55,7 @@ class Login extends React.Component { username: '', password: '', error: false, + redirectPage: false } } @@ -56,8 +65,7 @@ class Login extends React.Component { // .then(response => this.props.setAuthentication(response.data)) // .catch(err => this.props.setAuthentication(null)) // } - - + handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) const body: requestBody = {username: this.state.username, password: this.state.password} @@ -72,8 +80,8 @@ class Login extends React.Component { }).then(response=>{ return response.json() }).then((data)=>{ - this.props.history.push('/dashboard') - // this.props.logIn(data.body) + // this.props.history.push('/Dashboard') + // this.props.logIn(data) console.log(data) }) .catch(err=>{ @@ -83,7 +91,11 @@ class Login extends React.Component { } render() { + // console.log(logIn) // TODO: If redux authenticated is true: redirect to user dashboard + if (this.state.redirectPage){ + return + } else{ return ( <> { ) + } + } +} + + + +const mapStateToProps = (state: ReducersMapObject) : StateProps => ({ + authentication: state.authentication +}) + +const mapDispatchToProps = () : DispatchProps => { + return { + logIn } } -export default withRouter(Login); +export default connect(mapStateToProps, mapDispatchToProps())(Login) \ No newline at end of file diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 363e752..bd3d782 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -16,13 +16,13 @@ class LandingPage extends React.Component { headers: { 'accept': 'application/json', 'Content-Type': 'application/json' - }}) + } + }) .then((response)=>{ response.json() }) .then((data)=>{ // this.props.history.push('/') - // this.props.logOut() }) .catch((err)=>{ console.log(err) diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index 713ab74..c1d42f8 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -27,6 +27,7 @@ type Props = StateProps & DispatchProps & IProps class AuthenticatedRoute extends Component { render() { + console.log(this.props.logOut) const { pending, user, component, logOut } = this.props if(pending && !user){ return
Loading...
diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index c450d37..b21ec7a 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -22,6 +22,8 @@ export const authentication : Reducer = (state = AUTHEN case LOG_IN: if(!action.payload){ console.log("error in login actions") + }else if (action.payload.status == "fail" || action.payload.message == "email or password does not match."){ + console.log("failed") } localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) return { ...state, pending: false, user: action.payload.Authorization} From fd052b9fdcce7d1f32cd817382ae35b9a75d17d9 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Tue, 29 Oct 2019 16:55:32 -0700 Subject: [PATCH 25/43] added in update trying to get props working --- src/components/Login/index.tsx | 39 ++++++++----------- src/constants/gameConstants.tsx | 0 src/highOrderComponents/AuthenicatedRoute.tsx | 3 +- src/reducers/authentication.tsx | 9 +---- src/reducers/gameLevels.tsx | 0 5 files changed, 19 insertions(+), 32 deletions(-) create mode 100644 src/constants/gameConstants.tsx create mode 100644 src/reducers/gameLevels.tsx diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 831dfcc..a424b50 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -14,41 +14,37 @@ import './styles/login.css'; // TODO: What will be in our LoginInterface? -interface IErrorLoginState { - showErrorMessage: Boolean; - username: string; - password: string; - error: boolean; - redirectPage: boolean; -} +//State TYPES -interface Props{ - setAuthentication: Function; - request: Function -} -interface requestBody { - username: string; - password: string; +//TYPES FOR props +interface Props{ + } - +//TYPES for stateProps export interface StateProps { authentication: Reducer } - - +//DispatchProps export interface DispatchProps { logIn: () => void } type props = StateProps & DispatchProps & Props +interface IErrorLoginState { + showErrorMessage: Boolean; + username: string; + password: string; + error: boolean; + redirectPage: boolean; +} -class Login extends React.Component { +class Login extends React.Component { - constructor(props: Props) { + constructor(props: props) { super(props); this.state = { showErrorMessage: false, @@ -68,7 +64,7 @@ class Login extends React.Component { handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) - const body: requestBody = {username: this.state.username, password: this.state.password} + const body = {username: this.state.username, password: this.state.password} return fetch(`https://calcumon-user-api.herokuapp.com/auth/login`, { method: 'POST', @@ -83,6 +79,7 @@ class Login extends React.Component { // this.props.history.push('/Dashboard') // this.props.logIn(data) console.log(data) + this.setState({redirectPage: true}) }) .catch(err=>{ console.log(err) @@ -150,8 +147,6 @@ class Login extends React.Component { } } - - const mapStateToProps = (state: ReducersMapObject) : StateProps => ({ authentication: state.authentication }) diff --git a/src/constants/gameConstants.tsx b/src/constants/gameConstants.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index c1d42f8..c33a896 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -27,7 +27,6 @@ type Props = StateProps & DispatchProps & IProps class AuthenticatedRoute extends Component { render() { - console.log(this.props.logOut) const { pending, user, component, logOut } = this.props if(pending && !user){ return
Loading...
@@ -36,7 +35,7 @@ class AuthenticatedRoute extends Component { // TODO: Can't use Route return ( <> - + )}/> } diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index b21ec7a..387d8a0 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -1,14 +1,7 @@ import { Reducer } from 'redux'; import { AUTH_STATE, AUTH_ACTION_TYPE, ACTION_TYPE } from '../actions/authentication'; -import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' - -// export const posts = (state=[], action) => { -// switch(action.type){ -// default: -// return state -// } -// } +import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants'; const AUTHENTICATION_INITIAL_STATE : AUTH_STATE = { user: null, diff --git a/src/reducers/gameLevels.tsx b/src/reducers/gameLevels.tsx new file mode 100644 index 0000000..e69de29 From ac1b2e003eae4f911b99581cade20a9df93f7fe4 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Tue, 29 Oct 2019 17:10:14 -0700 Subject: [PATCH 26/43] added in some changes --- src/App.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0ccd883..1da51e0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,10 +14,6 @@ import { bindActionCreators } from 'redux'; import Login from './components/Login/index' import Dashboard from './components/landingPage/index' -// this will check authenication -import { logOut } from './actions/authentication' -// import request from './utils/request'; - //This is for authenicated route import AuthenicatedRoute from './highOrderComponents/AuthenicatedRoute'; From 59f25b5cd2eb860ff31394290339dd520727a675 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Tue, 29 Oct 2019 17:29:05 -0700 Subject: [PATCH 27/43] pusing up changes --- src/components/Login/index.tsx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index a424b50..34ebfa4 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -19,17 +19,27 @@ import './styles/login.css'; //TYPES FOR props interface Props{ - + user?: String | null; + pending: boolean; } //TYPES for stateProps -export interface StateProps { +interface StateProps { authentication: Reducer } //DispatchProps -export interface DispatchProps { - logIn: () => void + +interface data { + user?: string | null; //This is string to keep token + pending?: boolean; + status?: string, + message?: string, + Authorization?: string +} + +interface DispatchProps { + logIn: (data: data) => void } type props = StateProps & DispatchProps & Props @@ -88,6 +98,7 @@ class Login extends React.Component { } render() { + console.log(this.props) // console.log(logIn) // TODO: If redux authenticated is true: redirect to user dashboard if (this.state.redirectPage){ @@ -140,7 +151,6 @@ class Login extends React.Component { - ) } From 949b8ecf35d96f25829836aa0a421ed03dd0dad5 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Tue, 29 Oct 2019 17:52:08 -0700 Subject: [PATCH 28/43] added new interface for DispatchProps --- src/components/Login/index.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 34ebfa4..0707659 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -6,12 +6,14 @@ import { withRouter, Redirect } from 'react-router-dom' import { connect } from 'react-redux' import { ReducersMapObject, Reducer } from 'redux' -import { logIn } from '../../actions/authentication' +import { logIn, LOGIN_STATE } from '../../actions/authentication' import { Link } from 'react-router-dom'; import './styles/login.css'; +import { LOG_IN } from '../../constants/authConstants' + // TODO: What will be in our LoginInterface? //State TYPES @@ -31,17 +33,16 @@ interface StateProps { //DispatchProps interface data { - user?: string | null; //This is string to keep token - pending?: boolean; status?: string, message?: string, Authorization?: string } interface DispatchProps { - logIn: (data: data) => void + logIn: (payload :LOGIN_STATE) => data } + type props = StateProps & DispatchProps & Props interface IErrorLoginState { From f211a52d2821949896ef29021dab672641d8fe0a Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Wed, 30 Oct 2019 13:58:34 -0700 Subject: [PATCH 29/43] up to date changes --- src/actions/authentication.tsx | 2 +- src/components/Login/index.tsx | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index 3c2ec60..7499b09 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -8,7 +8,7 @@ export interface AUTH_STATE { pending?: boolean; status?: string, message?: string, - Authorization?: string + Authorization?: string, } //login State diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 0707659..c8f5e68 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -6,7 +6,7 @@ import { withRouter, Redirect } from 'react-router-dom' import { connect } from 'react-redux' import { ReducersMapObject, Reducer } from 'redux' -import { logIn, LOGIN_STATE } from '../../actions/authentication' +import { logIn, LOGIN_STATE, LOG_IN } from '../../actions/authentication' import { Link } from 'react-router-dom'; @@ -38,8 +38,13 @@ interface data { Authorization?: string } +interface LOG_IN { + type: typeof LOG_IN, + payload: LOGIN_STATE +} + interface DispatchProps { - logIn: (payload :LOGIN_STATE) => data + logIn: (payload: LOGIN_STATE) => LOG_IN } From 4dedbb0610ef8c0a1f24aa891f201838ac795d23 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 31 Oct 2019 21:36:49 -0700 Subject: [PATCH 30/43] added almost working authenticated routes --- src/App.tsx | 2 +- src/actions/authentication.tsx | 4 +- src/components/Login/index.tsx | 15 ++-- src/components/landingPage/index.tsx | 71 ++++++++++--------- src/highOrderComponents/AuthenicatedRoute.tsx | 8 ++- src/reducers/authentication.tsx | 14 ++-- 6 files changed, 66 insertions(+), 48 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1da51e0..56946f9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -34,7 +34,7 @@ export default class App extends React.Component { {/* TODO: user={"Add variable from redux store"} */} - + diff --git a/src/actions/authentication.tsx b/src/actions/authentication.tsx index 7499b09..179f784 100644 --- a/src/actions/authentication.tsx +++ b/src/actions/authentication.tsx @@ -4,7 +4,7 @@ import { ThunkAction } from 'redux-thunk'; import { SET_AUTHENTICATION, LOG_IN, SIGN_UP, LOG_OUT } from '../constants/authConstants' export interface AUTH_STATE { - user?: string | null; //This is string to keep token + user?: boolean | null; //This is string to keep token pending?: boolean; status?: string, message?: string, @@ -52,7 +52,7 @@ export interface SIGN_UP { export const logIn = (payload: LOGIN_STATE) => { return { - type: typeof LOG_IN, + type: LOG_IN, payload } } diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index c8f5e68..70d7eea 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -4,9 +4,9 @@ import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' import { withRouter, Redirect } from 'react-router-dom' import { connect } from 'react-redux' -import { ReducersMapObject, Reducer } from 'redux' +import { ReducersMapObject, Reducer, compose } from 'redux' -import { logIn, LOGIN_STATE, LOG_IN } from '../../actions/authentication' +import { logIn, LOGIN_STATE } from '../../actions/authentication' import { Link } from 'react-router-dom'; @@ -77,6 +77,10 @@ class Login extends React.Component { // .then(response => this.props.setAuthentication(response.data)) // .catch(err => this.props.setAuthentication(null)) // } + + componentDidMount = () => { + // this.handleSignIn() + } handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) @@ -93,7 +97,7 @@ class Login extends React.Component { return response.json() }).then((data)=>{ // this.props.history.push('/Dashboard') - // this.props.logIn(data) + this.props.logIn(data) console.log(data) this.setState({redirectPage: true}) }) @@ -104,10 +108,9 @@ class Login extends React.Component { } render() { - console.log(this.props) - // console.log(logIn) - // TODO: If redux authenticated is true: redirect to user dashboard + console.log(this.props,this.state.redirectPage) if (this.state.redirectPage){ + console.log(this.state.redirectPage,"inside conditional") return } else{ return ( diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index bd3d782..132b56b 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -4,41 +4,48 @@ export interface LandingPageProps { } -// export interface LandingPageState { - -// } - -class LandingPage extends React.Component { - handleSignOut = async () => { - - return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { - method: 'POST', - headers: { - 'accept': 'application/json', - 'Content-Type': 'application/json' - } - }) - .then((response)=>{ - response.json() - }) - .then((data)=>{ - // this.props.history.push('/') - }) - .catch((err)=>{ - console.log(err) - }) +export interface LandingPageState { + +} + +class LandingPage extends React.Component { + Constructor(props: LandingPageProps){ + } + + // handleSignOut = async () => { + + // return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { + // method: 'POST', + // headers: { + // 'accept': 'application/json', + // 'Content-Type': 'application/json' + // } + // }) + // .then((response)=>{ + // response.json() + // }) + // .then((data)=>{ + // // this.props.history.push('/') + // }) + // .catch((err)=>{ + // console.log(err) + // }) + // } render() { return ( -
-

hello

- -
+ //
+ //

hello

+ // + //
+ <> +

hi

+ ); } } diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index c33a896..1a863e0 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -7,7 +7,7 @@ import { ReducersMapObject, Reducer } from 'redux' import { logOut } from '../actions/authentication' export interface IProps { - user?: String | null; + user?: boolean | null; component: React.ComponentType; pending: boolean; path: string; @@ -27,11 +27,13 @@ type Props = StateProps & DispatchProps & IProps class AuthenticatedRoute extends Component { render() { - const { pending, user, component, logOut } = this.props + console.log("In authenitacted Route component", this.props) + const { pending, user, logOut } = this.props if(pending && !user){ return
Loading...
} - else if (user) { + else if (user && !pending) { + console.log("Inside conditional") // TODO: Can't use Route return ( <> diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index 387d8a0..c2c1e6b 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -9,22 +9,28 @@ const AUTHENTICATION_INITIAL_STATE : AUTH_STATE = { } export const authentication : Reducer = (state = AUTHENTICATION_INITIAL_STATE, action: AUTH_ACTION_TYPE) : AUTH_STATE => { + // console.log("inside reducer function line 12", action.payload === true, action.type == true) + console.log(action.type) switch(action.type){ case SET_AUTHENTICATION: + console.log("here: line 16") return { user: action.payload.user, pending: action.payload.pending } case LOG_IN: + console.log("Here") if(!action.payload){ console.log("error in login actions") - }else if (action.payload.status == "fail" || action.payload.message == "email or password does not match."){ + }else if (action.payload.status === "fail" || action.payload.message == "email or password does not match."){ console.log("failed") } + console.log("here line 25 reducer") localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) - return { ...state, pending: false, user: action.payload.Authorization} + return { ...state, pending: false, user: true} case LOG_OUT: localStorage.removeItem('calcumontoken') - return {...AUTHENTICATION_INITIAL_STATE, pending: false} + return { ...AUTHENTICATION_INITIAL_STATE} case SIGN_UP: - return { ...state, pending: false, user: action.payload.Authorization} + localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) + return { pending: false, user: true} default: return state } From fff34e8e01d9653af8b31d2c28248d376c52e9fe Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 11 Nov 2019 15:24:05 -0800 Subject: [PATCH 31/43] added in working login for login component. Now working on modifiying sign up component --- src/App.tsx | 50 +++++++++++++++++-- src/components/Login/index.tsx | 4 +- src/components/Signup/index.tsx | 6 ++- src/components/landingPage/index.tsx | 11 ++-- src/highOrderComponents/AuthenicatedRoute.tsx | 19 +++++-- 5 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 56946f9..a61da4b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,8 +6,6 @@ import { BrowserRouter as Router, Switch, Route } from "react-router-dom"; import './App.css'; // Redux connection -import { connect } from "react-redux"; -import { bindActionCreators } from 'redux'; // Components // import SignUp from './components/Signup/index' @@ -24,8 +22,48 @@ const store = createStore(reducers) {/* TODO: Add after login form is moved out of landing page: */} //add logout to authenitacted routes -export default class App extends React.Component { + +interface Props{ + +} + +interface appState{ + loggedIn: Boolean +} +export default class App extends React.Component { + constructor(props: Props){ + super(props) + this.state ={ + loggedIn: false + } + } + + loggedIn = (value: Boolean) => { + if(this.state.loggedIn){ + this.setState({ loggedIn: true}) + }else{ + console.log("not true") + } + } + render(){ + console.log("hello", this.loggedIn) + if(!this.state.loggedIn){ + return + +
+ + + + {/* TODO: user={"Add variable from redux store"} */} + {/* */} + {/* */} + {/*

Hello Test

} /> */} +
+
+
+
+ } else{ return ( @@ -34,11 +72,15 @@ export default class App extends React.Component { {/* TODO: user={"Add variable from redux store"} */} - + + {/* */} + + {/*

Hello Test

} /> */}
); + } } } diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 70d7eea..4a2682d 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -23,6 +23,7 @@ import { LOG_IN } from '../../constants/authConstants' interface Props{ user?: String | null; pending: boolean; + loggedIn: (value:boolean)=>void; } //TYPES for stateProps @@ -99,7 +100,8 @@ class Login extends React.Component { // this.props.history.push('/Dashboard') this.props.logIn(data) console.log(data) - this.setState({redirectPage: true}) + this.setState({ redirectPage: true }) + this.props.loggedIn(true) }) .catch(err=>{ console.log(err) diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 560d132..b84745c 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { bool } from 'prop-types'; import { booleanLiteral } from '@babel/types'; -import {Link} from 'react-router-dom' +import {Link, Redirect as redirect} from 'react-router-dom' import './styles/Signup.css' export interface Props { signUpAuthenication: Function; @@ -40,6 +40,10 @@ class Signup extends React.Component { }) .then((response)=>{ console.log(response) + this.setState({}) + }) + .catch((err)=>{ + console.log(err) }) } diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 132b56b..ae1781e 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -5,12 +5,14 @@ export interface LandingPageProps { } export interface LandingPageState { - + info: String; } class LandingPage extends React.Component { Constructor(props: LandingPageProps){ - + this.state = { + info: "hello" + } } // handleSignOut = async () => { @@ -33,6 +35,7 @@ class LandingPage extends React.Component { // }) // } render() { + console.log("hello") return ( //
//

hello

@@ -43,9 +46,9 @@ class LandingPage extends React.Component { // this.handleSignOut() // }}>Sign Out //
- <> +

hi

- +
); } } diff --git a/src/highOrderComponents/AuthenicatedRoute.tsx b/src/highOrderComponents/AuthenicatedRoute.tsx index 1a863e0..fb5559a 100644 --- a/src/highOrderComponents/AuthenicatedRoute.tsx +++ b/src/highOrderComponents/AuthenicatedRoute.tsx @@ -28,18 +28,27 @@ class AuthenticatedRoute extends Component { render() { console.log("In authenitacted Route component", this.props) - const { pending, user, logOut } = this.props - if(pending && !user){ + const { pending, user, logOut, component } = this.props + + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>') + console.log(component) + + if (pending && !user) { return
Loading...
} else if (user && !pending) { console.log("Inside conditional") // TODO: Can't use Route - return ( + return { + console.log('<<<<<<<<<<<<<<<<<<<') + console.log(comp) + return( <> - - )}/> + ) + } + + }/> } else { return From ce58c020b5243b48a924fad45b0c7dc0083633c1 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Thu, 14 Nov 2019 11:54:28 -0800 Subject: [PATCH 32/43] added in session storage --- src/App.tsx | 24 +++++++++++++----------- src/components/Login/index.tsx | 6 +----- src/components/Signup/index.tsx | 14 +++++++++++--- src/components/landingPage/index.tsx | 16 ++++++---------- src/reducers/authentication.tsx | 6 +++--- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index a61da4b..e22b8ed 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -28,33 +28,34 @@ interface Props{ } interface appState{ - loggedIn: Boolean + mover: Boolean } export default class App extends React.Component { constructor(props: Props){ super(props) this.state ={ - loggedIn: false + mover: false } } loggedIn = (value: Boolean) => { - if(this.state.loggedIn){ - this.setState({ loggedIn: true}) + if(value){ + console.log("true jognaognraoignragingoagnagjan;ungongaiunejgangibndalgnuij") + this.setState({ mover: true}) }else{ console.log("not true") } } render(){ - console.log("hello", this.loggedIn) - if(!this.state.loggedIn){ + console.log("hello", this.state.mover) + if(!this.state.mover){ return
- - + + {/* TODO: user={"Add variable from redux store"} */} {/* */} {/* */} @@ -64,17 +65,18 @@ export default class App extends React.Component { } else{ + console.log("inside else condition location", this.state.mover) return (
- - + + {/* TODO: user={"Add variable from redux store"} */} {/* */} - +
hello
}/> {/*

Hello Test

} /> */}
diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 4a2682d..d8ac331 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -97,22 +97,18 @@ class Login extends React.Component { }).then(response=>{ return response.json() }).then((data)=>{ - // this.props.history.push('/Dashboard') this.props.logIn(data) console.log(data) - this.setState({ redirectPage: true }) this.props.loggedIn(true) + this.setState({ redirectPage: true }) }) .catch(err=>{ console.log(err) - // this.props.LogIn(err) }) } render() { - console.log(this.props,this.state.redirectPage) if (this.state.redirectPage){ - console.log(this.state.redirectPage,"inside conditional") return } else{ return ( diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index b84745c..3c2e065 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -1,10 +1,11 @@ import React from 'react'; import { bool } from 'prop-types'; import { booleanLiteral } from '@babel/types'; -import {Link, Redirect as redirect} from 'react-router-dom' +import {Link, Redirect} from 'react-router-dom' import './styles/Signup.css' export interface Props { signUpAuthenication: Function; + loggedIn: (value:Boolean)=>void } export interface State { @@ -13,6 +14,7 @@ export interface State { password: string; verifiedPassword: string; error: boolean; + redirector: boolean; } class Signup extends React.Component { @@ -23,7 +25,8 @@ class Signup extends React.Component { email: "", password: '', verifiedPassword: '', - error: false + error: false, + redirector: false }; } @@ -40,7 +43,8 @@ class Signup extends React.Component { }) .then((response)=>{ console.log(response) - this.setState({}) + this.setState({redirector: true}) + this.props.loggedIn(true) }) .catch((err)=>{ console.log(err) @@ -48,6 +52,7 @@ class Signup extends React.Component { } render() { + if(!this.state.redirector){ return (
@@ -89,6 +94,9 @@ class Signup extends React.Component {
); + }else{ + return + } } } diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index ae1781e..1ac1d13 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -16,13 +16,12 @@ class LandingPage extends React.Component { } // handleSignOut = async () => { - // return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { // method: 'POST', // headers: { // 'accept': 'application/json', // 'Content-Type': 'application/json' - // } + // }, // }) // .then((response)=>{ // response.json() @@ -37,17 +36,14 @@ class LandingPage extends React.Component { render() { console.log("hello") return ( - //
- //

hello

- // - //
-
-

hi

+ // }}>Sign Out */}
); } diff --git a/src/reducers/authentication.tsx b/src/reducers/authentication.tsx index c2c1e6b..2dd1b19 100644 --- a/src/reducers/authentication.tsx +++ b/src/reducers/authentication.tsx @@ -23,13 +23,13 @@ export const authentication : Reducer = (state = AUTHEN console.log("failed") } console.log("here line 25 reducer") - localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) + sessionStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) return { ...state, pending: false, user: true} case LOG_OUT: - localStorage.removeItem('calcumontoken') + sessionStorage.removeItem('calcumontoken') return { ...AUTHENTICATION_INITIAL_STATE} case SIGN_UP: - localStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) + sessionStorage.setItem('calcumontoken', (action.payload.Authorization ? action.payload.Authorization: "")) return { pending: false, user: true} default: return state From 5074e44e3ec1edda83da0cb0eaa21a1916bb2def Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 17:22:24 -0800 Subject: [PATCH 33/43] added in project --- src/App.tsx | 34 +++----------- src/components/Login/index.tsx | 8 ++-- src/components/Signup/index.tsx | 4 +- src/components/landingPage/index.tsx | 67 +++++++++++++++++----------- 4 files changed, 52 insertions(+), 61 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e22b8ed..62dffc1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -38,51 +38,27 @@ export default class App extends React.Component { } } - loggedIn = (value: Boolean) => { - if(value){ - console.log("true jognaognraoignragingoagnagjan;ungongaiunejgangibndalgnuij") - this.setState({ mover: true}) - }else{ - console.log("not true") - } - } + render(){ console.log("hello", this.state.mover) - if(!this.state.mover){ - return - -
- - - - {/* TODO: user={"Add variable from redux store"} */} - {/* */} - {/* */} - {/*

Hello Test

} /> */} -
-
-
-
- } else{ console.log("inside else condition location", this.state.mover) return (
- - + + {/* TODO: user={"Add variable from redux store"} */} {/* */} -
hello
}/> + {/*

Hello Test

} /> */}
); - } - } + } } diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index d8ac331..9a6b9f7 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -23,7 +23,8 @@ import { LOG_IN } from '../../constants/authConstants' interface Props{ user?: String | null; pending: boolean; - loggedIn: (value:boolean)=>void; + loggedIn: ()=>void; + mover: boolean; } //TYPES for stateProps @@ -99,8 +100,8 @@ class Login extends React.Component { }).then((data)=>{ this.props.logIn(data) console.log(data) - this.props.loggedIn(true) this.setState({ redirectPage: true }) + this.props.loggedIn() }) .catch(err=>{ console.log(err) @@ -147,7 +148,8 @@ class Login extends React.Component { type='submit' onClick={() => { this.handleSignIn() - }}> + }} + > Sign In diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 3c2e065..c4ae161 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -5,7 +5,7 @@ import {Link, Redirect} from 'react-router-dom' import './styles/Signup.css' export interface Props { signUpAuthenication: Function; - loggedIn: (value:Boolean)=>void + loggedIn: ()=>void } export interface State { @@ -44,7 +44,7 @@ class Signup extends React.Component { .then((response)=>{ console.log(response) this.setState({redirector: true}) - this.props.loggedIn(true) + this.props.loggedIn() }) .catch((err)=>{ console.log(err) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 1ac1d13..6015919 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { withRouter, Redirect } from 'react-router-dom' export interface LandingPageProps { @@ -6,47 +7,59 @@ export interface LandingPageProps { export interface LandingPageState { info: String; + logOut: boolean; } class LandingPage extends React.Component { Constructor(props: LandingPageProps){ this.state = { - info: "hello" + info: "hello", + logOut: false } } - - // handleSignOut = async () => { - // return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { - // method: 'POST', - // headers: { - // 'accept': 'application/json', - // 'Content-Type': 'application/json' - // }, - // }) - // .then((response)=>{ - // response.json() - // }) - // .then((data)=>{ - // // this.props.history.push('/') - // }) - // .catch((err)=>{ - // console.log(err) - // }) - // } + handleSignOut = async () => { + let token = sessionStorage.getItem('calcumontoken') + return fetch(`https://calcumon-user-api.herokuapp.com/auth/logout`, { + method: 'POST', + headers: { + 'accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: token + }) + .then((response)=>{ + response.json() + }) + .then((data)=>{ + // this.props.history.push('/') + this.setState({ logOut : true }) + console.log("I logged out") + }) + .catch((err)=>{ + console.log(err) + }) + } render() { - console.log("hello") + if (this.state.logOut){ + return (
+ +
) + }else{ + + return (

hello

- {/* */} +
); } } +} export default LandingPage; From 7a089bc396e42e1fe4da54a275b77f8ff5ff9754 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 17:45:18 -0800 Subject: [PATCH 34/43] added in some more changes to logOut --- src/components/Login/index.tsx | 12 ------------ src/components/landingPage/index.tsx | 20 +++++++++----------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 9a6b9f7..64c606f 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -72,17 +72,6 @@ class Login extends React.Component { redirectPage: false } } - - // TODO: integrate in LOGIN component - // componentDidMount(){ - // request('/auth/token') - // .then(response => this.props.setAuthentication(response.data)) - // .catch(err => this.props.setAuthentication(null)) - // } - - componentDidMount = () => { - // this.handleSignIn() - } handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) @@ -101,7 +90,6 @@ class Login extends React.Component { this.props.logIn(data) console.log(data) this.setState({ redirectPage: true }) - this.props.loggedIn() }) .catch(err=>{ console.log(err) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 6015919..59f5764 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -7,14 +7,14 @@ export interface LandingPageProps { export interface LandingPageState { info: String; - logOut: boolean; + Out?: boolean; } class LandingPage extends React.Component { Constructor(props: LandingPageProps){ this.state = { info: "hello", - logOut: false + Out: false } } handleSignOut = async () => { @@ -31,22 +31,19 @@ class LandingPage extends React.Component { response.json() }) .then((data)=>{ - // this.props.history.push('/') - this.setState({ logOut : true }) + this.setState({ Out : !this.state.Out }) console.log("I logged out") }) .catch((err)=>{ console.log(err) }) } - render() { - if (this.state.logOut){ - return (
- -
) - }else{ - + render() { + if (this.state.Out){ + console.log("here") + return + } else{ return (

hello

@@ -60,6 +57,7 @@ class LandingPage extends React.Component { ); } } + } export default LandingPage; From cf1058fe97e46620b7decea633a941861daf6ec4 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 17:55:54 -0800 Subject: [PATCH 35/43] added in some changes to auth --- src/components/landingPage/index.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 59f5764..0c1236c 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -7,14 +7,14 @@ export interface LandingPageProps { export interface LandingPageState { info: String; - Out?: boolean; + logOut: boolean; } class LandingPage extends React.Component { Constructor(props: LandingPageProps){ this.state = { info: "hello", - Out: false + logOut: false } } handleSignOut = async () => { @@ -31,7 +31,7 @@ class LandingPage extends React.Component { response.json() }) .then((data)=>{ - this.setState({ Out : !this.state.Out }) + this.setState({ logOut : true }) console.log("I logged out") }) .catch((err)=>{ @@ -40,12 +40,11 @@ class LandingPage extends React.Component { } render() { - if (this.state.Out){ - console.log("here") - return - } else{ + if (this.state.logOut){ + return <> + }else{ return ( -
+ <>

hello

-
+ ); } } From c1c0b1486f04c1609abc03274877eee5471a0fa3 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 18:09:18 -0800 Subject: [PATCH 36/43] added in working logOut component --- src/components/landingPage/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 0c1236c..e8174d6 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -11,7 +11,8 @@ export interface LandingPageState { } class LandingPage extends React.Component { - Constructor(props: LandingPageProps){ + constructor(props: LandingPageProps){ + super(props) this.state = { info: "hello", logOut: false @@ -40,8 +41,9 @@ class LandingPage extends React.Component { } render() { + console.log(this.state) if (this.state.logOut){ - return <> + return }else{ return ( <> From 583aa83d0d7db89e625933af8109c411c25f602d Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 18:32:43 -0800 Subject: [PATCH 37/43] Revert "added in working logOut component" This reverts commit c1c0b1486f04c1609abc03274877eee5471a0fa3. --- src/components/landingPage/index.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index e8174d6..0c1236c 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -11,8 +11,7 @@ export interface LandingPageState { } class LandingPage extends React.Component { - constructor(props: LandingPageProps){ - super(props) + Constructor(props: LandingPageProps){ this.state = { info: "hello", logOut: false @@ -41,9 +40,8 @@ class LandingPage extends React.Component { } render() { - console.log(this.state) if (this.state.logOut){ - return + return <> }else{ return ( <> From 07742212108b9f588fd153934858c964d86216b1 Mon Sep 17 00:00:00 2001 From: Joey Gaitan Date: Mon, 18 Nov 2019 18:35:39 -0800 Subject: [PATCH 38/43] added in changes --- src/components/landingPage/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/landingPage/index.tsx b/src/components/landingPage/index.tsx index 0c1236c..07a7d6d 100644 --- a/src/components/landingPage/index.tsx +++ b/src/components/landingPage/index.tsx @@ -11,7 +11,8 @@ export interface LandingPageState { } class LandingPage extends React.Component { - Constructor(props: LandingPageProps){ + constructor(props: LandingPageProps){ + super(props); this.state = { info: "hello", logOut: false From 6c5a34ed1c37b980aa622b396e44cb743bb71b90 Mon Sep 17 00:00:00 2001 From: Anna Pawl Date: Mon, 18 Nov 2019 23:49:20 -0800 Subject: [PATCH 39/43] merging loginRegister branch --- src/components/Login/styles/Login.css.map | 9 +++ src/components/Login/styles/Login.scss | 71 +++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/components/Login/styles/Login.css.map create mode 100644 src/components/Login/styles/Login.scss diff --git a/src/components/Login/styles/Login.css.map b/src/components/Login/styles/Login.css.map new file mode 100644 index 0000000..15cc5d5 --- /dev/null +++ b/src/components/Login/styles/Login.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,OAAO;CAC1B;;AAED,AAAA,eAAe,CAAA;EACb,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,EAAE;EACX,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AAED,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB;;AAED,AAAA,cAAc,CAAA;EACZ,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAO;CAEf;;AAED,AAAA,KAAK,CAAC;EACJ,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,KAAK;CACb;;AACD,yGAAyG;AACzG,AAAA,cAAc,AAAA,iBAAiB,CAAC;EAC9B,UAAU,EAAE,qCAAqC;EACjD,kBAAkB,EAAE,qCAAqC;EACzD,KAAK,EAAE,OAAO;EACd,uBAAuB,EAAE,OAAO;CACjC;;AAED,AAAA,cAAc,CAAA;EACZ,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,OAAO;EACzB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAO;CACf;;AAED,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,KAAK;EACpB,KAAK,EAAE,KAAK;EACZ,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OACT;CAAC", + "sources": [ + "Login.scss" + ], + "names": [], + "file": "Login.css" +} \ No newline at end of file diff --git a/src/components/Login/styles/Login.scss b/src/components/Login/styles/Login.scss new file mode 100644 index 0000000..432126d --- /dev/null +++ b/src/components/Login/styles/Login.scss @@ -0,0 +1,71 @@ +body { + background-color: #F1FFCC; +} + +.inputContainer{ + position: absolute; + width: 300px; + height: 500px; + z-index: 15; + top: 50%; + left: 50%; + margin: -100px 0 0 -150px; + display: flex; + flex-direction: column; +} + +/* Waiting for SVG */ +.splash-logo { + display: block; + margin: 15vh auto 0 auto; + width: 300px; + min-width: 65vw; +} + +#inputUsername{ + border: none; + border-radius: 7px; + background-color: #C7C0F4; + margin: 10px; + text-align: center; + box-shadow: none; + font-size: 20px; + color: #383838; + +} + +input { + height: 100px; + width: 250px; +} +/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ +#inputPassword:-webkit-autofill { + box-shadow: 0 0 0 1000px #C7C0F4 inset !important; + -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; + color: #383838; + -webkit-text-fill-color: #383838; +} + +#inputPassword{ + border: none; + border-radius: 7px; + margin: 10px; + text-align: center; + box-shadow: none; + background-color: #C7C0F4; + font-size: 20px; + color: #383838; +} + +#submitButton { + margin-top: 25px; + margin-left: 49px; + padding-left: -20px; + padding-right: -20px; + width: 200px; + background-color: #D6F091; + border: none; + border-radius: 7px; + font-size: 20px; + color: #383838 +} From 60103a948694af06a2e2b3bf0251153da36fb55e Mon Sep 17 00:00:00 2001 From: Anna Pawl Date: Tue, 19 Nov 2019 00:19:44 -0800 Subject: [PATCH 40/43] working on login styles --- public/index.html | 44 ++--- src/components/Login/index.tsx | 219 ++++++++++------------ src/components/Login/styles/Login.css.map | 2 +- src/components/Login/styles/Login.scss | 94 ++++++---- src/components/Login/styles/login.css | 78 ++++---- 5 files changed, 205 insertions(+), 232 deletions(-) diff --git a/public/index.html b/public/index.html index a146b6f..9e1c1d9 100644 --- a/public/index.html +++ b/public/index.html @@ -1,21 +1,21 @@ - - - - - - - - - - - React App - - - -
- - - + + + \ No newline at end of file diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 64c606f..84af922 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,167 +1,140 @@ import React from 'react'; -import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' - -import { withRouter, Redirect } from 'react-router-dom' - import { connect } from 'react-redux' -import { ReducersMapObject, Reducer, compose } from 'redux' +import { bindActionCreators } from 'redux' +import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' -import { logIn, LOGIN_STATE } from '../../actions/authentication' import { Link } from 'react-router-dom'; import './styles/login.css'; -import { LOG_IN } from '../../constants/authConstants' +import { setAuthentication } from '../../actions/authentication' +import { async } from 'q'; // TODO: What will be in our LoginInterface? -//State TYPES - - -//TYPES FOR props -interface Props{ - user?: String | null; - pending: boolean; - loggedIn: ()=>void; - mover: boolean; -} - -//TYPES for stateProps -interface StateProps { - authentication: Reducer -} - -//DispatchProps - -interface data { - status?: string, - message?: string, - Authorization?: string -} - -interface LOG_IN { - type: typeof LOG_IN, - payload: LOGIN_STATE +interface IErrorLoginState { + showErrorMessage: Boolean; + username: string; + password: string; + error: boolean; } -interface DispatchProps { - logIn: (payload: LOGIN_STATE) => LOG_IN +interface Props { + setAuthentication: Function; + request: Function } - -type props = StateProps & DispatchProps & Props - -interface IErrorLoginState { - showErrorMessage: Boolean; +interface requestBody { username: string; password: string; - error: boolean; - redirectPage: boolean; } -class Login extends React.Component { +interface responseBody { + status: string; + message: string; + Authorization: string; +} + +class Login extends React.Component { - constructor(props: props) { - super(props); + constructor(props: Props) { + super(props) this.state = { showErrorMessage: false, username: '', password: '', error: false, - redirectPage: false } } - + + // TODO: integrate in LOGIN component + // componentDidMount(){ + // request('/auth/token') + // .then(response => this.props.setAuthentication(response.data)) + // .catch(err => this.props.setAuthentication(null)) + // } + + handleSignIn = async () => { // this.props.logIn({username: this.state.username, password: this.state.password}) - const body = {username: this.state.username, password: this.state.password} + console.log("I am here") + const body: requestBody = { username: this.state.username, password: this.state.password } return fetch(`https://calcumon-user-api.herokuapp.com/auth/login`, { - method: 'POST', - headers: { - 'accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(body) - }).then(response=>{ - return response.json() - }).then((data)=>{ - this.props.logIn(data) - console.log(data) - this.setState({ redirectPage: true }) - }) - .catch(err=>{ - console.log(err) + method: 'post', + headers: { + 'accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(body) }) + .then((response) => { + console.log(response) + + }) + .catch(err => { console.log(err) }) } render() { - if (this.state.redirectPage){ - return - } else{ + // TODO: If redux authenticated is true: redirect to user dashboard return ( - <> - - -
- { - this.setState({ username: e.target.value}) - }} - required - autoFocus - /> - - { - this.setState({ password: e.target.value}) - }} - required - /> - -

New Here?

- - - -
- - ) - } - } -} + +
-const mapStateToProps = (state: ReducersMapObject) : StateProps => ({ - authentication: state.authentication -}) +
-const mapDispatchToProps = () : DispatchProps => { - return { - logIn + ) } } -export default connect(mapStateToProps, mapDispatchToProps())(Login) \ No newline at end of file +export default Login; diff --git a/src/components/Login/styles/Login.css.map b/src/components/Login/styles/Login.css.map index 15cc5d5..353d4f3 100644 --- a/src/components/Login/styles/Login.css.map +++ b/src/components/Login/styles/Login.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "AAAA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,OAAO;CAC1B;;AAED,AAAA,eAAe,CAAA;EACb,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,EAAE;EACX,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AAED,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB;;AAED,AAAA,cAAc,CAAA;EACZ,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAO;CAEf;;AAED,AAAA,KAAK,CAAC;EACJ,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,KAAK;CACb;;AACD,yGAAyG;AACzG,AAAA,cAAc,AAAA,iBAAiB,CAAC;EAC9B,UAAU,EAAE,qCAAqC;EACjD,kBAAkB,EAAE,qCAAqC;EACzD,KAAK,EAAE,OAAO;EACd,uBAAuB,EAAE,OAAO;CACjC;;AAED,AAAA,cAAc,CAAA;EACZ,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,OAAO;EACzB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAO;CACf;;AAED,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,KAAK;EACpB,KAAK,EAAE,KAAK;EACZ,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OACT;CAAC", + "mappings": "AAeA,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAC,KAAK;EACZ,gBAAgB,EAhBC,OAAO;CAiBzB;;AAMD,AAAA,uBAAuB,CAAA;EAdrB,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EAcvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,aAAa,CAAC;EACZ,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,GAAG;EAClB,gBAAgB,EAhCV,OAAO;EAiCb,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAtCK,OAAO;CAuClB;;AAGD,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB;;AAGD,yGAAyG;AAiBzG,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,KAAK;EACpB,KAAK,EAAE,KAAK;EACZ,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OACT;CAAC", "sources": [ "Login.scss" ], diff --git a/src/components/Login/styles/Login.scss b/src/components/Login/styles/Login.scss index 432126d..3074ed2 100644 --- a/src/components/Login/styles/Login.scss +++ b/src/components/Login/styles/Login.scss @@ -1,19 +1,48 @@ -body { - background-color: #F1FFCC; -} +// COLORS +$login_background: #E0FEFA; +$register_background:#F1FFCC; +$font-color:#707070; +$purple:#C7C0F4; +$green:#F1FFCC; +$blue:#E0FEFA; -.inputContainer{ - position: absolute; - width: 300px; - height: 500px; - z-index: 15; - top: 50%; - left: 50%; - margin: -100px 0 0 -150px; +// MIXINS +@mixin centerFlex { display: flex; + align-items:center; + justify-content: center; +} + +.login__container { + height:100vh; + background-color: $login_background; +} + +// .register__container { + +// } + +.login__input_container{ + @include centerFlex(); flex-direction: column; } + +.login__input { + height:50px; + width:270px; + border:none; + margin:10px; + border-radius: 7px; + background-color:$purple; + text-align:center; + font-family: 'Poppins', sans-serif; + font-weight: 700; + font-size: 15px; + color:$font-color; +} + + /* Waiting for SVG */ .splash-logo { display: block; @@ -22,41 +51,24 @@ body { min-width: 65vw; } -#inputUsername{ - border: none; - border-radius: 7px; - background-color: #C7C0F4; - margin: 10px; - text-align: center; - box-shadow: none; - font-size: 20px; - color: #383838; -} - -input { - height: 100px; - width: 250px; -} /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ -#inputPassword:-webkit-autofill { - box-shadow: 0 0 0 1000px #C7C0F4 inset !important; - -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; - color: #383838; - -webkit-text-fill-color: #383838; -} +// #inputPassword:-webkit-autofill { +// box-shadow: 0 0 0 1000px #C7C0F4 inset !important; +// -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; +// color: #383838; +// -webkit-text-fill-color: #383838; +// } + +// BUTTON STYLES +.login__button { -#inputPassword{ - border: none; - border-radius: 7px; - margin: 10px; - text-align: center; - box-shadow: none; - background-color: #C7C0F4; - font-size: 20px; - color: #383838; } +// .register__button { + +// } + #submitButton { margin-top: 25px; margin-left: 49px; diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 432126d..ecd4350 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -1,17 +1,36 @@ -body { - background-color: #F1FFCC; +.login__container { + height: 100vh; + background-color: #E0FEFA; } -.inputContainer{ - position: absolute; - width: 300px; - height: 500px; - z-index: 15; - top: 50%; - left: 50%; - margin: -100px 0 0 -150px; +.login__input_container { + display: -webkit-box; + display: -ms-flexbox; display: flex; - flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.login__input { + height: 50px; + width: 270px; + border: none; + margin: 10px; + border-radius: 7px; + background-color: #C7C0F4; + text-align: center; + font-family: 'Poppins', sans-serif; + font-weight: 700; + font-size: 15px; + color: #707070; } /* Waiting for SVG */ @@ -22,41 +41,7 @@ body { min-width: 65vw; } -#inputUsername{ - border: none; - border-radius: 7px; - background-color: #C7C0F4; - margin: 10px; - text-align: center; - box-shadow: none; - font-size: 20px; - color: #383838; - -} - -input { - height: 100px; - width: 250px; -} /* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ -#inputPassword:-webkit-autofill { - box-shadow: 0 0 0 1000px #C7C0F4 inset !important; - -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; - color: #383838; - -webkit-text-fill-color: #383838; -} - -#inputPassword{ - border: none; - border-radius: 7px; - margin: 10px; - text-align: center; - box-shadow: none; - background-color: #C7C0F4; - font-size: 20px; - color: #383838; -} - #submitButton { margin-top: 25px; margin-left: 49px; @@ -67,5 +52,6 @@ input { border: none; border-radius: 7px; font-size: 20px; - color: #383838 + color: #383838; } +/*# sourceMappingURL=Login.css.map */ \ No newline at end of file From 1a759084f2f9f3b4002022b137e6540a8c0337a0 Mon Sep 17 00:00:00 2001 From: Anna Pawl Date: Wed, 20 Nov 2019 10:05:32 -0800 Subject: [PATCH 41/43] added new banners, restyled inputs and buttons --- src/assets/Banners/login_banner.svg | 1 + src/assets/Banners/register_banner.svg | 1 + src/components/Login/index.tsx | 22 ++++++---- src/components/Login/styles/Login.css.map | 2 +- src/components/Login/styles/Login.scss | 53 +++++++++++++++-------- src/components/Login/styles/login.css | 48 +++++++++++++++----- src/components/Signup/index.tsx | 13 +++--- 7 files changed, 95 insertions(+), 45 deletions(-) create mode 100644 src/assets/Banners/login_banner.svg create mode 100644 src/assets/Banners/register_banner.svg diff --git a/src/assets/Banners/login_banner.svg b/src/assets/Banners/login_banner.svg new file mode 100644 index 0000000..4c1682b --- /dev/null +++ b/src/assets/Banners/login_banner.svg @@ -0,0 +1 @@ +calcumon-bannerCALCUMON \ No newline at end of file diff --git a/src/assets/Banners/register_banner.svg b/src/assets/Banners/register_banner.svg new file mode 100644 index 0000000..f5f9a04 --- /dev/null +++ b/src/assets/Banners/register_banner.svg @@ -0,0 +1 @@ +register_bannerWelCOME TO calcumon \ No newline at end of file diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 5293208..dd879e1 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' +import login_banner from '../../assets/Banners/login_banner.svg' import { withRouter, Redirect } from 'react-router-dom' @@ -103,11 +103,12 @@ class Login extends React.Component {
<>
+ {/* Username */} { autoFocus /> + {/* Password */} { }} required /> + + {/* Login Button */} -

New Here?

- - + {/* Register Link */} +

New Here?

+ + Register
diff --git a/src/components/Login/styles/Login.css.map b/src/components/Login/styles/Login.css.map index 26cb22a..18d3838 100644 --- a/src/components/Login/styles/Login.css.map +++ b/src/components/Login/styles/Login.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "AAgBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAhBC,OAAO;CAiBzB;;AAED,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EATlD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAhCK,OAAO;EAiCjB,gBAAgB,EAhCV,OAAO;CAiCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAnCX,OAAO;CAoCb;;AACD,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EArCZ,OAAO;CAsCZ;;AAID,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EAtDK,OAAO;EAuDjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EAzDV,OAAO;CA0Dd;;AAGD,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EAAE,OAAO;CAC1B;;AAMD,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB;;AAGD,yGAAyG", + "mappings": "AAiBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAjBC,OAAO;CAkBzB;;AAED,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EATlD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAjCK,OAAO;EAkCjB,gBAAgB,EAjCV,OAAO;CAkCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAnCZ,OAAO;CAoCZ;;AAED,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EAvCZ,OAAO;CAwCZ;;AAID,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EAxDK,OAAO;EAyDjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EA3DV,OAAO;CA4Dd;;AAED,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EA1Db,OAAO;EA2DV,SAAS,EAAE,UAAS;CACrB;;AAED,AAAA,iBAAiB,AAAA,MAAM,CAAC;EACtB,gBAAgB,EAjEX,OAAO;EAkEZ,SAAS,EAAE,UAAS;CACrB;;AAGD,AAAA,SAAS,EAAE,YAAY,CAAC;EACtB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,UAAU,EAAC,IAAI;EACf,aAAa,EAAE,CAAC;CACjB;;AAED,AAAA,YAAY,EAAE,eAAe,CAAC;EAC5B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAC,GAAG;EACf,SAAS,EAAC,IAAI;CACf;;AAED,AAAA,YAAY,AAAA,MAAM,EAAE,eAAe,AAAA,MAAM,CAAC;EACxC,SAAS,EAAE,UAAU;CACtB;;AAED,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB", "sources": [ "Login.scss" ], diff --git a/src/components/Login/styles/Login.scss b/src/components/Login/styles/Login.scss index 06afd9f..43ab660 100644 --- a/src/components/Login/styles/Login.scss +++ b/src/components/Login/styles/Login.scss @@ -1,11 +1,12 @@ // COLORS -$login_background: #E0FEFA; -$register_background:#F1FFCC; +$login_background: #e9ffa6; +$register_background:#E0FEFA; $button:#C7C0F4; -$font_color:#707070; +$font_color:#3b3b3b; $purple:#C7C0F4; $green:#F1FFCC; -$blue:#E0FEFA; +$blue:#a9fcf4; +$red:#ffafad; // MIXINS @mixin centerFlex { @@ -31,7 +32,7 @@ body { margin:10px; border-radius: 10px; font-weight: 700; - font-size: 15px; + font-size: 16px; text-align:center; font-family: 'Poppins', sans-serif; color:$font-color; @@ -39,8 +40,9 @@ body { } .login__input:hover { - background-color:$green; + background-color:$blue; } + .register__input:hover { background-color:$blue; } @@ -54,20 +56,41 @@ body { bordeR:none; border-radius:10px; font-family: 'Poppins', sans-serif; - font-size:16px; - font-weight: 500; + font-size:17px; + font-weight: 700; color:$font_color; text-transform: uppercase; background-color:$button; } - .login__button:hover { - background-color: #E2FF96; + background-color:$red; + transform: scale(.9); +} + +.register__button:hover { + background-color:$green; + transform: scale(.9); } -.register__button { +// Link Styles +.login__p, .register__p { + text-transform: uppercase; + font-family: 'Poppins', sans-serif; + font-size:15px; + margin-top:10px; + margin-bottom: 0; +} + +.login__link, .register__link { + text-transform: uppercase; + font-family: 'Poppins', sans-serif; + font-weight:500; + font-size:18px; +} +.login__link:hover, .register__link:hover { + transform: scale(1.1) } /* Waiting for SVG */ @@ -79,12 +102,4 @@ body { } -/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ -// #inputPassword:-webkit-autofill { -// box-shadow: 0 0 0 1000px #C7C0F4 inset !important; -// -webkit-box-shadow: 0 0 0 1000px #C7C0F4 inset !important; -// color: #383838; -// -webkit-text-fill-color: #383838; -// } - diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 1142a97..45636bf 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -1,5 +1,5 @@ body { - background-color: #E0FEFA; + background-color: #e9ffa6; } .login__input_container, .register__input_container { @@ -25,19 +25,19 @@ body { margin: 10px; border-radius: 10px; font-weight: 700; - font-size: 15px; + font-size: 16px; text-align: center; font-family: 'Poppins', sans-serif; - color: #707070; + color: #3b3b3b; background-color: #C7C0F4; } .login__input:hover { - background-color: #F1FFCC; + background-color: #a9fcf4; } .register__input:hover { - background-color: #E0FEFA; + background-color: #a9fcf4; } .button { @@ -47,15 +47,43 @@ body { bordeR: none; border-radius: 10px; font-family: 'Poppins', sans-serif; - font-size: 16px; - font-weight: 500; - color: #707070; + font-size: 17px; + font-weight: 700; + color: #3b3b3b; text-transform: uppercase; background-color: #C7C0F4; } .login__button:hover { - background-color: #E2FF96; + background-color: #ffafad; + -webkit-transform: scale(0.9); + transform: scale(0.9); +} + +.register__button:hover { + background-color: #F1FFCC; + -webkit-transform: scale(0.9); + transform: scale(0.9); +} + +.login__p, .register__p { + text-transform: uppercase; + font-family: 'Poppins', sans-serif; + font-size: 15px; + margin-top: 10px; + margin-bottom: 0; +} + +.login__link, .register__link { + text-transform: uppercase; + font-family: 'Poppins', sans-serif; + font-weight: 500; + font-size: 18px; +} + +.login__link:hover, .register__link:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); } /* Waiting for SVG */ @@ -65,6 +93,4 @@ body { width: 300px; min-width: 65vw; } - -/* The auto fill changes the collor to white. So I changed the autofill color to the input field color */ /*# sourceMappingURL=Login.css.map */ \ No newline at end of file diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 52348e1..6ce3dd0 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { bool } from 'prop-types'; import { booleanLiteral } from '@babel/types'; import { Link, Redirect } from 'react-router-dom' -import Banner1 from '../../assets/Banners/Calcumon-Banner1.png' +import register_banner from '../../assets/Banners/register_banner.svg' import './styles/Signup.css' export interface Props { @@ -60,7 +60,7 @@ class Signup extends React.Component {
{/* Email */} @@ -99,15 +99,18 @@ class Signup extends React.Component {
-

Already Registered?

+

Already Registered?

+ to='/' + className='register__link' + >Login +
From e85a6cfef0875f60d7c981550d16c56b6f675432 Mon Sep 17 00:00:00 2001 From: Anna Pawl Date: Wed, 20 Nov 2019 10:59:59 -0800 Subject: [PATCH 42/43] v2 ready for merge --- src/assets/Banners/Calcumon-Banner1.png | Bin 39336 -> 0 bytes src/components/Login/index.tsx | 109 +++++++++++----------- src/components/Login/styles/Login.css.map | 2 +- src/components/Login/styles/Login.scss | 36 +++++-- src/components/Login/styles/login.css | 41 ++++++-- src/components/Signup/index.tsx | 45 +++++---- 6 files changed, 137 insertions(+), 96 deletions(-) delete mode 100644 src/assets/Banners/Calcumon-Banner1.png diff --git a/src/assets/Banners/Calcumon-Banner1.png b/src/assets/Banners/Calcumon-Banner1.png deleted file mode 100644 index 1849bf130741b400363979658676e4accca47c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39336 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 { return } else { return ( +
- <> - + + {/* Login Input Fields */} +
+ {/* Username */} + { + this.setState({ username: e.target.value }) + }} + required + autoFocus /> -
- {/* Username */} - { - this.setState({ username: e.target.value }) - }} - required - autoFocus - /> - - {/* Password */} - { - this.setState({ password: e.target.value }) - }} - required - /> - - {/* Login Button */} - - {/* Register Link */} -

New Here?

- - Register - -
- + {/* Link to Register Page */} +

Not Registered Yet?

+ + Register + +
+
) } diff --git a/src/components/Login/styles/Login.css.map b/src/components/Login/styles/Login.css.map index 18d3838..fdc77ff 100644 --- a/src/components/Login/styles/Login.css.map +++ b/src/components/Login/styles/Login.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "AAiBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAjBC,OAAO;CAkBzB;;AAED,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EATlD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAjCK,OAAO;EAkCjB,gBAAgB,EAjCV,OAAO;CAkCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAnCZ,OAAO;CAoCZ;;AAED,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EAvCZ,OAAO;CAwCZ;;AAID,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EAxDK,OAAO;EAyDjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EA3DV,OAAO;CA4Dd;;AAED,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EA1Db,OAAO;EA2DV,SAAS,EAAE,UAAS;CACrB;;AAED,AAAA,iBAAiB,AAAA,MAAM,CAAC;EACtB,gBAAgB,EAjEX,OAAO;EAkEZ,SAAS,EAAE,UAAS;CACrB;;AAGD,AAAA,SAAS,EAAE,YAAY,CAAC;EACtB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,UAAU,EAAC,IAAI;EACf,aAAa,EAAE,CAAC;CACjB;;AAED,AAAA,YAAY,EAAE,eAAe,CAAC;EAC5B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAC,GAAG;EACf,SAAS,EAAC,IAAI;CACf;;AAED,AAAA,YAAY,AAAA,MAAM,EAAE,eAAe,AAAA,MAAM,CAAC;EACxC,SAAS,EAAE,UAAU;CACtB;;AAED,qBAAqB;AACrB,AAAA,YAAY,CAAC;EACX,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,gBAAgB;EACxB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAI;CAChB", + "mappings": "AAiBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAjBC,OAAO;CAkBzB;;AAED,AAAA,iBAAiB,EAAE,oBAAoB,CAAC;EATtC,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EAflD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EAevB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAvCK,OAAO;EAwCjB,gBAAgB,EAvCV,OAAO;CAwCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAzCZ,OAAO;CA0CZ;;AAED,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EA7CZ,OAAO;CA8CZ;;AAGD,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EA7DK,OAAO;EA8DjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EAhEV,OAAO;CAiEd;;AAED,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EA/Db,OAAO;EAgEV,SAAS,EAAE,UAAS;CACrB;;AAED,AAAA,iBAAiB,AAAA,MAAM,CAAC;EACtB,gBAAgB,EAtEX,OAAO;EAuEZ,SAAS,EAAE,UAAS;CACrB;;AAGD,AAAA,SAAS,EAAE,YAAY,CAAC;EACtB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,UAAU,EAAC,IAAI;EACf,aAAa,EAAE,CAAC;CACjB;;AAED,AAAA,YAAY,EAAE,eAAe,CAAC;EAC5B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAC,GAAG;EACf,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;CACtB;;AAGD,AAAA,YAAY,AAAA,MAAM,EAAE,eAAe,AAAA,MAAM,CAAC;EACxC,SAAS,EAAE,UAAU;CACtB;;AAGD,AAAA,cAAc,CAAC;EACb,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAE,IAAI;CACjB;;AAED,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAC,IAAI;CAChB;;AAED,AAAA,gBAAgB,CAAC;EACf,KAAK,EAAC,KAAK;EACX,YAAY,EAAC,IAAI;EACjB,aAAa,EAAC,IAAI;CACnB", "sources": [ "Login.scss" ], diff --git a/src/components/Login/styles/Login.scss b/src/components/Login/styles/Login.scss index 43ab660..34cd842 100644 --- a/src/components/Login/styles/Login.scss +++ b/src/components/Login/styles/Login.scss @@ -1,5 +1,5 @@ // COLORS -$login_background: #e9ffa6; +$login_background: #eaffab; $register_background:#E0FEFA; $button:#C7C0F4; $font_color:#3b3b3b; @@ -19,9 +19,15 @@ body { background-color: $login_background; } +.login__container, .register__container { + @include centerFlex(); + flex-direction: column; +} + + .login__input_container, .register__input_container { @include centerFlex(); - flex-direction: column; + flex-direction: column; } // INPUT STYLES @@ -47,7 +53,6 @@ body { background-color:$blue; } - // BUTTON STYLES .button { height:45px; @@ -87,18 +92,31 @@ body { font-family: 'Poppins', sans-serif; font-weight:500; font-size:18px; + text-decoration: none; } + .login__link:hover, .register__link:hover { transform: scale(1.1) } -/* Waiting for SVG */ -.splash-logo { - display: block; - margin: 15vh auto 0 auto; - width: 300px; - min-width: 65vw; +// BANNER STYLES +.login__banner { + height:25vh; + width:70vw; + margin-top: 80px; +} + +.register__banner { + height:30vh; + width:75vw; + margin-top:50px; +} + +.login__monsters { + width:100vw; + padding-left:50px; + padding-right:50px; } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 45636bf..9586580 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -1,5 +1,21 @@ body { - background-color: #e9ffa6; + background-color: #eaffab; +} + +.login__container, .register__container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } .login__input_container, .register__input_container { @@ -79,6 +95,7 @@ body { font-family: 'Poppins', sans-serif; font-weight: 500; font-size: 18px; + text-decoration: none; } .login__link:hover, .register__link:hover { @@ -86,11 +103,21 @@ body { transform: scale(1.1); } -/* Waiting for SVG */ -.splash-logo { - display: block; - margin: 15vh auto 0 auto; - width: 300px; - min-width: 65vw; +.login__banner { + height: 25vh; + width: 70vw; + margin-top: 80px; +} + +.register__banner { + height: 30vh; + width: 75vw; + margin-top: 50px; +} + +.login__monsters { + width: 100vw; + padding-left: 50px; + padding-right: 50px; } /*# sourceMappingURL=Login.css.map */ \ No newline at end of file diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 6ce3dd0..0f25275 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -56,13 +56,16 @@ class Signup extends React.Component { render() { if (!this.state.redirector) { return ( -
-
- + +
+ {/* Register Banner */} + + + {/* Register Input Fields */} +
{/* Email */} { placeholder="p a s s w o r d" onChange={(e) => this.setState({ password: e.target.value })} required /> - {/* this.setState({ verifiedPassword : e.target.value})} - required /> */} + + {/* Register Button */} -
-

Already Registered?

- Login - -
+ }}>Register + + {/* Link to Login Page */} +

+ Already Registered?

+ Login + +
); From 1b5709d75ab61abe5be6ed518260646d199db4f1 Mon Sep 17 00:00:00 2001 From: Anna Pawl Date: Wed, 20 Nov 2019 13:15:03 -0800 Subject: [PATCH 43/43] added and formatted limbs svg --- src/assets/Banners/limbs.svg | 1 + src/components/Login/index.tsx | 7 +++++++ src/components/Login/styles/Login.css.map | 2 +- src/components/Login/styles/Login.scss | 19 ++++++++++++------- src/components/Login/styles/login.css | 18 ++++++++++++------ src/components/Signup/index.tsx | 6 ++++++ 6 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 src/assets/Banners/limbs.svg diff --git a/src/assets/Banners/limbs.svg b/src/assets/Banners/limbs.svg new file mode 100644 index 0000000..b2de77e --- /dev/null +++ b/src/assets/Banners/limbs.svg @@ -0,0 +1 @@ +limbs \ No newline at end of file diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index b64687d..1b713e6 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,5 +1,6 @@ import React from 'react'; import login_banner from '../../assets/Banners/login_banner.svg' +import limbs from '../../assets/Banners/limbs.svg' import { Link, withRouter, Redirect } from 'react-router-dom' @@ -152,6 +153,12 @@ class Login extends React.Component {
+ + +
) } diff --git a/src/components/Login/styles/Login.css.map b/src/components/Login/styles/Login.css.map index fdc77ff..5d98bc2 100644 --- a/src/components/Login/styles/Login.css.map +++ b/src/components/Login/styles/Login.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "AAiBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAjBC,OAAO;CAkBzB;;AAED,AAAA,iBAAiB,EAAE,oBAAoB,CAAC;EATtC,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EAflD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EAevB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAvCK,OAAO;EAwCjB,gBAAgB,EAvCV,OAAO;CAwCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAzCZ,OAAO;CA0CZ;;AAED,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EA7CZ,OAAO;CA8CZ;;AAGD,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EA7DK,OAAO;EA8DjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EAhEV,OAAO;CAiEd;;AAED,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EA/Db,OAAO;EAgEV,SAAS,EAAE,UAAS;CACrB;;AAED,AAAA,iBAAiB,AAAA,MAAM,CAAC;EACtB,gBAAgB,EAtEX,OAAO;EAuEZ,SAAS,EAAE,UAAS;CACrB;;AAGD,AAAA,SAAS,EAAE,YAAY,CAAC;EACtB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,UAAU,EAAC,IAAI;EACf,aAAa,EAAE,CAAC;CACjB;;AAED,AAAA,YAAY,EAAE,eAAe,CAAC;EAC5B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAC,GAAG;EACf,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;CACtB;;AAGD,AAAA,YAAY,AAAA,MAAM,EAAE,eAAe,AAAA,MAAM,CAAC;EACxC,SAAS,EAAE,UAAU;CACtB;;AAGD,AAAA,cAAc,CAAC;EACb,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAE,IAAI;CACjB;;AAED,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAC,IAAI;CAChB;;AAED,AAAA,gBAAgB,CAAC;EACf,KAAK,EAAC,KAAK;EACX,YAAY,EAAC,IAAI;EACjB,aAAa,EAAC,IAAI;CACnB", + "mappings": "AAiBA,AAAA,IAAI,CAAC;EACH,gBAAgB,EAjBC,OAAO;CAkBzB;;AAED,AAAA,iBAAiB,EAAE,oBAAoB,CAAC;EATtC,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EASvB,cAAc,EAAE,MAAM;CACvB;;AAED,AAAA,uBAAuB,EAAE,0BAA0B,CAAC;EAdlD,OAAO,EAAE,IAAI;EACb,WAAW,EAAC,MAAM;EAClB,eAAe,EAAE,MAAM;EAcvB,cAAc,EAAE,MAAM;CACvB;;AAGD,AAAA,YAAY,CAAC;EACX,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAC,MAAM;EACjB,WAAW,EAAE,qBAAqB;EAClC,KAAK,EAtCK,OAAO;EAuCjB,gBAAgB,EAtCV,OAAO;CAuCd;;AAED,AAAA,aAAa,AAAA,MAAM,CAAC;EAClB,gBAAgB,EAxCZ,OAAO;CAyCZ;;AAED,AAAA,gBAAgB,AAAA,MAAM,CAAC;EACrB,gBAAgB,EA5CZ,OAAO;CA6CZ;;AAGD,AAAA,OAAO,CAAC;EACN,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,KAAK;EACX,MAAM,EAAC,GAAG;EACV,MAAM,EAAC,IAAI;EACX,aAAa,EAAC,IAAI;EAClB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,WAAW,EAAE,GAAG;EAChB,KAAK,EA5DK,OAAO;EA6DjB,cAAc,EAAE,SAAS;EACzB,gBAAgB,EA/DV,OAAO;CAgEd;;AAED,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,gBAAgB,EA9Db,OAAO;EA+DV,SAAS,EAAE,UAAS;CACrB;;AAED,AAAA,iBAAiB,AAAA,MAAM,CAAC;EACtB,gBAAgB,EArEX,OAAO;EAsEZ,SAAS,EAAE,UAAS;CACrB;;AAGD,AAAA,SAAS,EAAE,YAAY,CAAC;EACtB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,SAAS,EAAC,IAAI;EACd,UAAU,EAAC,IAAI;EACf,aAAa,EAAE,CAAC;CACjB;;AAED,AAAA,YAAY,EAAE,eAAe,CAAC;EAC5B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,qBAAqB;EAClC,WAAW,EAAC,GAAG;EACf,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;CACtB;;AAGD,AAAA,YAAY,AAAA,MAAM,EAAE,eAAe,AAAA,MAAM,CAAC;EACxC,SAAS,EAAE,UAAU;CACtB;;AAGD,AAAA,cAAc,CAAC;EACb,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAE,GAAG;CAChB;;AAED,AAAA,iBAAiB,CAAC;EAChB,MAAM,EAAC,IAAI;EACX,KAAK,EAAC,IAAI;EACV,UAAU,EAAC,GAAG;CACf;;AAED,AAAA,MAAM,CAAA;EACL,QAAQ,EAAE,KAAK;EACf,MAAM,EAAC,KAAK;EACZ,KAAK,EAAC,IAAI;CACV;;AAED,AAAA,oBAAoB,CAAC;EACnB,QAAQ,EAAE,KAAK;EACf,MAAM,EAAC,KAAK;EACZ,KAAK,EAAC,IAAI;CACX", "sources": [ "Login.scss" ], diff --git a/src/components/Login/styles/Login.scss b/src/components/Login/styles/Login.scss index 34cd842..10663a0 100644 --- a/src/components/Login/styles/Login.scss +++ b/src/components/Login/styles/Login.scss @@ -24,7 +24,6 @@ body { flex-direction: column; } - .login__input_container, .register__input_container { @include centerFlex(); flex-direction: column; @@ -104,19 +103,25 @@ body { .login__banner { height:25vh; width:70vw; - margin-top: 80px; + margin-top: 8vh; } .register__banner { height:30vh; width:75vw; - margin-top:50px; + margin-top:5vh; +} + +.limbs{ + position: fixed; + bottom:-30px; + width:90vw; } -.login__monsters { - width:100vw; - padding-left:50px; - padding-right:50px; +.registration__limbs { + position: fixed; + bottom:-70px; + width:90vw; } diff --git a/src/components/Login/styles/login.css b/src/components/Login/styles/login.css index 9586580..28d63d4 100644 --- a/src/components/Login/styles/login.css +++ b/src/components/Login/styles/login.css @@ -106,18 +106,24 @@ body { .login__banner { height: 25vh; width: 70vw; - margin-top: 80px; + margin-top: 8vh; } .register__banner { height: 30vh; width: 75vw; - margin-top: 50px; + margin-top: 5vh; } -.login__monsters { - width: 100vw; - padding-left: 50px; - padding-right: 50px; +.limbs { + position: fixed; + bottom: -30px; + width: 90vw; +} + +.registration__limbs { + position: fixed; + bottom: -70px; + width: 90vw; } /*# sourceMappingURL=Login.css.map */ \ No newline at end of file diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 0f25275..b1494a4 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -3,6 +3,8 @@ import { bool } from 'prop-types'; import { booleanLiteral } from '@babel/types'; import { Link, Redirect } from 'react-router-dom' import register_banner from '../../assets/Banners/register_banner.svg' +import limbs from '../../assets/Banners/limbs.svg' + import './styles/Signup.css' export interface Props { @@ -112,6 +114,10 @@ class Signup extends React.Component { + ); } else {