diff --git a/package-lock.json b/package-lock.json index 83f3c05..584130c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1078,6 +1078,11 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@fortawesome/fontawesome-free": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz", + "integrity": "sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg==" + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -2450,6 +2455,37 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "axobject-query": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", @@ -4288,6 +4324,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -5802,6 +5843,11 @@ } } }, + "fn-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-3.0.0.tgz", + "integrity": "sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA==" + }, "follow-redirects": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", @@ -5870,6 +5916,32 @@ "mime-types": "^2.1.12" } }, + "formik": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.1.4.tgz", + "integrity": "sha512-oKz8S+yQBzuQVSEoxkqqJrKQS5XJASWGVn6mrs+oTWrBoHgByVwwI1qHiVc9GKDpZBU9vAxXYAKz2BvujlwunA==", + "requires": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.14", + "lodash-es": "^4.17.14", + "react-fast-compare": "^2.0.1", + "scheduler": "^0.18.0", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "scheduler": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -6348,6 +6420,19 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -6358,6 +6443,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -7982,6 +8075,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -8416,6 +8514,15 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" }, + "mini-create-react-context": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "requires": { + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" + } + }, "mini-css-extract-plugin": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", @@ -10608,6 +10715,11 @@ "react-is": "^16.8.1" } }, + "property-expr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.2.tgz", + "integrity": "sha512-bc/5ggaYZxNkFKj374aLbEDqVADdYaLcFo8XBkishUWbaAdjlphaBFns9TvRA2pUseVL/wMFmui9X3IdNDU37g==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -11046,11 +11158,74 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-redux": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", + "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", + "requires": { + "@babel/runtime": "^7.5.5", + "hoist-non-react-statics": "^3.3.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + } + }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, "react-scripts": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz", @@ -11312,6 +11487,20 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + } + }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -11561,6 +11750,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -12838,11 +13032,21 @@ "util.promisify": "~1.0.0" } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "synchronous-promise": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.12.tgz", + "integrity": "sha512-rIDJiHmIK02tXU+eW1v6a7rNIIiMLm5JUF5Uj2fT6oLSulg7WNDVoqvkYqkFoJzf4v2gmTLppvzegdo9R+7h1Q==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -13099,6 +13303,16 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13155,6 +13369,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -13483,6 +13702,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -14634,6 +14858,20 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yup": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.28.5.tgz", + "integrity": "sha512-7JZcvpUGUxMKoaEtcoMEM8lCWRaueGNH/A3EhL/UWqfbFm3uloiI+x59Yq4nzhbbYWUTwAsCteaZOJ+VbqI1uw==", + "requires": { + "@babel/runtime": "^7.9.6", + "fn-name": "~3.0.0", + "lodash": "^4.17.15", + "lodash-es": "^4.17.11", + "property-expr": "^2.0.2", + "synchronous-promise": "^2.0.10", + "toposort": "^2.0.2" + } } } } diff --git a/package.json b/package.json index 8e7a1ab..0db72a8 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,22 @@ "version": "0.0.1", "private": false, "dependencies": { + "@fortawesome/fontawesome-free": "^5.13.0", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", + "axios": "^0.19.2", "eslint-config-airbnb-base": "^14.1.0", + "formik": "^2.1.4", "node-sass": "4.14.1", "react": "^16.13.1", "react-dom": "^16.13.1", - "react-scripts": "3.4.1" + "react-redux": "^7.2.0", + "react-router-dom": "^5.2.0", + "react-scripts": "3.4.1", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "yup": "^0.28.5" }, "scripts": { "start": "react-scripts start", diff --git a/src/App.js b/src/App.js index 34994f3..eed5062 100644 --- a/src/App.js +++ b/src/App.js @@ -1,24 +1,30 @@ import React from 'react'; -import logo from './logo.svg'; +import { BrowserRouter, Switch, Route } from 'react-router-dom'; import './App.scss'; +import '../node_modules/@fortawesome/fontawesome-free/css/all.min.css'; +import Login from './components/Login/Login'; +import Signup from './components/Signup/Signup'; +import Navbar from './components/Navbar/Navbar'; +import Footer from './components/Footer/Footer'; +import About from './components/About/About'; +import Contact from './components/ContactUs/Contact'; function App() { return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
+
+ + +
+ + + + + + +
+ +
+
); } diff --git a/src/App.scss b/src/App.scss index 74b5e05..b892791 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,5 +1,17 @@ -.App { - text-align: center; +$greenColor: #209403; +$yellowColor: #d39000; +$blackColor: #04070e; + +*, +*:hover, +*:after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.app-wrapper { + min-height: 60vh; } .App-logo { diff --git a/src/components/Login/Login.jsx b/src/components/Login/Login.jsx new file mode 100644 index 0000000..3b43bec --- /dev/null +++ b/src/components/Login/Login.jsx @@ -0,0 +1,94 @@ +import React, { useState } from 'react'; +import { Formik, Form, Field } from 'formik'; +import * as yup from 'yup'; +import { Link } from 'react-router-dom'; + +import './login.scss'; +import { useDispatch, useSelector } from 'react-redux'; +import { loginUser } from '../../redux/actions/userActions'; + +const Login = () => { + const initialValues = { + emailAddress: '', + password: '' + }; + + const dispatch = useDispatch(); + + let loginSchema = yup.object().shape({ + emailAddress: yup.string().email('Login with a valid email'), + password: yup.string() + }); + + const handleSubmit = (data) => { + dispatch(loginUser(data)); + }; + return ( + <> +
+

Welcome to FarmReach

+
+
+
+

+ Login +

+
+ { + handleSubmit(data); + }} + > + {({ errors, touched }) => ( +
+
+ + + {errors.email && touched.emailAddress ? ( +
{errors.emailAddress}
+ ) : null} +
+
+ + + {errors.password && touched.password ?
{errors.password}
: null} +
+

+ Forgot Password +

+ +
+ +
+ +
+

+ {' '} + I dont have an account yet   + + Create Account + {' '} +

+
+ )} +
+
+
+
+ + ); +}; + +export default Login; diff --git a/src/components/Login/login.scss b/src/components/Login/login.scss new file mode 100644 index 0000000..38cb77f --- /dev/null +++ b/src/components/Login/login.scss @@ -0,0 +1,106 @@ +$greenColor: #209403; +$yellowColor: #f3b01e; +$blackColor: #04070e; +@mixin customShadow { + box-shadow: 0px 0px 5px #b3b3b3; +} + +.form-wrapper { + height: 65vh; + width: 90%; + margin: 0 auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + overflow: hidden; + + .welcome-text { + font-weight: 400; + text-align: center; + } + + .form-container { + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + max-width: 600px; + padding-bottom: 30px; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + @include customShadow(); + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 7px; + width: 100%; + background: $greenColor; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + } + + .login-text { + text-align: center; + margin: 7px auto; + } + } +} + +.form { + padding: 7px; + height: 100%; + width: 95%; + margin: 0 auto; + // @include customShadow(); + + .form-div { + width: 100%; + position: relative; + display: block; + + .login-icon { + position: absolute; + top: 10px; + left: 3px; + padding: 8px; + } + .form-control { + width: 100%; + height: 34px; + margin: 10px 0px; + padding-left: 30px; + border: 1px solid #d1cece; + border-radius: 4px; + + &:focus + .login-icon { + color: $yellowColor; + } + } + .forgot-password { + text-align: right; + } + } +} + +.login-btn { + border: none; + text-align: center; + background: $yellowColor; + text-transform: uppercase; + height: 34px; + + width: 100%; +} + +.forgot-password { + text-align: right; + margin-right: 8px; + margin-bottom: 10px; +} diff --git a/src/components/Signup/Signup.jsx b/src/components/Signup/Signup.jsx new file mode 100644 index 0000000..a3af61c --- /dev/null +++ b/src/components/Signup/Signup.jsx @@ -0,0 +1,129 @@ +import React, { useState } from 'react'; +import { Formik, Form, Field } from 'formik'; +import * as yup from 'yup'; +import { Link } from 'react-router-dom'; + +import './signup.scss'; +import { useDispatch, useSelector } from 'react-redux'; +import { signUpUser } from '../../redux/actions/userActions'; + +const SignUp = () => { + const initialValues = { + firstName: '', + lastName: '', + emailAddress: '', + phoneNumber: '', + password: '', + confirmPassword: '' + }; + + const dispatch = useDispatch(); + + let loginSchema = yup.object().shape({ + firstName: yup.string().required('This is a required field'), + lastName: yup.string().required('This is a required field'), + phoneNumber: yup.string().required('This is a required field'), + emailAddress: yup.string().email().required('This is a required field'), + password: yup.string().required('This is a required field'), + confirmPassword: yup.string().required() + // termsAndCondition: yup.string().required() + }); + + const handleSubmit = (data) => { + dispatch(signUpUser(data)); + }; + return ( + <> +
+

Welcome to FarmReach

+
+

+ Let's Get Started +

+
+
+ { + handleSubmit(data); + }} + > + {({ errors, touched }) => ( +
+
+ + {errors.firstName && touched.firstName ? ( +
{errors.firstName}
+ ) : null} +
+
+ + {errors.lastName && touched.lastName ?
{errors.lastName}
: null} +
+
+ + {errors.emailAddress && touched.emailAddress ? ( +
{errors.emailAddress}
+ ) : null} +
+
+ + {errors.phoneNumber && touched.phoneNumber ? ( +
{errors.phoneNumber}
+ ) : null} +
+ +
+ + {errors.password && touched.password ?
{errors.password}
: null} +
+ +
+ +
+ + +
+

+ {' '} + I already have an account   + Login +

+ + {/*
+ + +
*/} +
+ )} +
+
+
+
+ + ); +}; + +export default SignUp; diff --git a/src/components/Signup/signup.scss b/src/components/Signup/signup.scss new file mode 100644 index 0000000..7d5991c --- /dev/null +++ b/src/components/Signup/signup.scss @@ -0,0 +1,138 @@ +$greenColor: #209403; +$yellowColor: #f3b01e; +$blackColor: #04070e; +@mixin customShadow { + box-shadow: 0px 0px 5px #b3b3b3; +} + +.signup-form-wrapper { + margin-top: 20px; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .welcome-text { + font-weight: 400; + text-align: center; + margin: 5px 0px; + } + + .form-container { + width: 100%; + margin-top: 7px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + max-width: 700px; + padding: 8px; + padding-bottom: 30px; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + @include customShadow(); + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 7px; + width: 100%; + background: $greenColor; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + } + } +} + +.signup-form { + padding: 7px; + height: 100%; + width: 90%; + + .form-div { + width: 100%; + .form-control { + width: 100%; + height: 33px; + margin: 8px 0px; + padding-left: 5px; + background: transparent; + border: 1px solid #d1cece; + border-radius: 4px; + } + .login-text { + text-align: center; + } + } +} + +.signup-btn { + border: none; + text-align: center; + background: $yellowColor; + height: 35px; + // margin-left: 15px; + width: 100%; + margin-bottom: 8px; + margin-top: 10px; + @include customShadow(); +} + +.forgot-password { + text-align: right; + margin-right: 8px; + margin-bottom: 10px; +} + +.form-div-checkbox { + margin-bottom: 2rem; + margin-top: 10px; + display: flex; + align-items: center; + + .form-control-check { + width: 15px; + height: 15px; + } +} + +@media screen and (max-width: 576px) { + .signup-form-wrapper { + .welcome-text { + font-weight: 400; + text-align: center; + margin: 5px 0px; + } + + .form-container { + width: 95%; + } + } + + .signup-form { + padding: 7px; + height: 100%; + width: 95%; + + .form-div { + width: 100%; + .form-control { + width: 100%; + height: 33px; + margin: 8px 0px; + padding-left: 5px; + background: transparent; + border: 1px solid #d1cece; + border-radius: 4px; + } + .login-text { + text-align: center; + } + } + } +} diff --git a/src/index.js b/src/index.js index 4cb9410..9dfe4f5 100644 --- a/src/index.js +++ b/src/index.js @@ -3,11 +3,15 @@ import ReactDOM from 'react-dom'; import './index.scss'; import App from './App'; import * as serviceWorker from './serviceWorker'; +import { Provider } from 'react-redux'; +import store from './redux/store'; ReactDOM.render( - - - , + + + + + , document.getElementById('root') ); diff --git a/src/redux/actions/userActions.js b/src/redux/actions/userActions.js new file mode 100644 index 0000000..57aa20b --- /dev/null +++ b/src/redux/actions/userActions.js @@ -0,0 +1,11 @@ +export function loginUser(data) { + return console.log(data); +} + +export function logOutUser() { + return console.log('loged out'); +} + +export function signUpUser() { + return console.log('User Signup'); +} diff --git a/src/redux/reducers/rootReducer.js b/src/redux/reducers/rootReducer.js new file mode 100644 index 0000000..31cf3a2 --- /dev/null +++ b/src/redux/reducers/rootReducer.js @@ -0,0 +1,8 @@ +import { combineReducers } from 'redux'; +import userReducer from './userReducer'; + +const rootReducer = combineReducers({ + user: userReducer +}); + +export default rootReducer; diff --git a/src/redux/reducers/userReducer.js b/src/redux/reducers/userReducer.js new file mode 100644 index 0000000..8631e35 --- /dev/null +++ b/src/redux/reducers/userReducer.js @@ -0,0 +1,30 @@ +const initialState = { + isAuthenticated: false, + data: {} +}; + +export default function userReducer(state = initialState, action) { + switch (action.type) { + case 'AUTHENTICATE_USER': + return { + ...state, + isAuthenticated: true + }; + case 'LOGIN_USER': + return { + ...state, + isAuthenticated: true, + data: action.payload + }; + + case 'LOGOUT_USER': + return { + ...state, + isAuthenticated: false, + data: {} + }; + + default: + return state; + } +} diff --git a/src/redux/store.js b/src/redux/store.js new file mode 100644 index 0000000..b769578 --- /dev/null +++ b/src/redux/store.js @@ -0,0 +1,10 @@ +import { createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; +import rootReducer from './reducers/rootReducer'; + +const middleWares = [thunk]; + +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const store = createStore(rootReducer, composeEnhancers(applyMiddleware(...middleWares))); + +export default store;