diff --git a/README.md b/README.md
index 54ef094..49bab17 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,23 @@
+# IFUTURE
+
+Nome dos integrantes:
+- Adrielly Costa
+- Andréa Soares
+- Davi Souza
+- David Biolchini
+- Rafael Julio
+
+
+Link do Surge: http://fat-leather.surge.sh/
+
+
+### 🛠 Tecnologias
+- React
+- Styled-components
+- Material-UI
+
+
+
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
diff --git a/debug.log b/debug.log
new file mode 100644
index 0000000..468cf86
--- /dev/null
+++ b/debug.log
@@ -0,0 +1 @@
+[0121/095442.888:ERROR:directory_reader_win.cc(43)] FindFirstFile: O sistema no pode encontrar o caminho especificado. (0x3)
diff --git a/package-lock.json b/package-lock.json
index e8c18b2..372b2cd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1117,6 +1117,34 @@
"resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
"integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
},
+ "@emotion/hash": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
+ },
+ "@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "requires": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+ },
+ "@emotion/stylis": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
+ "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+ },
+ "@emotion/unitless": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+ },
"@hapi/address": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
@@ -1342,6 +1370,82 @@
"@types/yargs": "^13.0.0"
}
},
+ "@material-ui/core": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.2.tgz",
+ "integrity": "sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@material-ui/styles": "^4.11.2",
+ "@material-ui/system": "^4.11.2",
+ "@material-ui/types": "^5.1.0",
+ "@material-ui/utils": "^4.11.2",
+ "@types/react-transition-group": "^4.2.0",
+ "clsx": "^1.0.4",
+ "hoist-non-react-statics": "^3.3.2",
+ "popper.js": "1.16.1-lts",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.0 || ^17.0.0",
+ "react-transition-group": "^4.4.0"
+ }
+ },
+ "@material-ui/icons": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz",
+ "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==",
+ "requires": {
+ "@babel/runtime": "^7.4.4"
+ }
+ },
+ "@material-ui/styles": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.2.tgz",
+ "integrity": "sha512-xbItf8zkfD3FuGoD9f2vlcyPf9jTEtj9YTJoNNV+NMWaSAHXgrW6geqRoo/IwBuMjqpwqsZhct13e2nUyU9Ljw==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/hash": "^0.8.0",
+ "@material-ui/types": "^5.1.0",
+ "@material-ui/utils": "^4.11.2",
+ "clsx": "^1.0.4",
+ "csstype": "^2.5.2",
+ "hoist-non-react-statics": "^3.3.2",
+ "jss": "^10.0.3",
+ "jss-plugin-camel-case": "^10.0.3",
+ "jss-plugin-default-unit": "^10.0.3",
+ "jss-plugin-global": "^10.0.3",
+ "jss-plugin-nested": "^10.0.3",
+ "jss-plugin-props-sort": "^10.0.3",
+ "jss-plugin-rule-value-function": "^10.0.3",
+ "jss-plugin-vendor-prefixer": "^10.0.3",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "@material-ui/system": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.2.tgz",
+ "integrity": "sha512-BELFJEel5E+5DMiZb6XXT3peWRn6UixRvBtKwSxqntmD0+zwbbfCij6jtGwwdJhN1qX/aXrKu10zX31GBaeR7A==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@material-ui/utils": "^4.11.2",
+ "csstype": "^2.5.2",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "@material-ui/types": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz",
+ "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A=="
+ },
+ "@material-ui/utils": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz",
+ "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.0 || ^17.0.0"
+ }
+ },
"@mrmlnc/readdir-enhanced": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
@@ -1683,6 +1787,11 @@
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
"integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ=="
},
+ "@types/lodash": {
+ "version": "4.14.168",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz",
+ "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q=="
+ },
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -1725,6 +1834,14 @@
"@types/react": "*"
}
},
+ "@types/react-transition-group": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz",
+ "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/stack-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
@@ -1891,6 +2008,19 @@
}
}
},
+ "@unform/core": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@unform/core/-/core-2.1.3.tgz",
+ "integrity": "sha512-d6xQJWFrLfEyfN7f5t2IdYBLJE/OrvPKILCzGKPSoAmY3+vAnEc4CPE5l6zB+LxWSfMn69QhsqzI20tIRNT7EA==",
+ "requires": {
+ "dot-object": "^2.1.2"
+ }
+ },
+ "@unform/web": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@unform/web/-/web-2.1.3.tgz",
+ "integrity": "sha512-yiY6r3TAinphVxyQ5iKDrKJQkg21oRlYe0WfIoXxs9VKiFPSZ5xb1pz3Kti3kTgOP9BYLVX5ovcCwuVWCrjHYg=="
+ },
"@webassemblyjs/ast": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
@@ -2437,6 +2567,14 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
},
+ "axios": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+ "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "requires": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
"axobject-query": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz",
@@ -2674,6 +2812,22 @@
"resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz",
"integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA=="
},
+ "babel-plugin-styled-components": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz",
+ "integrity": "sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.0.0",
+ "@babel/helper-module-imports": "^7.0.0",
+ "babel-plugin-syntax-jsx": "^6.18.0",
+ "lodash": "^4.17.11"
+ }
+ },
+ "babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+ },
"babel-plugin-syntax-object-rest-spread": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
@@ -3343,6 +3497,11 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
+ "camelize": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
+ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
+ },
"caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -3355,9 +3514,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001081",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz",
- "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ=="
+ "version": "1.0.30001181",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz",
+ "integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ=="
},
"capture-exit": {
"version": "2.0.0",
@@ -3577,6 +3736,11 @@
"shallow-clone": "^0.1.2"
}
},
+ "clsx": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
+ "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -3970,6 +4134,11 @@
"postcss": "^7.0.5"
}
},
+ "css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
+ },
"css-color-names": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
@@ -4060,6 +4229,16 @@
"resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
"integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
},
+ "css-to-react-native": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz",
+ "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==",
+ "requires": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
"css-tree": {
"version": "1.0.0-alpha.37",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
@@ -4076,6 +4255,15 @@
}
}
},
+ "css-vendor": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz",
+ "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==",
+ "requires": {
+ "@babel/runtime": "^7.8.3",
+ "is-in-browser": "^1.0.2"
+ }
+ },
"css-what": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
@@ -4535,6 +4723,22 @@
"utila": "~0.4"
}
},
+ "dom-helpers": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz",
+ "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ },
+ "dependencies": {
+ "csstype": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz",
+ "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw=="
+ }
+ }
+ },
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -4595,6 +4799,22 @@
"tslib": "^1.10.0"
}
},
+ "dot-object": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz",
+ "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==",
+ "requires": {
+ "commander": "^4.0.0",
+ "glob": "^7.1.5"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
+ }
+ }
+ },
"dot-prop": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
@@ -6241,6 +6461,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",
@@ -6251,6 +6484,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",
@@ -6454,6 +6695,11 @@
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
},
+ "hyphenate-style-name": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
+ },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -6537,6 +6783,14 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
+ "indefinite-observable": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz",
+ "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==",
+ "requires": {
+ "symbol-observable": "1.2.0"
+ }
+ },
"indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
@@ -6822,6 +7076,11 @@
"is-extglob": "^2.1.1"
}
},
+ "is-in-browser": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
+ "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -7679,6 +7938,92 @@
"verror": "1.10.0"
}
},
+ "jss": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz",
+ "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "csstype": "^3.0.2",
+ "indefinite-observable": "^2.0.1",
+ "is-in-browser": "^1.1.3",
+ "tiny-warning": "^1.0.2"
+ },
+ "dependencies": {
+ "csstype": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz",
+ "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw=="
+ }
+ }
+ },
+ "jss-plugin-camel-case": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz",
+ "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "hyphenate-style-name": "^1.0.3",
+ "jss": "10.5.0"
+ }
+ },
+ "jss-plugin-default-unit": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz",
+ "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "10.5.0"
+ }
+ },
+ "jss-plugin-global": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz",
+ "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "10.5.0"
+ }
+ },
+ "jss-plugin-nested": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz",
+ "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "10.5.0",
+ "tiny-warning": "^1.0.2"
+ }
+ },
+ "jss-plugin-props-sort": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz",
+ "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "10.5.0"
+ }
+ },
+ "jss-plugin-rule-value-function": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz",
+ "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "10.5.0",
+ "tiny-warning": "^1.0.2"
+ }
+ },
+ "jss-plugin-vendor-prefixer": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz",
+ "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "css-vendor": "^2.0.8",
+ "jss": "10.5.0"
+ }
+ },
"jsx-ast-utils": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
@@ -7856,6 +8201,11 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
+ "lodash-es": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.20.tgz",
+ "integrity": "sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA=="
+ },
"lodash._reinterpolate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
@@ -8153,6 +8503,25 @@
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
},
+ "mini-create-react-context": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz",
+ "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "tiny-warning": "^1.0.3"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
+ "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ }
+ }
+ },
"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",
@@ -8334,6 +8703,11 @@
"integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
"optional": true
},
+ "nanoclone": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
+ "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -9158,6 +9532,11 @@
"ts-pnp": "^1.1.6"
}
},
+ "popper.js": {
+ "version": "1.16.1-lts",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz",
+ "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA=="
+ },
"portfinder": {
"version": "1.0.26",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz",
@@ -10202,6 +10581,11 @@
"react-is": "^16.8.1"
}
},
+ "property-expr": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz",
+ "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg=="
+ },
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@@ -10648,6 +11032,52 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "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",
@@ -10708,6 +11138,27 @@
"workbox-webpack-plugin": "4.3.1"
}
},
+ "react-toastify": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-6.2.0.tgz",
+ "integrity": "sha512-XpjFrcBhQ0/nBOL4syqgP/TywFnOyxmstYLWgSQWcj39qpp+WU4vPt3C/ayIDx7RFyxRWfzWTdR2qOcDGo7G0w==",
+ "requires": {
+ "clsx": "^1.1.1",
+ "prop-types": "^15.7.2",
+ "react-transition-group": "^4.4.1"
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
+ "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
"read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
@@ -11051,6 +11502,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",
@@ -11524,6 +11980,11 @@
}
}
},
+ "shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -12212,6 +12673,23 @@
}
}
},
+ "styled-components": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.2.1.tgz",
+ "integrity": "sha512-sBdgLWrCFTKtmZm/9x7jkIabjFNVzCUeKfoQsM6R3saImkUnjx0QYdLwJHBjY9ifEcmjDamJDVfknWm1yxZPxQ==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/traverse": "^7.4.5",
+ "@emotion/is-prop-valid": "^0.8.8",
+ "@emotion/stylis": "^0.8.4",
+ "@emotion/unitless": "^0.7.4",
+ "babel-plugin-styled-components": ">= 1",
+ "css-to-react-native": "^3.0.0",
+ "hoist-non-react-statics": "^3.0.0",
+ "shallowequal": "^1.1.0",
+ "supports-color": "^5.5.0"
+ }
+ },
"stylehacks": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
@@ -12267,6 +12745,11 @@
"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",
@@ -12518,6 +13001,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",
@@ -12574,6 +13067,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",
@@ -12889,6 +13387,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",
@@ -14029,6 +14532,35 @@
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
+ },
+ "yup": {
+ "version": "0.32.8",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.8.tgz",
+ "integrity": "sha512-SZulv5FIZ9d5H99EN5tRCRPXL0eyoYxWIP1AacCrjC9d4DfP13J1dROdKGfpfRHT3eQB6/ikBl5jG21smAfCkA==",
+ "requires": {
+ "@babel/runtime": "^7.10.5",
+ "@types/lodash": "^4.14.165",
+ "lodash": "^4.17.20",
+ "lodash-es": "^4.17.11",
+ "nanoclone": "^0.2.1",
+ "property-expr": "^2.0.4",
+ "toposort": "^2.0.2"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
+ "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ }
+ }
}
}
}
diff --git a/package.json b/package.json
index 2d4ff44..16d11ec 100644
--- a/package.json
+++ b/package.json
@@ -3,12 +3,21 @@
"version": "0.1.0",
"private": true,
"dependencies": {
+ "@material-ui/core": "^4.11.2",
+ "@material-ui/icons": "^4.11.2",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.5.0",
"@testing-library/user-event": "^7.2.1",
+ "@unform/core": "^2.1.3",
+ "@unform/web": "^2.1.3",
+ "axios": "^0.21.1",
"react": "^16.13.1",
"react-dom": "^16.13.1",
- "react-scripts": "3.4.1"
+ "react-router-dom": "^5.2.0",
+ "react-scripts": "3.4.1",
+ "react-toastify": "^6.2.0",
+ "styled-components": "^5.2.1",
+ "yup": "^0.32.8"
},
"scripts": {
"start": "react-scripts start",
diff --git a/public/index.html b/public/index.html
index aa069f2..1cdb51c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,5 +1,5 @@
-
+
@@ -24,7 +24,11 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
- React App
+
+
+
+
+ I Future
You need to enable JavaScript to run this app.
diff --git a/src/App.css b/src/App.css
deleted file mode 100644
index 74b5e05..0000000
--- a/src/App.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.App {
- text-align: center;
-}
-
-.App-logo {
- height: 40vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/src/App.js b/src/App.js
index ce9cbd2..71e2d5f 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,24 +1,19 @@
-import React from 'react';
-import logo from './logo.svg';
-import './App.css';
+import React from "react";
+import Routes from "./Routes/Routes";
+import GlobalState from "./Global/GlobalState";
+import Tema from "./Tema/Tema";
+import { ToastContainer } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
function App() {
return (
-
-
+
+
+
+
+
+
+
);
}
diff --git a/src/Components/Buttons/index.js b/src/Components/Buttons/index.js
new file mode 100644
index 0000000..d0c15ed
--- /dev/null
+++ b/src/Components/Buttons/index.js
@@ -0,0 +1,17 @@
+import React from "react";
+import { ContainerButton, CampoButton } from "./styles";
+
+export default function Buttons(props) {
+ return (
+
+
+ {props.texto}
+
+
+ );
+}
diff --git a/src/Components/Buttons/styles.js b/src/Components/Buttons/styles.js
new file mode 100644
index 0000000..6073914
--- /dev/null
+++ b/src/Components/Buttons/styles.js
@@ -0,0 +1,17 @@
+import styled from "styled-components";
+import Button from "@material-ui/core/Button";
+
+export const ContainerButton = styled(Button)`
+width: 100%;
+ display: flex;
+ align-items: center;
+ color: #000;
+ font-weight: bold;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ text-transform: normal;
+`;
+
+export const CampoButton = styled.div`
+ text-align: center;
+`;
\ No newline at end of file
diff --git a/src/Components/CardRestaurante/CardRestaurante.js b/src/Components/CardRestaurante/CardRestaurante.js
new file mode 100644
index 0000000..da7f692
--- /dev/null
+++ b/src/Components/CardRestaurante/CardRestaurante.js
@@ -0,0 +1,44 @@
+import React from 'react'
+import CardMedia from '@material-ui/core/CardMedia';
+import useStyles from './styles.js'
+import { useHistory } from "react-router-dom";
+
+export default function CardRestaurante(props) {
+
+ const classes = useStyles();
+ const history = useHistory();
+
+ const onClickCardRestaurante = (id) => {
+ history.push(`/restaurants/${id}`)
+ }
+
+ return (
+
onClickCardRestaurante(props.id)} className={classes.cardContainer}>
+
+
+
+
+
+ {props.nome? props.nome : "Restaurante"}
+
+
+
+ {props.tempoDeEntrega} min
+
+
+ {props.frete? `Frete R$ ${props.frete},00` : "Frete Grátis"}
+
+
+
+
+
+
+ );
+ }
\ No newline at end of file
diff --git a/src/Components/CardRestaurante/styles.js b/src/Components/CardRestaurante/styles.js
new file mode 100644
index 0000000..d22093c
--- /dev/null
+++ b/src/Components/CardRestaurante/styles.js
@@ -0,0 +1,62 @@
+import { makeStyles } from '@material-ui/core/styles';
+
+const useStyles = makeStyles({
+ cardContainer: {
+ height: '12.25rem',
+ padding: '0.5rem 1rem 0',
+ },
+ card: {
+ padding: '0 0 1rem',
+ borderRadius: '8px',
+ border: 'solid 1px #b8b8b8'
+ },
+ imagem : {
+ borderTopLeftRadius: 8,
+ borderTopRightRadius: 8,
+ },
+ cardTextoDiv: {
+ display: "flex",
+ justifyContent: 'space-between',
+ },
+ nomeRestaurante: {
+ height: '1.125rem',
+ margin: '0.75rem 1rem 0.25rem',
+ fontFamily: 'Roboto',
+ fontSize: '1rem',
+ fontWeight: 'normal',
+ fontStretch: 'normal',
+ fontStyle: 'normal',
+ lineHeight: 'normal',
+ letterSpacing: '-0.39px',
+ color:'#e8222e',
+ },
+ tempoDeEntrega: {
+ width: '9.25rem',
+ height: '1.125rem',
+ margin: '0.25rem 0.5rem 0 1rem',
+ fontFamily: 'Roboto',
+ fontSize: '1rem',
+ fontWeight: 'normal',
+ fontStretch: 'normal',
+ fontStyle: 'normal',
+ lineHeight: 'normal',
+ letterSpacing: '-0.39px',
+ color: '#b8b8b8',
+ },
+ taxaDeEntrega: {
+ width: '8.75rem',
+ height: '1.125rem',
+ margin: '0.25rem 1rem 0 0.5rem',
+ fontFamily: 'Roboto',
+ fontSize: '1rem',
+ fontWeight:' normal',
+ fontStretch:' normal',
+ fontStyle: 'normal',
+ lineHeight: 'normal',
+ letterSpacing: '-0.39px',
+ textAlign: 'right',
+ color: '#b8b8b8',
+ }
+ });
+
+ export default useStyles
\ No newline at end of file
diff --git a/src/Components/FeedMenu/FeedMenu.js b/src/Components/FeedMenu/FeedMenu.js
new file mode 100644
index 0000000..afcaf8c
--- /dev/null
+++ b/src/Components/FeedMenu/FeedMenu.js
@@ -0,0 +1,170 @@
+import React, {useState, useContext} from 'react'
+import styled from "styled-components"
+import GlobalStateContext from "../../Global/GlobalStateContext";
+
+const Menu = styled.div`
+ height: 2.625rem;
+ margin: 0.5rem 0.5rem 0;
+ display: flex;
+ align-items: center;
+ overflow: auto;
+ ::-webkit-scrollbar {
+ display: none;
+ }
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+
+ a {
+ margin: 0.75em;
+ color: var(--black);
+ width: 5.438rem;
+ height: 1.125rem;
+ font-family: Roboto;
+ font-size: 1rem;
+ font-weight: 500;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+ text-align: center;
+ }
+
+ .red {
+ color: #e8222e;
+ }
+
+`
+
+export default function FeedMenu() {
+
+ const teste = [
+ {
+ "id": "1",
+ "description": "Habib's é uma rede de restaurantes de comida rápida brasileira especializada em culinária árabe, os restaurantes vendem mais de 600 milhões de esfirras por ano. A empresa emprega 22 mil colaboradores e tem 421 unidades distribuídas em mais de cem municípios em 20 unidades federativas.",
+ "shipping": 6,
+ "address": "Rua das Margaridas, 110 - Jardim das Flores",
+ "name": "Habibs",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/habibs.jpg",
+ "deliveryTime": 60,
+ "category": "Árabe"
+ },
+ {
+ "id": "10",
+ "address": "Travessa Reginaldo Pereira, 130 - Ibitinga",
+ "name": "Tadashii",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/tadashii.png",
+ "deliveryTime": 50,
+ "category": "Asiática",
+ "description": "Restaurante sofisticado busca o equilíbrio entre ingredientes que realçam a experiência da culinária japonesa.",
+ "shipping": 13
+ },
+ {
+ "id": "2",
+ "description": "McDonald's Corporation é a maior cadeia mundial de restaurantes de fast food de hambúrguer, servindo cerca de 68 milhões de clientes por dia em 119 países através de 37 mil pontos de venda.",
+ "shipping": 19,
+ "address": "Avenida dos Papagaios, 1350 - Sta. Efigênia",
+ "name": "McDonalds",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/mcdonalds.png",
+ "deliveryTime": 15,
+ "category": "Hamburguer"
+ },
+ {
+ "id": "3",
+ "deliveryTime": 20,
+ "category": "Italiana",
+ "description": "Restaurante Self Service e lanchonete localizado no Laboratório Nacional de Computação Científica",
+ "shipping": 2,
+ "address": "Rua Barão do Rio Branco, 98 - Centro",
+ "name": "Cantina Mamma Perrotta",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/cantinamammaperrotta.jpg"
+ },
+ {
+ "id": "4",
+ "name": "Sorveteria Bacio di Latte",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/baciodilatte.png",
+ "deliveryTime": 45,
+ "category": "Sorvetes",
+ "description": "Gelatos de raízes italianas feitos artesanalmente e com ingredientes de altíssima qualidade. Confira todos os nossos deliciosos sabores!",
+ "shipping": 10,
+ "address": "Travessa Junqueira de Melo, 315 - Marginal"
+ },
+ {
+ "id": "5",
+ "deliveryTime": 20,
+ "category": "Carnes",
+ "description": "Inaugurado em 1988 nos Estados Unidos e chegou ao Brasil 9 anos depois. Hoje, o restaurante marca presença em 20 cidades em todo o país, com um estilo casual que vai fazer você se sentir no Outback Australiano",
+ "shipping": 18,
+ "address": "Alameda dos Marsupiais, 505 - Humaitá",
+ "name": "Outback Steakhouse",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/outback.png"
+ },
+ {
+ "id": "6",
+ "description": "Culinária baiana, como caldinho de sururu e acarajé, empório nordestino e bar com 400 rótulos de cachaça.",
+ "shipping": 4,
+ "address": "Rua Dorival Caymmi, 149 - Alto dos Ibirás",
+ "name": "Sotero Cozinha Original",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/sotero.jpg",
+ "deliveryTime": 40,
+ "category": "Baiana"
+ },
+ {
+ "id": "7",
+ "name": "Boteco de Portal",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/botecodeportal.jpg",
+ "deliveryTime": 20,
+ "category": "Petiscos",
+ "description": "O bar tem um cardápio recheado de petiscos que acompanham o chope para o bate-papo num ambiente agradável.Amigos e amigas, temos o prazer de convidar vocês para conhecer nosso espaço!",
+ "shipping": 18,
+ "address": "Avenida das Andorinhas, 333 - Sta. Efigênia"
+ },
+ {
+ "id": "8",
+ "name": "Chun-Li",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/chun-li.jpg",
+ "deliveryTime": 30,
+ "category": "Asiática",
+ "description": "Restaurante chinês com pratos típicos em diversos tamanhos, bebidas, ambiente moderno e opções para levar.",
+ "shipping": 17,
+ "address": "Rua Visconde de Mauá, 990 - Centro"
+ },
+ {
+ "id": "9",
+ "name": "Mexicaníssimo",
+ "logoUrl": "http://soter.ninja/futureFoods/logos/mexicanissimo.png",
+ "deliveryTime": 20,
+ "category": "Mexicana",
+ "description": "Falar em Mexicaníssimo é falar em comer uma comida tradicional e original mexicana! Diferentemente dos restaurantes tex-mex, aqui você encontra um menu completo tradicionalmente mexicano e com opções para vegetarianos e veganos.",
+ "shipping": 3,
+ "address": "Largo dos Jaguarés, 12 - Nova Bragança"
+ }
+ ]
+
+ const {states, setters} = useContext(GlobalStateContext)
+
+ const changeCategory = (value) => {
+ if (states.filter !== value) {
+ setters.setFilter(value)
+ } else if (states.filter === value) {
+ setters.setFilter("")
+ }
+ }
+
+ const [categoriesArray, setCategoriesArray] = useState([])
+
+ teste.map(e=> {
+ const position = categoriesArray.findIndex((item) => item === e.category)
+
+ if (position === -1) {
+ setCategoriesArray([...categoriesArray, e.category])
+ }
+ })
+
+ return (
+
+ {categoriesArray.map(e => {
+ return changeCategory(e)}>{e}
+ })}
+
+ )
+}
diff --git a/src/Components/FooterMenu/index.js b/src/Components/FooterMenu/index.js
new file mode 100644
index 0000000..440454f
--- /dev/null
+++ b/src/Components/FooterMenu/index.js
@@ -0,0 +1,60 @@
+import React, { useState, useEffect } from 'react'
+import { useHistory } from 'react-router-dom'
+import { goToCartPage, goToHomePage, goToProfilePage } from '../../Routes/coordinators'
+import { ReactComponent as AvatarIcon} from "../../assets/footerMenuIcons/avatar.svg";
+import { ReactComponent as HomeIcon } from "../../assets/footerMenuIcons/homepage.svg";
+import { ReactComponent as CartIcon } from "../../assets/footerMenuIcons/shopping-cart.svg";
+import { FooterContainer } from './styles';
+
+export default function FooterMenu(props) {
+ const history = useHistory()
+ const [fill, setFill] = useState({
+ home: "#B8B8B8",
+ cart: "#B8B8B8" ,
+ avatar: "#B8B8B8"
+ })
+
+ useEffect(() => {
+ if( props.page === "home") {
+ setFill({home: "#E8222E", cart: "#B8B8B8" , avatar: "#B8B8B8"})
+ } else if (props.page === "cart") {
+ setFill({home: "#B8B8B8", cart: "#E8222E" , avatar: "#B8B8B8"})
+ } else if (props.page === "profile") {
+ setFill({home: "#B8B8B8", cart: "#B8B8B8" , avatar: "#E8222E"})
+ }
+
+ },[] )
+
+
+
+ const selectHomeIcon = () => {
+ setFill({home: "#E8222E", cart: "#B8B8B8" , avatar: "#B8B8B8"})
+ goToHomePage(history)
+ }
+
+ const selectCartIcon = () => {
+ setFill({home: "#B8B8B8", cart: "#E8222E" , avatar: "#B8B8B8"})
+ goToCartPage(history)
+ }
+
+ const selectAvatarIcon = () => {
+ setFill({home: "#B8B8B8", cart: "#B8B8B8" , avatar: "#E8222E"})
+ goToProfilePage(history)
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/Components/FooterMenu/styles.js b/src/Components/FooterMenu/styles.js
new file mode 100644
index 0000000..3057916
--- /dev/null
+++ b/src/Components/FooterMenu/styles.js
@@ -0,0 +1,17 @@
+import styled from "styled-components";
+
+export const FooterContainer = styled.div `
+ position: fixed;
+ bottom: 0;
+ display: flex;
+ width: 100vw;
+ justify-content: space-evenly;
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25);
+button {
+ flex-grow: 1;
+ padding: 0;
+ height: 3rem;
+ border: none;
+ background-color: white;
+}
+`
\ No newline at end of file
diff --git a/src/Components/FormAdress/index.js b/src/Components/FormAdress/index.js
new file mode 100644
index 0000000..f14cc35
--- /dev/null
+++ b/src/Components/FormAdress/index.js
@@ -0,0 +1,122 @@
+import React from "react";
+import Buttons from "../Buttons";
+import { Container, CampoText, InputArea, ContainerFormAddress } from './styles';
+import { Title } from './styles';
+import useForm from '../../CustomHooks/useForm'
+import { useHistory } from "react-router-dom";
+import { addAddress } from "../../Service/user";
+import { CircularProgress } from "@material-ui/core";
+
+
+export default function FormAdress(props) {
+ const [loading, setLoading] = React.useState(false)
+ const [form, handleInput, resetState] = useForm({
+ street:'',
+ number:'',
+ neighbourhood:'',
+ city: '',
+ state:'',
+ complement:''
+ })
+ const history = useHistory();
+
+ const submitForm = (e) => {
+ e.preventDefault()
+ resetState() //resetando os inputs//
+ addAddress(form, history, setLoading)//função está em service/user
+ }
+
+ return (
+
+ {props.texto}
+
+
+ );
+}
diff --git a/src/Components/FormAdress/styles.js b/src/Components/FormAdress/styles.js
new file mode 100644
index 0000000..266d28c
--- /dev/null
+++ b/src/Components/FormAdress/styles.js
@@ -0,0 +1,31 @@
+import styled from 'styled-components';
+import TextField from "@material-ui/core/TextField";
+
+
+export const ContainerFormAddress = styled.div`
+ margin: 1rem;
+`
+
+export const Title = styled.h1`
+ font-family: Roboto;
+ text-align: center;
+ font-size: 1rem;
+ /* font-weight: normal; */
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+`
+
+export const Container = styled.div`
+
+`
+
+export const CampoText = styled.div`
+ margin: 1rem 0;
+`
+
+export const InputArea = styled(TextField)`
+ width: 100%;
+ height:3.5rem;
+`
diff --git a/src/Components/FormLogin/index.js b/src/Components/FormLogin/index.js
new file mode 100644
index 0000000..6286e9e
--- /dev/null
+++ b/src/Components/FormLogin/index.js
@@ -0,0 +1,204 @@
+import React, { useState, useRef, useContext } from "react";
+import * as Yup from "yup";
+import { makeStyles } from "@material-ui/core/styles";
+import { Grid, InputAdornment, IconButton, Link } from "@material-ui/core";
+import { Visibility, VisibilityOff } from "@material-ui/icons";
+import { Form } from "@unform/web";
+import api from "../../Service/api";
+import { goToHomePage, goToSignUpPage } from "../../Routes/coordinators";
+import { useHistory } from "react-router-dom";
+import { CampoText, InputArea, ContainerButton, CampoButton } from "./styles";
+import { Title } from "./styles";
+import useForm from "../../CustomHooks/useForm";
+import Logo from "../../assets/logo-future-eats-invert.svg";
+import { toast } from "react-toastify";
+import GlobalStateContext from "../../Global/GlobalStateContext";
+
+const useStyles = makeStyles({
+ root: {
+ height: "100vh",
+ },
+ main: {
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ flexDirection: "column",
+ margin: "1rem",
+ padding: "1rem",
+ },
+ btCadastro: {
+ display: "flex",
+ justifyContent: "center",
+ textTransform: "initial",
+ fontSize: "1rem",
+ },
+ form: {
+ width: "100%",
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ },
+});
+const FormLogin = () => {
+ const classes = useStyles();
+ const history = useHistory();
+ const { setters } = useContext(GlobalStateContext);
+ const formRef = useRef(null);
+ const [showSenha, setShowSenha] = useState(false);
+ const [form, handleInput, resetState, handleFormErrors] = useForm({
+ email: undefined,
+ password: undefined,
+ errors: {
+ email: null,
+ password: null,
+ },
+ });
+
+ const getValidationErrors = (err) => {
+ const validationErrors = {};
+
+ err.inner.forEach((error) => {
+ validationErrors[error.path] = error.message;
+ });
+
+ return validationErrors;
+ };
+
+ const submitForm = async () => {
+ try {
+ handleFormErrors({});
+ const schema = Yup.object().shape({
+ email: Yup.string()
+ .email("Precisamos de um email válido.")
+ .required("O e-mail é obrigatório."),
+ password: Yup.string()
+ .min(6, "Mínimo de 6 dígitos.")
+ .required("A senha é obrigatória."),
+ });
+
+ await schema.validate(form, {
+ abortEarly: false,
+ });
+
+ const response = await api.post("/login", form);
+
+ window.localStorage.setItem("token", response.data.token);
+ setters.setPerfil(response.data.user);
+
+ goToHomePage(history);
+ } catch (err) {
+ if (err.inner) {
+ const errors = getValidationErrors(err);
+ handleFormErrors(errors);
+ return;
+ }
+ if (err.response) {
+ if (err.response.data.message === "Usuário não encontrado") {
+ toast.error("Usuário não cadastrado");
+
+ goToSignUpPage(history);
+ }
+ if (err.response.data.message === "Senha incorreta") {
+ toast.error("Senha incorreta");
+ }
+ return;
+ }
+
+ throw err;
+ }
+ };
+
+ const handleClickShowPassword = () => {
+ setShowSenha(!showSenha);
+ };
+
+ const handleMouseDownPassword = (event) => {
+ event.preventDefault();
+ };
+
+ return (
+
+
+
+
+
+ Entrar
+
+
+
+ );
+};
+
+export default FormLogin;
diff --git a/src/Components/FormLogin/styles.js b/src/Components/FormLogin/styles.js
new file mode 100644
index 0000000..090fc60
--- /dev/null
+++ b/src/Components/FormLogin/styles.js
@@ -0,0 +1,37 @@
+import styled from "styled-components";
+import TextField from "@material-ui/core/TextField";
+import Button from "@material-ui/core/Button";
+
+export const Title = styled.h1`
+ text-align: center;
+ font-size: 1rem;
+ /* font-weight: normal; */
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+`;
+
+export const CampoText = styled.div`
+ margin: 1rem 0;
+`;
+
+export const InputArea = styled(TextField)`
+ height: 3.5rem;
+`;
+
+export const ContainerButton = styled(Button)`
+ width: 100%;
+ display: flex;
+ align-items: center;
+ color: #000;
+ font-weight: bold;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ text-transform: capitalize;
+`;
+
+export const CampoButton = styled.div`
+ text-align: center;
+ margin: 1rem 0;
+`;
diff --git a/src/Components/Header/index.js b/src/Components/Header/index.js
new file mode 100644
index 0000000..1d1b7f4
--- /dev/null
+++ b/src/Components/Header/index.js
@@ -0,0 +1,24 @@
+import React from 'react'
+import { useHistory } from 'react-router-dom'
+import { goBack } from '../../Routes/coordinators'
+import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';
+import { HeaderContainer , BackButton } from './styles';
+
+
+
+export default function Header(props) {
+ const history = useHistory()
+
+
+ return (
+
+
+ {/* para nomear a sua página use a prop >>> pageName='nome da sua página' */}
+ {props.pageName}
+
+ {/* o estado inicial para mostrar o botão é true, caso sua tela não precise,
+ use a prop button com o valor "false" (string)*/}
+ {props.button === "false" ? null :
goBack(history)}> }
+
+ )
+}
diff --git a/src/Components/Header/styles.js b/src/Components/Header/styles.js
new file mode 100644
index 0000000..f76bfc7
--- /dev/null
+++ b/src/Components/Header/styles.js
@@ -0,0 +1,24 @@
+import styled from 'styled-components'
+
+export const HeaderContainer = styled.div `
+ display: flex;
+ justify-content: space-between;
+ box-shadow: 0 0.5px 0 0 rgba(0, 0, 0, 0.25);
+ height: 2.75rem;
+h3{
+ flex-grow: 1;
+ text-align: center;
+ align-self: center;
+ font-size: 1rem;
+ font-weight: 500;
+ letter-spacing: -0.39px;
+}
+`
+
+export const BackButton = styled.button `
+ position: absolute;
+ margin-top: -35px;
+ margin-left: 1rem;
+ border: none;
+ background: none;
+`
\ No newline at end of file
diff --git a/src/Components/InitialScreen/index.js b/src/Components/InitialScreen/index.js
new file mode 100644
index 0000000..395bb64
--- /dev/null
+++ b/src/Components/InitialScreen/index.js
@@ -0,0 +1,27 @@
+import React from "react";
+import { Grid } from "@material-ui/core";
+import Logo from "../../assets/logo-future-eats@2x.png";
+import { makeStyles } from "@material-ui/core/styles";
+
+const useStyles = makeStyles({
+ root: {
+ height: "100vh",
+ background: "#e8222e",
+ },
+});
+
+export default function InitialScreen() {
+ const classes = useStyles();
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/Components/InitialScreen/style.js b/src/Components/InitialScreen/style.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/Components/ItemCard/ItemCard.js b/src/Components/ItemCard/ItemCard.js
new file mode 100644
index 0000000..27df59b
--- /dev/null
+++ b/src/Components/ItemCard/ItemCard.js
@@ -0,0 +1,56 @@
+import React, { useState, useContext } from 'react'
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import {
+ CardContainer,
+ InfoContainer,
+ HeaderContainer,
+ FooterContainer,
+ RemoveBtn,
+ AddBtn,
+} from './styles'
+
+export default function ItemCard(props) {
+ const {states, setters} = useContext(GlobalStateContext)
+
+ const addCarrinho = () => {
+ setters.setIdPedido(props.idPedido)
+ setters.setPopUp(true)
+ }
+
+ const removerCarrinho = () => {
+ const novoPedido = states.carrinho.pedido.filter(item => {
+ return item.id !== props.idPedido
+ })
+ if(!novoPedido[0]) {
+ setters.setCarrinho({})
+ return null
+ }
+ setters.setCarrinho({"restaurante": states.restaurante, "pedido": novoPedido})
+ }
+
+ const renderQuantidade = states.carrinho.pedido ? states.carrinho.pedido.filter(item => {
+ if (item.id === props.idPedido) {
+ return item.quantidade
+ }}) : 0
+
+
+ /* todas tags devem ser preenchidas por props quando for adicionar a lógica */
+ return (
+
+
+
+
+ {props.name}
+ {renderQuantidade[0] ? {renderQuantidade[0].quantidade} : null}
+
+ {props.ingredientes}
+
+ R${props.valor}
+ {renderQuantidade[0] ?
+ removerCarrinho()}>remover
+ : addCarrinho()}>adicionar }
+
+
+
+ )
+}
diff --git a/src/Components/ItemCard/styles.js b/src/Components/ItemCard/styles.js
new file mode 100644
index 0000000..5f29342
--- /dev/null
+++ b/src/Components/ItemCard/styles.js
@@ -0,0 +1,98 @@
+import styled from "styled-components";
+
+export const CardContainer = styled.div `
+ display: flex;
+ border-radius: 8px;
+ border: solid 1px #b8b8b8;
+ height: 7rem;
+ margin-bottom: 0.5rem;
+img {
+ width: 6rem;
+ height: calc(7rem + 2px);
+ margin-top: -1px;
+ margin-right: 1rem;
+ margin-bottom:-1px;
+ margin-left:-1px;
+ border-radius: 8px 0 0 8px;
+ object-fit: cover;
+}
+`
+
+export const InfoContainer = styled.div `
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+p {
+ margin: 0;
+ height: 1.875rem;
+ font-size: 0.75rem;
+ letter-spacing: -0.29px;
+ color: #b8b8b8;
+}
+`
+
+export const HeaderContainer = styled.div `
+ display: flex;
+ justify-content: space-between;
+ height: 2.75rem;
+h3 {
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ color: #e8222e;
+ font-weight: 500;
+}
+button {
+ height: 2rem;
+ width: 2rem;
+ border: none;
+ background: none;
+ border-radius: 0 8px 0 8px;
+ border: solid 1px #e8222e;
+ color: #e8222e;
+ font-weight: 500;
+ font-size: 1rem;
+ margin-top: -1px;
+ margin-right: -1px;
+}
+`
+
+export const FooterContainer = styled.div `
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+ height: 2.375rem;
+
+span {
+ letter-spacing: -0.39px;
+ font-size: 1rem;
+ font-weight: 500;
+ margin-bottom: 1rem;
+}
+`
+
+export const AddBtn = styled.button `
+ height: 2rem;
+ width: 5.625rem;
+ border: none;
+ background: none;
+ border-radius: 8px 0 8px 0;
+ border: solid 1px black;
+ font-weight: 500;
+ font-size: 0.75rem;
+ margin-right: -1px;
+ margin-bottom: -1px;
+`
+
+export const RemoveBtn = styled.button `
+ height: 2rem;
+ width: 5.625rem;
+ border: none;
+ background: none;
+ border-radius: 8px 0 8px 0;
+ border: solid 1px #e8222e;
+ color: #e8222e;
+ font-weight: 500;
+ font-size: 0.75rem;
+ margin-right: -1px;
+ margin-bottom: -1px;
+`
diff --git a/src/Components/Loading/index.js b/src/Components/Loading/index.js
new file mode 100644
index 0000000..5d1215d
--- /dev/null
+++ b/src/Components/Loading/index.js
@@ -0,0 +1,28 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+const useStyles = makeStyles((theme) => ({
+ root: {
+ display: 'flex',
+ width: '100vw',
+ height: '90vh',
+ alignItems: 'center',
+ display: 'flex',
+ justifyContent: 'center',
+ '& > * + *': {
+ marginLeft: theme.spacing(2),
+ },
+ },
+}));
+
+export default function Loading() {
+
+ const classes = useStyles();
+
+ return (
+
+
+
+ )
+}
diff --git a/src/Components/PedidoEmAndamento/index.js b/src/Components/PedidoEmAndamento/index.js
new file mode 100644
index 0000000..64136a1
--- /dev/null
+++ b/src/Components/PedidoEmAndamento/index.js
@@ -0,0 +1,18 @@
+import React from 'react'
+import AccessTimeIcon from '@material-ui/icons/AccessTime';
+import Rectangle from "./style.js"
+
+export default function index(props) {
+ return (
+
+
+
+
Pedido em Andamento
+
{props.restaurante}
+
SUBTOTAL R$ {props.valor}
+
+
+ )
+}
diff --git a/src/Components/PedidoEmAndamento/style.js b/src/Components/PedidoEmAndamento/style.js
new file mode 100644
index 0000000..dc03c0b
--- /dev/null
+++ b/src/Components/PedidoEmAndamento/style.js
@@ -0,0 +1,66 @@
+import styled from "styled-components"
+
+
+const Rectangle = styled.div `
+ width: 100vw;
+ height: 7.375rem;
+ background-color: #e8222e;
+ position: fixed;
+ bottom: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .clock {
+ width: 2rem;
+ height: 2rem;
+ color: white;
+ }
+
+ .infoDiv {
+ width: 17rem;
+ }
+
+ .whiteP {
+ width: 16rem;
+ height: 1.125rem;
+ margin: 0 0 0.125rem 1.5rem;
+ font-family: Montserrat;
+ font-size: 1rem;
+ font-weight: normal;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+ color: #ffffff;
+ }
+
+ .nomeRestaurante {
+ width: 16rem;
+ height: 1.125rem;
+ margin: 0.5rem 0 0.5rem 1.5rem;
+ font-family: Montserrat;
+ font-size: 1rem;
+ font-weight: normal;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+ color: var(--black);
+ }
+
+ .subtotal {
+ width: 16rem;
+ height: 1.125rem;
+ margin: 0.5rem 0 0 1.5rem;
+ font-family: Montserrat;
+ font-size: 1rem;
+ font-weight: bold;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+ color: var(--black);
+ }
+`
+export default Rectangle;
diff --git a/src/Components/PopUpQuantidade/index.js b/src/Components/PopUpQuantidade/index.js
new file mode 100644
index 0000000..dd6a297
--- /dev/null
+++ b/src/Components/PopUpQuantidade/index.js
@@ -0,0 +1,70 @@
+import React, {useContext} from 'react'
+import { PopUpContainer, PopUpCard, ButtonContainer } from './styles'
+import GlobalStateContext from "../../Global/GlobalStateContext";
+
+
+export default function PopUpQuantidade() {
+ const {states, setters} = useContext(GlobalStateContext)
+
+
+ let quantity = []
+ for (let i = 0; i < 11; i++) {
+ quantity.push(i)
+ }
+
+ const renderOptions = quantity.map((item) => {
+ return (
+
+ {item}
+
+ )
+ })
+
+
+ const handleSelect = (event) => {
+ setters.setQuantidade(event.target.value)
+ }
+
+ const addQuantidade = () => {
+ setters.setPopUp(false)
+
+
+ if (states.quantidade <= 0 || states.restaurante === {}) {
+ return null
+ }
+
+ const pedido = states.restaurante.products.filter(item => {
+
+ if ( item.id === states.idPedido) {
+ item.quantidade = states.quantidade
+ return item
+ }
+
+ })
+
+ if (!states.carrinho.pedido) {
+ setters.setCarrinho({"restaurante": states.restaurante, "pedido": pedido})
+ } else if (states.restaurante === states.carrinho.restaurante) {
+
+ setters.setCarrinho({"restaurante": states.restaurante, "pedido": [...pedido,...states.carrinho.pedido]})
+ } else if (states.restaurante !== states.carrinho.restaurante) {
+ alert("Você tem itens de outro restaurante no Carrinho. \n Termine seu pedido ou exclua os itens antes de continuar")
+ }
+
+ setters.setQuantidade(0)
+ }
+
+ return (
+
+
+ Selecione a quantidade desejada
+ handleSelect(event)}>
+ {renderOptions}
+
+
+ addQuantidade()}>ADICIONAR AO CARRINHO
+
+
+
+ )
+}
diff --git a/src/Components/PopUpQuantidade/styles.js b/src/Components/PopUpQuantidade/styles.js
new file mode 100644
index 0000000..d57306a
--- /dev/null
+++ b/src/Components/PopUpQuantidade/styles.js
@@ -0,0 +1,51 @@
+import styled from "styled-components";
+
+export const PopUpContainer = styled.div `
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 0;
+ position: fixed;
+ width: 100vw;
+ height: 100vh;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 10;
+`
+
+export const PopUpCard = styled.div `
+ width: calc(100% - 2rem);
+ height: 13.5rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin: 0 1rem;
+ background-color: #ffffff;
+p {
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ margin-bottom: 2rem;
+}
+select {
+ border: solid 1px #b8b8b8;
+ border-radius: 4px;
+ width: calc(100% - 2rem);
+ height: 3.5rem;
+ font-size: 1rem;
+ margin-bottom: 1.75rem;
+}
+`
+export const ButtonContainer = styled.div `
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+button {
+ padding: 6px 0;
+ margin-right: 1rem;
+ border: none;
+ background: none;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ color: #4f81a8;
+}
+`
\ No newline at end of file
diff --git a/src/Components/SearchBar/SearchBar.js b/src/Components/SearchBar/SearchBar.js
new file mode 100644
index 0000000..b4a421e
--- /dev/null
+++ b/src/Components/SearchBar/SearchBar.js
@@ -0,0 +1,32 @@
+import React,{useContext} from 'react'
+import { useHistory } from "react-router-dom";
+import useStyles from './styles'
+import {Search} from "@material-ui/icons"
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import {goToSearchPage} from "../../Routes/coordinators";
+
+export default function SearchBar(props) {
+
+ const history = useHistory();
+ const {states, setters} = useContext(GlobalStateContext)
+ const classes = useStyles();
+
+ const onChangeInput = (event) => {
+ setters.setSearchInput(event.target.value)
+ }
+
+ return (
+
+
+
+ goToSearchPage(history)}
+ value={states.searchInput}
+ className={classes.input}
+ placeholder={"Restaurantes"}
+ onChange={onChangeInput}
+ />
+
+
+ )
+}
diff --git a/src/Components/SearchBar/styles.js b/src/Components/SearchBar/styles.js
new file mode 100644
index 0000000..ecec251
--- /dev/null
+++ b/src/Components/SearchBar/styles.js
@@ -0,0 +1,28 @@
+import { makeStyles } from '@material-ui/core/styles';
+
+const useStyles = makeStyles({
+ textField: {
+ height: '3.5rem',
+ borderRadius: '2px',
+ border: 'solid 1px #b8b8b8',
+ display: 'flex',
+ alignItems:' center',
+ padding: '0 0.503rem 0 1.063rem',
+ margin: '0.5em 16px',
+ },
+ input: {
+ border: 'none',
+ fontFamily:'Roboto',
+ height: '3em',
+ width: '18em',
+ fontSize: '1em',
+ "&:focus": {
+ outline: 'none',
+ }
+ },
+ searchIcon: {
+ color: "#b8b8b8"
+ }
+})
+
+export default useStyles
\ No newline at end of file
diff --git a/src/Constants/urls.js b/src/Constants/urls.js
new file mode 100644
index 0000000..6fa2114
--- /dev/null
+++ b/src/Constants/urls.js
@@ -0,0 +1 @@
+export const BASE_URL = 'https://us-central1-missao-newton.cloudfunctions.net/fourFoodA'
\ No newline at end of file
diff --git a/src/CustomHooks/useForm.js b/src/CustomHooks/useForm.js
new file mode 100644
index 0000000..11f6df5
--- /dev/null
+++ b/src/CustomHooks/useForm.js
@@ -0,0 +1,22 @@
+import { useState } from "react";
+
+const useForm = (initialState) => {
+ const [form, setForm] = useState(initialState);
+
+ const handleInputChange = (event) => {
+ const { value, name } = event.target;
+ setForm({ ...form, [name]: value });
+ };
+
+ const resetState = () => {
+ setForm(initialState);
+ };
+
+ const handleFormErrors = (errors) => {
+ setForm({ ...form, errors });
+ };
+
+ return [form, handleInputChange, resetState, handleFormErrors];
+};
+
+export default useForm;
diff --git a/src/CustomHooks/useProtectedPage.js b/src/CustomHooks/useProtectedPage.js
new file mode 100644
index 0000000..6b45c27
--- /dev/null
+++ b/src/CustomHooks/useProtectedPage.js
@@ -0,0 +1,16 @@
+import { useEffect } from "react";
+import { useHistory } from "react-router-dom";
+
+const useProtectedPage = () => {
+ const history = useHistory();
+
+//Assim que a pagina abre realiza a verificação
+ useEffect(() => {
+ const token = localStorage.getItem("token");
+ if (!token) {
+ history.push("/"); //Caso não esteja autorizado retorna a LoginPage
+ }
+ }, [history]);
+};
+
+export default useProtectedPage;
\ No newline at end of file
diff --git a/src/CustomHooks/useRequestData.js b/src/CustomHooks/useRequestData.js
new file mode 100644
index 0000000..66ab141
--- /dev/null
+++ b/src/CustomHooks/useRequestData.js
@@ -0,0 +1,17 @@
+import React from 'react'
+import {useEffect, useState} from "react"
+import axios from 'axios'
+
+export default function useRequestData(url, initialState) {
+ const [data, setData] = useState(initialState)
+ const header = {headers: {"auth": localStorage.getItem('token')}}
+ useEffect(()=> {
+ axios.get(url,header).then((response) => {
+ setData(response.data)
+ }).catch((error) => {
+ console.log(error.message)
+ })
+ }, [url])
+
+ return data
+}
diff --git a/src/Global/GlobalState.js b/src/Global/GlobalState.js
new file mode 100644
index 0000000..937a7ac
--- /dev/null
+++ b/src/Global/GlobalState.js
@@ -0,0 +1,35 @@
+import React from 'react'
+import GlobalStateContext from "../Global/GlobalStateContext";
+import axios from "axios";
+import useRequestData from '../CustomHooks/useRequestData'
+import {useState, useEffect} from 'react'
+import {BASE_URL} from '../Constants/urls.js'
+
+export default function GlobalState(props) {
+
+ const [carrinho, setCarrinho] = useState({})
+ const [perfil, setPerfil] = useState({})
+ const [restaurante, setRestaurante] = useState({})
+ const [listaRestaurantes, setListaRestaurantes] = useState([])
+ // const [token, setToken] = useState("")
+ const [searchInput, setSearchInput] = useState("") /* Controla input da barra de pesquisa */
+ const [filter, setFilter] = useState("") /* Controla o filtro do menu do feed */
+ const [popUp, setPopUp] = useState(false)
+ const [quantidade, setQuantidade] = useState(0)
+ const [idPedido, setIdPedido] = useState("")
+
+
+ const states = {carrinho, perfil, restaurante, listaRestaurantes, searchInput, filter, popUp, quantidade, idPedido}
+ const setters = {setCarrinho, setPerfil, setRestaurante, setListaRestaurantes, setSearchInput, setFilter, setPopUp, setQuantidade, setIdPedido}
+ const requests = {}
+
+ return (
+
+ {props.children}
+
+ )
+}
+
+
+
+
diff --git a/src/Global/GlobalStateContext.js b/src/Global/GlobalStateContext.js
new file mode 100644
index 0000000..b5406b8
--- /dev/null
+++ b/src/Global/GlobalStateContext.js
@@ -0,0 +1,5 @@
+import React from "react";
+
+const GlobalStateContext = React.createContext()
+
+export default GlobalStateContext;
\ No newline at end of file
diff --git a/src/Pages/AddAddressPage/index.js b/src/Pages/AddAddressPage/index.js
new file mode 100644
index 0000000..acc383c
--- /dev/null
+++ b/src/Pages/AddAddressPage/index.js
@@ -0,0 +1,16 @@
+import React from 'react'
+import { useHistory } from "react-router-dom";
+import FormAdress from '../../Components/FormAdress';
+import Header from '../../Components/Header';
+
+
+export default function AddAddressPage() {
+
+ return (
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/Pages/AddAddressPage/styles.js b/src/Pages/AddAddressPage/styles.js
new file mode 100644
index 0000000..6450ccd
--- /dev/null
+++ b/src/Pages/AddAddressPage/styles.js
@@ -0,0 +1,2 @@
+// import styled from 'styled-components'
+
diff --git a/src/Pages/CartPage/index.js b/src/Pages/CartPage/index.js
new file mode 100644
index 0000000..682ce90
--- /dev/null
+++ b/src/Pages/CartPage/index.js
@@ -0,0 +1,143 @@
+import React, { useContext, useState } from 'react'
+import { useHistory } from "react-router-dom";
+import Header from '../../Components/Header';
+import { goBack, goToHomePage, goToProfilePage, goToRestaurantsPage } from '../../Routes/coordinators';
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import Buttons from '../../Components/Buttons';
+import PopUpQuantidade from "../../Components/PopUpQuantidade";
+import {
+ ContainerCarrinho,
+ ContainerEndereco ,
+ MensagemVazio ,
+ SubtotalContainer ,
+ StyledForm ,
+ CartPageContainer,
+ ContainerRestaurante,
+ ScrollSection
+} from './styles';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Radio from '@material-ui/core/Radio';
+import RadioGroup from '@material-ui/core/RadioGroup';
+import FooterMenu from '../../Components/FooterMenu';
+import ItemCard from '../../Components/ItemCard/ItemCard';
+import useRequestData from '../../CustomHooks/useRequestData';
+import { BASE_URL } from '../../Constants/urls';
+import { order } from '../../Service/user'
+import useProtectPage from '../../CustomHooks/useProtectedPage'
+
+export default function CartPage() {
+ useProtectPage()
+ const history = useHistory();
+ const {states, setters} = useContext(GlobalStateContext)
+
+
+ const [loading, setLoading] = React.useState(false)
+ const [value, setValue] = useState('dinheiro');
+
+ const handleChange = (event) => {
+ setValue(event.target.value);
+ }
+
+ const pedidos = states.carrinho.pedido ? states.carrinho.pedido : null
+
+ const frete = states.carrinho.restaurante ? Number(states.carrinho.restaurante.shipping) : 0
+
+ const subtotal = pedidos? frete + pedidos.reduce((resultado, item) => {
+ return (item.quantidade * item.price) + resultado;
+ }, 0): 0
+
+ const endereco = useRequestData(`${BASE_URL}/profile/address`, {})//pegando endereco na API
+
+ console.log(pedidos);
+
+ let body = {}
+ if (pedidos) {
+ body = {
+ "products": pedidos.map((item) => {
+ return { "id": item.id, "quantity": item.quantidade }
+ }
+ ),
+ "paymentMethod": "creditcard"
+ }
+
+ }
+ console.log(body);
+
+
+ let idRestaurante = ""
+ if(states.carrinho.restaurante !== undefined){
+ idRestaurante = states.carrinho.restaurante.id
+ console.log(idRestaurante);
+ }
+
+ const submitOrder = (e) => {
+ e.preventDefault()
+ order(body, history, setLoading, idRestaurante, setters.setCarrinho)//função está no service/user
+ }
+
+
+ return (
+
+ {states.popUp ? : null}
+
+
+
+ Endereço de entrega
+ {endereco.address?endereco.address.street:null}, {endereco.address?endereco.address.number:null}
+
+
+ {states.carrinho.restaurante === undefined ?
+ Carrinho vazio
+ :
+
+
+ {/* {console.log(states.carrinho)} */}
+ {states.carrinho.restaurante.name}
+ {states.carrinho.restaurante.address}
+ {states.carrinho.restaurante.deliveryTime} min
+
+
+
+
+ {pedidos.map(item => {
+ return
+ })}
+
+ }
+
+
+
+ SUBTOTAL
+
+ Frete R${frete.toFixed(2)}
+ R$ {subtotal.toFixed(2)}
+
+
+
+
+
+
Forma de Pagamento
+
+ } label="Dinheiro" />
+ } label="Cartão de crédito" />
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/Pages/CartPage/styles.js b/src/Pages/CartPage/styles.js
new file mode 100644
index 0000000..8227613
--- /dev/null
+++ b/src/Pages/CartPage/styles.js
@@ -0,0 +1,107 @@
+import styled from "styled-components";
+
+export const CartPageContainer = styled.div `
+ width: 100vw !important;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+`
+
+export const ScrollSection = styled.div `
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ overflow: auto;
+ margin-bottom: 3rem;
+`
+
+
+export const ContainerCarrinho = styled.div `
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ margin: 0 1rem;
+`
+
+export const ContainerEndereco = styled.div `
+ background-color: #eeeeee;
+ padding: 0.5rem;
+ margin-bottom: 1rem;
+p {
+ margin: 0.5rem;
+ color: #b8b8b8;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+}
+p:nth-child(2) {
+ color: black;
+ font-weight: 500;
+}
+`
+
+export const ContainerRestaurante = styled.div `
+ margin: 0 1rem 0.5rem 1rem;
+h2 {
+ margin: 0;
+ margin-bottom: 0.5rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ color: #e8222e;
+ font-weight: 500;
+}
+p {
+ margin: 0;
+ font-size: 1rem;
+ margin-bottom: 0.5rem;
+ letter-spacing: -0.39px;
+ color: #b8b8b8;
+}
+`
+
+
+export const MensagemVazio = styled.div `
+ text-align: center;
+ margin-top: 1.25rem;
+ margin-bottom: 3rem;
+ font-weight: 500;
+`
+
+export const SubtotalContainer = styled.div `
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ margin-top: 0.5rem;
+span {
+ display: block;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ font-weight: 500;
+}
+span:nth-child(2) {
+ color: #e8222e;
+ font-weight: bold;
+ font-size: 1.125rem;
+ letter-spacing: -0.43px;
+ text-align: right;
+ margin-top: 0.875rem;
+}
+`
+
+export const StyledForm = styled.form `
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+p {
+ border-bottom: 1px solid black;
+ margin-bottom: 0.5rem;
+ padding-bottom: 0.5rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ font-weight: 500;
+}
+`
+
+
+
diff --git a/src/Pages/EditAdressPage/index.js b/src/Pages/EditAdressPage/index.js
new file mode 100644
index 0000000..9bca7ef
--- /dev/null
+++ b/src/Pages/EditAdressPage/index.js
@@ -0,0 +1,15 @@
+import React from 'react'
+import FormAdress from '../../Components/FormAdress'
+import Header from '../../Components/Header'
+import useProtectedPage from '../../CustomHooks/useProtectedPage'
+
+export default function EditAdressPage() {
+ useProtectedPage()
+ return (
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/Pages/EditAdressPage/styles.js b/src/Pages/EditAdressPage/styles.js
new file mode 100644
index 0000000..6450ccd
--- /dev/null
+++ b/src/Pages/EditAdressPage/styles.js
@@ -0,0 +1,2 @@
+// import styled from 'styled-components'
+
diff --git a/src/Pages/EditProfilePage/EditProfileForm.js b/src/Pages/EditProfilePage/EditProfileForm.js
new file mode 100644
index 0000000..aecd8ea
--- /dev/null
+++ b/src/Pages/EditProfilePage/EditProfileForm.js
@@ -0,0 +1,77 @@
+import React from 'react';
+import Buttons from '../../Components/Buttons'
+import { Container, CampoText, InputArea, ContainerEditProfile } from './styles';
+import useForm from '../../CustomHooks/useForm'
+import { useHistory } from "react-router-dom";
+import { editProfile } from '../../Service/editUser';
+import { CircularProgress } from '@material-ui/core';
+
+export default function EditProfileForm() {
+ const [loading, setLoading] = React.useState(false)
+ const [form, handleInput, resetState] = useForm({
+ name: '',
+ email: '',
+ cpf: '',
+ })
+ const history = useHistory();
+
+ const submitForm = (e) => {
+ e.preventDefault()
+ resetState() //resetando os inputs//
+ editProfile(form, history, setLoading)//funçao está em service/user
+ }
+
+ return (
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/Pages/EditProfilePage/index.js b/src/Pages/EditProfilePage/index.js
new file mode 100644
index 0000000..0f7ced6
--- /dev/null
+++ b/src/Pages/EditProfilePage/index.js
@@ -0,0 +1,14 @@
+import React from 'react'
+import EditProfileForm from './EditProfileForm'
+import Header from '../../Components/Header'
+import useProtectPage from '../../CustomHooks/useProtectedPage'
+
+export default function EditProfilePage() {
+ useProtectPage()
+ return (
+
+
+
+
+ )
+}
diff --git a/src/Pages/EditProfilePage/styles.js b/src/Pages/EditProfilePage/styles.js
new file mode 100644
index 0000000..9c58b2b
--- /dev/null
+++ b/src/Pages/EditProfilePage/styles.js
@@ -0,0 +1,37 @@
+import styled from 'styled-components';
+import TextField from "@material-ui/core/TextField";
+// import FormControl from "@material-ui/core/FormControl";
+
+
+export const ContainerEditProfile = styled.div`
+
+ margin:1rem;
+`
+
+export const Image = styled.div`
+ text-align: center;
+ margin:2.5rem 0 1.75rem 0;
+`
+export const Title = styled.h1`
+ font-family: Roboto;
+ text-align: center;
+ font-size: 1rem;
+ /* font-weight: normal; */
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+`
+
+export const Container = styled.div`
+
+`
+
+export const CampoText = styled.div`
+ margin: 1rem 0;
+`
+
+export const InputArea = styled(TextField)`
+ height: 3.5rem;
+ width: 100%;
+`
\ No newline at end of file
diff --git a/src/Pages/ErrorPage/index.js b/src/Pages/ErrorPage/index.js
new file mode 100644
index 0000000..24ef9a2
--- /dev/null
+++ b/src/Pages/ErrorPage/index.js
@@ -0,0 +1,25 @@
+import React from 'react'
+import Header from '../../Components/Header'
+import FooterMenu from '../../Components/FooterMenu';
+import Image from '../../assets/logo-future-eats-invert.svg'
+import { Container, ContainerImage } from './styles'
+import SentimentVeryDissatisfiedIcon from '@material-ui/icons/SentimentVeryDissatisfied';
+import useProtectedPage from '../../CustomHooks/useProtectedPage';
+
+export default function ErrorPage() {
+ useProtectedPage()
+ return (
+
+
+
+
+
+
+ Algo deu errado
+
+ Confira se você digitou o endereço correto. Pode ser que o endereço não esteja mais disponível.
+
+
+
+ )
+}
diff --git a/src/Pages/ErrorPage/styles.js b/src/Pages/ErrorPage/styles.js
new file mode 100644
index 0000000..2aa295f
--- /dev/null
+++ b/src/Pages/ErrorPage/styles.js
@@ -0,0 +1,29 @@
+import styled from 'styled-components'
+
+export const Container = styled.section`
+display: flex;
+flex-direction: column;
+justify-content: center;
+align-items: center;
+margin: 1rem;
+h2{
+ font-family: Roboto;
+ letter-spacing: -0.29px;
+ font-weight: normal;
+}
+p{
+ letter-spacing: -0.29px;
+ font-family: Roboto;
+ text-align: center;
+ font-size: 1rem;
+ font-weight: normal;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+}
+`
+
+export const ContainerImage = styled.div`
+margin: 2rem 0 2rem 0;
+`
+
diff --git a/src/Pages/HomePage/index.js b/src/Pages/HomePage/index.js
new file mode 100644
index 0000000..700582c
--- /dev/null
+++ b/src/Pages/HomePage/index.js
@@ -0,0 +1,82 @@
+import React,{ useContext, useEffect, useState} from "react";
+import { useHistory } from "react-router-dom";
+import Header from "../../Components/Header/index.js"
+import SearchBar from "../../Components/SearchBar/SearchBar"
+import CardRestaurante from "../../Components/CardRestaurante/CardRestaurante"
+import FeedMenu from "../../Components/FeedMenu/FeedMenu"
+import FooterMenu from "../../Components/FooterMenu/index"
+import PedidoEmAndamento from "../../Components/PedidoEmAndamento/index"
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import HomeDiv from "./styles"
+import useRequestData from '../../CustomHooks/useRequestData';
+import { BASE_URL } from '../../Constants/urls';
+import axios from "axios";
+import useProtectedPage from '../../CustomHooks/useProtectedPage'
+import Loading from '../../Components/Loading/index'
+
+export default function HomePage() {
+ useProtectedPage()
+
+ const {states, setters, requests} = useContext(GlobalStateContext)
+ const [emAndamento, setEmAndamento] = useState('')
+ const history = useHistory();
+
+
+
+ useEffect (() =>{
+
+ const headers ={
+ headers:{
+ auth:localStorage.getItem('token')
+ }
+ }
+ axios.get(`${BASE_URL}/active-order`, headers)
+ .then((response) =>{
+ if(response.data){
+ setEmAndamento(response.data)
+ }
+ })
+ .catch((error) =>{
+ })
+
+ }, [])
+
+let nomeRestaurante = ''
+let totalDoPedido = 0
+if(emAndamento.order){
+ nomeRestaurante = emAndamento.order.restaurantName
+ totalDoPedido = emAndamento.order.totalPrice
+}
+
+const listaDeRestaurantes = useRequestData(`${BASE_URL}/restaurants`, {})
+
+ if (!listaDeRestaurantes.restaurants) {
+ return
+ }
+
+ const filteredArray = listaDeRestaurantes.restaurants.filter(e => {
+ return e.category === states.filter
+ })
+
+
+ return (
+
+
+
+
+ {states.filter === "" ? listaDeRestaurantes.restaurants.map(e => {
+ return
+ })
+ : filteredArray.map(e => {
+ return
+ })}
+
+ {/* Verificando se há pedido para renderizar */}
+ {emAndamento.order !== null && }
+
+
+ );
+}
diff --git a/src/Pages/HomePage/styles.js b/src/Pages/HomePage/styles.js
new file mode 100644
index 0000000..e9dee6f
--- /dev/null
+++ b/src/Pages/HomePage/styles.js
@@ -0,0 +1,8 @@
+import styled from 'styled-components'
+
+const HomeDiv = styled.div`
+ margin: 0 0 164px 0;
+`
+
+export default HomeDiv;
+
diff --git a/src/Pages/LoginPage/index.js b/src/Pages/LoginPage/index.js
new file mode 100644
index 0000000..5eb50f8
--- /dev/null
+++ b/src/Pages/LoginPage/index.js
@@ -0,0 +1,30 @@
+import React, { useEffect, useState } from "react";
+import { useHistory } from "react-router-dom";
+import { goBack, goToHomePage } from "../../Routes/coordinators";
+import FormLogin from "../../Components/FormLogin";
+import Header from "../../Components/Header";
+import Buttons from "../../Components/Buttons";
+import InitialScreen from "../../Components/InitialScreen";
+
+export default function LoginPage() {
+ const history = useHistory();
+ const [exibirLogin, setExibirLogin] = useState(false);
+
+ useEffect(() => {
+
+ if (!exibirLogin) {
+ setTimeout(function () {
+ setExibirLogin(true);
+ }, 2000);
+ }
+
+ }, [exibirLogin]);
+
+
+ return (
+ <>
+ {!exibirLogin &&
}
+ {exibirLogin &&
}
+ >
+ );
+}
diff --git a/src/Pages/LoginPage/styles.js b/src/Pages/LoginPage/styles.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/Pages/ProfilePage/index.js b/src/Pages/ProfilePage/index.js
new file mode 100644
index 0000000..751c1d1
--- /dev/null
+++ b/src/Pages/ProfilePage/index.js
@@ -0,0 +1,109 @@
+import React, { useEffect, useState, useContext } from 'react'
+import { useHistory } from "react-router-dom";
+import { goToEditPage, goToEditAddressPage } from '../../Routes/coordinators';
+import { DivPerfil,
+ HeaderDiv,
+ CaixaInfo,
+ CaixaPerfil,
+ CaixaEndereco,
+ CaixaEnd,
+ CaixaInfoEnd,
+ CaixaHistoricoPedidos,
+ IconePerfil,
+ IconeEndereco,
+ ContainerDosPedidos,
+ CaixaPedido,
+ DivName,
+ DivData,
+ DivTotal,
+ DivSemPedidos
+ } from './styles'
+import icon from '../../assets/iconelapis.png';
+import Header from '../../Components/Header';
+import FooterMenu from '../../Components/FooterMenu';
+import GlobalStateContext from '../../Global/GlobalStateContext';
+import axios from 'axios';
+import { BASE_URL } from '../../Constants/urls';
+import useProtectedPage from '../../CustomHooks/useProtectedPage';
+import useRequestData from '../../CustomHooks/useRequestData'
+import Loading from "../../Components/Loading/index"
+
+export default function ProfilePage() {
+ useProtectedPage()
+ const history = useHistory();
+ const {states} = useContext(GlobalStateContext)
+ const [orders, setOrders] = useState([])
+
+ const perfil = useRequestData(`${BASE_URL}/profile`, {})
+
+ useEffect(() => {
+ const headers ={
+ headers:{
+ auth:localStorage.getItem('token')
+ }
+ }
+
+ axios.get(`${BASE_URL}/orders/history`, headers)
+ .then((response) => {
+ setOrders(response.data.orders)
+ })
+ .catch((error) => {
+ console.log(error)
+ })
+ }, []);
+
+ function timeConverter(UNIX_timestamp){
+ let a = new Date(UNIX_timestamp);
+ let months = ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Augusto','Setembro','Outubro','Novembro','Dezembro'];
+ let year = a.getFullYear();
+ let month = months[a.getMonth()];
+ let date = a.getDate();
+ let time = date + ' ' + month + ' ' + year + ' ';
+ return time;
+ }
+
+ console.log(orders)
+
+ if(!perfil.user) {
+ return
+ }
+
+ return (
+
+
+ goToEditPage(history)} src={icon} />
+
+
+
+ {perfil.user.name}
+ {perfil.user.email}
+ {perfil.user.cpf}
+
+
+
+ goToEditAddressPage(history)} src={icon} />
+ Endereço cadastrado:
+ {perfil.user.address}
+
+
+ Histórico de Pedidos
+
+ {orders.length !== 0 ? orders.map((item) => {
+ return (
+
+ {item.restaurantName}
+ {timeConverter(item.createdAt)}
+ {`SUBTOTAL R$${item.totalPrice}`}
+
+ )
+ }
+ ) : Você não realizou nenhum pedido }
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/Pages/ProfilePage/styles.js b/src/Pages/ProfilePage/styles.js
new file mode 100644
index 0000000..17dc22e
--- /dev/null
+++ b/src/Pages/ProfilePage/styles.js
@@ -0,0 +1,145 @@
+import styled from 'styled-components'
+
+export const DivPerfil = styled.div`
+ width: 100vw;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+`
+
+export const CaixaPerfil = styled.div`
+ width: 100%;
+ margin: 0;
+ padding: 1rem 0;
+`
+
+export const CaixaInfo = styled.div`
+ width: 20.5rem;
+ height: 1.125rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ margin: 1rem 1rem 0.5rem;
+ color: #000000;
+`
+
+export const CaixaEndereco = styled.div`
+ max-width: 100vw;
+ height: 4.75rem;
+ padding: 0 1rem;
+ background-color: #eeeeee;
+ position: relative;
+`
+
+export const CaixaEnd = styled.div`
+ max-width: 100vw;
+ height: 1.125rem;
+ margin: 0 0 0.5rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ color: #b8b8b8;
+`
+
+export const CaixaInfoEnd = styled.div`
+ width: 20.5rem;
+ height: 1.125rem;
+ margin-top: 1rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+`
+
+export const CaixaHistoricoPedidos = styled.div`
+ max-width: 100vw;
+ height: 1.625rem;
+ margin-top: 1rem;
+ margin-left: 1rem;
+ margin-right: 1rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ border-bottom: 1px solid black;
+`
+
+export const IconePerfil = styled.img`
+ width: 1.5rem;
+ height: 1.5rem;
+ object-fit: contain;
+ position: absolute;
+ top: 6rem;
+ right: 1rem;
+
+ :hover {
+ opacity: 0.5;
+ }
+ :active {
+ opacity: 1;
+ }
+`
+
+export const IconeEndereco = styled.img`
+ width: 1.5rem;
+ height: 1.5rem;
+ object-fit: contain;
+ position: absolute;
+ top: 1.625rem;
+ right: 1rem;
+
+ :hover {
+ opacity: 0.5;
+ }
+ :active {
+ opacity: 1;
+ }
+`
+
+export const ContainerDosPedidos = styled.div`
+ margin-bottom: 5rem;
+ max-width: 100vw;
+ height: 100%;
+ overflow: auto;
+ scrollbar-width: none;
+`
+
+export const CaixaPedido = styled.div`
+ max-width: 100vw;
+ height: 6.375rem;
+ margin: 0.438rem 1rem 0 1rem;
+ border-radius: 8px;
+ border: 1px solid #B8B8B8;
+`
+
+export const DivName = styled.div`
+ width: 18.5rem;
+ height: 1.125rem;
+ margin: 1rem 1rem 0 1rem;
+ font-size: 1rem;
+ letter-spacing: -0ch.39px;
+ color: #E8222E;
+`
+
+export const DivData = styled.div`
+ width: 18.5rem;
+ height: 1.125rem;
+ margin: 0.563rem 1rem 0 1rem;
+ font-size: 0.75rem;
+ letter-spacing: -0ch.29px;
+`
+
+export const DivTotal = styled.div`
+ width: 18.5rem;
+ height: 1.125rem;
+ margin: 0.438rem 1rem 0 1rem;
+ font-size: 1rem;
+ font-weight: bold;
+ letter-spacing: -normal.029px;
+`
+
+export const DivSemPedidos = styled.div`
+ width: 100%;
+ opacity: 0.89;
+ font-family: 'Roboto', sans-serif;
+ font-size: 1rem;
+ color: #000;
+ margin-top: 1.75rem;
+ text-align: center;
+`
+
diff --git a/src/Pages/RestaurantPage/index.js b/src/Pages/RestaurantPage/index.js
new file mode 100644
index 0000000..241c381
--- /dev/null
+++ b/src/Pages/RestaurantPage/index.js
@@ -0,0 +1,109 @@
+import React,{ useContext, useEffect, useState } from 'react'
+import { useHistory, useParams } from "react-router-dom";
+import Header from "../../Components/Header";
+import ItemCard from "../../Components/ItemCard/ItemCard";
+import { RestaurantInfo, MealsContainer, TypeTitle } from './styles';
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import useRequestData from '../../CustomHooks/useRequestData';
+import { BASE_URL } from '../../Constants/urls';
+import PopUpQuantidade from '../../Components/PopUpQuantidade';
+import axios from 'axios'
+import useProtectedPage from '../../CustomHooks/useProtectedPage'
+import Loading from '../../Components/Loading';
+
+export default function RestaurantPage() {
+ useProtectedPage()
+ const {states, setters} = useContext(GlobalStateContext)
+ const [categorias, setCategorias] = useState([])
+
+ const history = useHistory();
+ const params = useParams()
+
+ // const data = useRequestData(`${BASE_URL}/restaurants/${params.id}`,{})
+
+ useEffect(() => {
+ axios.get(`${BASE_URL}/restaurants/${params.id}`,{headers: {"auth": localStorage.getItem('token')}})
+ .then((response) => {
+ setters.setRestaurante(response.data.restaurant)
+ }).catch((error) => {
+ console.log(error.message)
+ })
+
+ // if (states.restaurante && states.restaurante.products) {
+ // let arrayMap = states.restaurante.products.map((item) => {
+ // return item.category
+ // })
+ // const uniqueSet = new Set(arrayMap)
+ // arrayMap = [...uniqueSet]
+ // setCategorias(arrayMap)
+ // }
+
+ }, [ params.id])
+
+ useEffect(() => {
+ if (states.restaurante && states.restaurante.products) {
+ let arrayMap = states.restaurante.products.map((item) => {
+ return item.category
+ })
+ const uniqueSet = new Set(arrayMap)
+ arrayMap = [...uniqueSet]
+ setCategorias(arrayMap)
+ }
+ }, [states.restaurante])
+ // states.restaurante, params.id
+
+ const renderRestaurantInfo = () => {
+ const frete = Number(states.restaurante.shipping).toFixed(2)
+ return (
+
+
+ {states.restaurante.name}
+ {states.restaurante.category}
+
+ {`${states.restaurante.deliveryTime} min`}
+ {`Frete R$${frete}`}
+
+ {states.restaurante.address}
+
+ )
+ }
+
+ // console.log(states.restaurante)
+ console.log(states.restaurante.products);
+ const renderCategory = categorias.map(item => {
+ const categoria = item
+ return (
+
+ {categoria}
+
+ {(states.restaurante.products).map(item => {
+ if (item.category === categoria) {
+ return (
+
+ )
+ }
+ })}
+
+ )
+ })
+
+ return (
+
+ {states.popUp ?
: null}
+
+
+
+ {states.restaurante.id === params.id ? renderRestaurantInfo() :
}
+
+ {states.restaurante && states.restaurante.products ? renderCategory : null }
+
+
+ )
+}
diff --git a/src/Pages/RestaurantPage/styles.js b/src/Pages/RestaurantPage/styles.js
new file mode 100644
index 0000000..9dea736
--- /dev/null
+++ b/src/Pages/RestaurantPage/styles.js
@@ -0,0 +1,45 @@
+import styled from "styled-components";
+
+export const RestaurantInfo = styled.div `
+ margin: 1rem;
+ height: 15.5rem;
+ font-size: 1rem;
+ letter-spacing: -0.29px;
+ color: #b8b8b8;
+h2 {
+ margin: 0;
+ margin-top: 0.75rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ color: #e8222e;
+ font-weight: 500;
+}
+p {
+ margin: 0.5rem 0;
+}
+span {
+ margin-right: 0.5rem;
+}
+img {
+ margin: 0;
+ width: 100%;
+ height: 7.5rem;
+ object-fit: cover;
+ border-radius: 8px 8px 0 0;
+}
+`
+
+export const MealsContainer = styled.div `
+ margin: 0 1rem;
+ margin-bottom: 0.5rem;
+`
+
+export const TypeTitle = styled.p `
+ margin: 0;
+ border-bottom: 1px solid black;
+ margin-bottom: 0.5rem;
+ padding-bottom: 0.5rem;
+ font-size: 1rem;
+ letter-spacing: -0.39px;
+ font-weight: 500;
+`
\ No newline at end of file
diff --git a/src/Pages/SearchPage/index.js b/src/Pages/SearchPage/index.js
new file mode 100644
index 0000000..300c90f
--- /dev/null
+++ b/src/Pages/SearchPage/index.js
@@ -0,0 +1,40 @@
+import React,{useContext} from 'react'
+import SearchBar from "../../Components/SearchBar/SearchBar"
+import Header from "../../Components/Header/index"
+import GlobalStateContext from "../../Global/GlobalStateContext";
+import useStyles from './styles'
+import CardRestaurante from "../../Components/CardRestaurante/CardRestaurante"
+import useProtectedPage from '../../CustomHooks/useProtectedPage';
+import useRequestData from "../../CustomHooks/useRequestData"
+import { BASE_URL } from '../../Constants/urls';
+import Loading from '../../Components/Loading/index'
+
+export default function SearchPage() {
+ useProtectedPage()
+ const {states, setters, requests} = useContext(GlobalStateContext)
+ const classes = useStyles()
+
+ const listaDeRestaurantes = useRequestData(`${BASE_URL}/restaurants`, {})
+
+ if (!listaDeRestaurantes.restaurants) {
+ return
+ }
+
+ const filteredArray = listaDeRestaurantes.restaurants.filter(e => {
+ return e.name.toLowerCase().includes(states.searchInput.toLowerCase()) || e.category.toLowerCase().includes(states.searchInput.toLowerCase())
+ })
+
+ const arrayMap = filteredArray.map(e => {
+ return
+ })
+
+
+ return (
+
+ )
+}
diff --git a/src/Pages/SearchPage/styles.js b/src/Pages/SearchPage/styles.js
new file mode 100644
index 0000000..c0b7063
--- /dev/null
+++ b/src/Pages/SearchPage/styles.js
@@ -0,0 +1,20 @@
+import { makeStyles } from '@material-ui/core/styles';
+
+const useStyles = makeStyles({
+ searchPlaceholder: {
+ height: '1.125rem',
+ fontFamily: 'Roboto',
+ fontSize: '1rem',
+ fontWeight: 500,
+ fontStretch: 'normal',
+ fontStyle: 'normal',
+ lineHeight: 'normal',
+ letterSpacing: '-0.39px',
+ textAlign: 'center',
+ color: 'black',
+
+ }
+
+})
+
+export default useStyles
\ No newline at end of file
diff --git a/src/Pages/SignUpPage/SignUpForm.js b/src/Pages/SignUpPage/SignUpForm.js
new file mode 100644
index 0000000..f484375
--- /dev/null
+++ b/src/Pages/SignUpPage/SignUpForm.js
@@ -0,0 +1,164 @@
+import React from 'react';
+import Buttons from '../../Components/Buttons'
+import { Container, CampoText, InputArea, Title, ContainerSignUp, Image, AlertPassword } from './styles';
+import Logo from '../../assets/logo-future-eats-invert.png';
+import { IconButton, InputAdornment, InputLabel } from '@material-ui/core';
+import Visibility from '@material-ui/icons/Visibility';
+import VisibilityOff from '@material-ui/icons/VisibilityOff';
+import useForm from '../../CustomHooks/useForm';
+import { useHistory } from "react-router-dom";
+import { signUp } from '../../Service/user';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+
+export default function SignUpForm(props) {
+ const [ showSenha, setShowSenha ] = React.useState(false)
+ const [ showAlert, setShowAlert ] = React.useState (false)
+ const [ loading, setLoading ] = React.useState(false)
+
+ const history = useHistory();
+
+ const [ form, handleInput ] = useForm({
+ name: '',
+ email: '',
+ cpf: '',
+ password: '',
+ passwordConfirm: '',
+ })
+
+ const handleClickShowPassword = () => {
+ setShowSenha(!showSenha);
+ }
+
+ const handleMouseDownPassword = (event) => {
+ event.preventDefault();
+ }
+
+ const submitForm = (e) => {
+ e.preventDefault()
+ if(form.password !== form.passwordConfirm){
+ setShowAlert(!showAlert)
+ }
+ const body = {
+ name: form.name,
+ email: form.email,
+ cpf: form.cpf,
+ password: form.password
+ }
+ signUp(body, history, setLoading)// funçao está em service/user
+ }
+
+ return (
+
+
+
+
+ { props.texto }
+
+
+ )
+}
diff --git a/src/Pages/SignUpPage/index.js b/src/Pages/SignUpPage/index.js
new file mode 100644
index 0000000..94c9a9f
--- /dev/null
+++ b/src/Pages/SignUpPage/index.js
@@ -0,0 +1,24 @@
+import React from 'react'
+import { useHistory } from "react-router-dom";
+import FooterMenu from '../../Components/FooterMenu';
+import Header from '../../Components/Header';
+import { goBack, goToAddAddressPage } from '../../Routes/coordinators';
+import SignUpForm from './SignUpForm';
+import styled from 'styled-components'
+
+export const Container = styled.div`
+ margin: 1rem;
+`
+export default function SignUpPage() {
+
+ return (
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/Pages/SignUpPage/styles.js b/src/Pages/SignUpPage/styles.js
new file mode 100644
index 0000000..e9723fa
--- /dev/null
+++ b/src/Pages/SignUpPage/styles.js
@@ -0,0 +1,43 @@
+import styled from 'styled-components';
+import TextField from "@material-ui/core/TextField";
+
+
+export const ContainerSignUp = styled.div`
+ margin: 1rem;
+`
+
+export const Image = styled.div`
+ text-align: center;
+ margin: 1.5rem 0 1.75rem 0;
+`
+
+export const Title = styled.h3`
+ font-family: Roboto;
+ text-align: center;
+ font-size: 1rem;
+ /* font-weight: normal; */
+ font-stretch: normal;
+ font-style: normal;
+ line-height: normal;
+ letter-spacing: -0.39px;
+`
+
+export const Container = styled.div`
+
+`
+
+export const CampoText = styled.div`
+ margin: 1rem 0;
+`
+
+export const InputArea = styled(TextField)`
+ width:100%;
+ height: 3.5rem;
+`
+
+export const AlertPassword = styled.p`
+ color:#e02020;
+ font-size: 0.75rem;
+ letter-spacing: -0.29px;
+ margin:0 0 0.75rem 1rem;
+`
\ No newline at end of file
diff --git a/src/Routes/Routes.js b/src/Routes/Routes.js
new file mode 100644
index 0000000..ec1dd20
--- /dev/null
+++ b/src/Routes/Routes.js
@@ -0,0 +1,67 @@
+import React from 'react'
+import { BrowserRouter, Route, Switch } from 'react-router-dom'
+import HomePage from "../Pages/HomePage";
+import AddAddressPage from "../Pages/AddAddressPage";
+import CartPage from "../Pages/CartPage";
+import EditProfilePage from "../Pages/EditProfilePage";
+import EditAdressPage from "../Pages/EditAdressPage"
+import LoginPage from "../Pages/LoginPage";
+import ProfilePage from "../Pages/ProfilePage";
+import RestaurantPage from "../Pages/RestaurantPage";
+import SignUpPage from "../Pages/SignUpPage";
+import ErrorPage from "../Pages/ErrorPage";
+import SearchPage from '../Pages/SearchPage'
+
+
+
+export default function Routes() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/Routes/coordinators.js b/src/Routes/coordinators.js
new file mode 100644
index 0000000..975aa4e
--- /dev/null
+++ b/src/Routes/coordinators.js
@@ -0,0 +1,44 @@
+export const goToHomePage = (history) => {
+ history.push('/feed')
+}
+
+export const goToAddAddressPage = (history) => {
+ history.push('/profile/add-address')
+}
+
+export const goToCartPage = (history) => {
+ history.push('/cart')
+}
+
+export const goToEditPage = (history) => {
+ history.push('/profile/edit')
+}
+
+export const goToEditAddressPage = (history) => {
+ history.push('/profile/edit/address')
+}
+
+export const goToLoginPage = (history) => {
+ history.push('/')
+}
+
+export const goToProfilePage = (history) => {
+ history.push('/profile')
+}
+
+export const goToRestaurantsPage = (history, id) => {
+ history.push(`/restaurants/${id}`)
+}
+
+export const goToSignUpPage = (history) => {
+ history.push('/sign-up')
+}
+
+export const goToSearchPage = (history) => {
+ history.push('/search')
+}
+
+export const goBack = (history) => {
+ history.goBack()
+}
+
diff --git a/src/Service/api.js b/src/Service/api.js
new file mode 100644
index 0000000..9437f53
--- /dev/null
+++ b/src/Service/api.js
@@ -0,0 +1,7 @@
+import axios from "axios";
+
+const api = axios.create({
+ baseURL: "https://us-central1-missao-newton.cloudfunctions.net/fourFoodA/",
+});
+
+export default api;
\ No newline at end of file
diff --git a/src/Service/editUser.js b/src/Service/editUser.js
new file mode 100644
index 0000000..4be7ed0
--- /dev/null
+++ b/src/Service/editUser.js
@@ -0,0 +1,19 @@
+import axios from 'axios'
+import {BASE_URL} from '../Constants/urls'
+import { goToProfilePage } from '../Routes/coordinators'
+
+export const editProfile = (body, history) => {
+ const headers ={
+ headers:{
+ auth:localStorage.getItem('token')
+ }
+ }
+ axios.put(`${BASE_URL}/profile`, body, headers)
+ .then((response)=>{
+ goToProfilePage(history)
+ console.log(response);
+ })
+ .catch((error) => {
+ alert(error)
+ })
+}
\ No newline at end of file
diff --git a/src/Service/user.js b/src/Service/user.js
new file mode 100644
index 0000000..e0ab581
--- /dev/null
+++ b/src/Service/user.js
@@ -0,0 +1,62 @@
+import axios from 'axios'
+import {BASE_URL} from '../Constants/urls'
+import { goToAddAddressPage, goToHomePage } from '../Routes/coordinators'
+
+export const signUp = (body, history, setLoading) => {
+ setLoading(true)
+ axios.post(`${BASE_URL}/signup`, body)
+ .then((response) => {
+ localStorage.setItem('token', response.data.token)// token da criação do novo usuario
+ setLoading(false)
+ goToAddAddressPage(history)
+ })
+ .catch((error) => {
+
+ // alert(error)
+ setLoading(false)
+ })
+}
+
+
+export const addAddress = (body, history, setLoading) => {
+ const headers ={
+ headers:{
+ auth:localStorage.getItem('token')
+ }
+ }
+ setLoading(true)
+ axios.put(`${BASE_URL}/address`, body, headers)
+ .then((response) => {
+
+ localStorage.setItem('token', response.data.token)// token da criação do endereço
+ setLoading(false)
+ goToHomePage(history)
+ })
+ .catch((error) => {
+
+ setLoading(false)
+ })
+}
+
+
+export const order = (body, history, setLoading, id, setCarrinho) =>{
+ const headers ={
+ headers:{
+ auth:localStorage.getItem('token')
+ }
+ }
+ setLoading(true)
+ axios.post(`${BASE_URL}/restaurants/${id}/order`, body, headers)
+ .then((response) => {
+
+ setLoading(false)
+ setCarrinho({})
+ goToHomePage(history)
+ })
+ .catch((error) => {
+ if ( error.message === "Request failed with status code 409") {
+ alert("Já existe um pedido em andamento")
+ }
+ setLoading(false)
+ })
+}
\ No newline at end of file
diff --git a/src/Tema/Tema.js b/src/Tema/Tema.js
new file mode 100644
index 0000000..40a7aa4
--- /dev/null
+++ b/src/Tema/Tema.js
@@ -0,0 +1,25 @@
+import React from "react"
+import { createMuiTheme, ThemeProvider } from '@material-ui/core/styles';
+
+const theme = createMuiTheme({
+ palette: {
+ primary: {
+ main: "#e8222e"
+ },
+ secondary: {
+ main: "#ff6158"
+ }
+ },
+});
+
+
+function Tema(props) {
+
+ return (
+
+ {props.children}
+
+ );
+}
+
+export default Tema;
diff --git a/src/assets/footerMenuIcons/avatar.svg b/src/assets/footerMenuIcons/avatar.svg
new file mode 100644
index 0000000..47e02c9
--- /dev/null
+++ b/src/assets/footerMenuIcons/avatar.svg
@@ -0,0 +1,8 @@
+import
+
+
+
+
+
+
+
diff --git a/src/assets/footerMenuIcons/homepage.svg b/src/assets/footerMenuIcons/homepage.svg
new file mode 100644
index 0000000..12ee619
--- /dev/null
+++ b/src/assets/footerMenuIcons/homepage.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/assets/footerMenuIcons/shopping-cart.svg b/src/assets/footerMenuIcons/shopping-cart.svg
new file mode 100644
index 0000000..0d122ee
--- /dev/null
+++ b/src/assets/footerMenuIcons/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/iconelapis.png b/src/assets/iconelapis.png
new file mode 100644
index 0000000..b284b0d
Binary files /dev/null and b/src/assets/iconelapis.png differ
diff --git a/src/assets/logo-future-eats-invert.png b/src/assets/logo-future-eats-invert.png
new file mode 100644
index 0000000..265c239
Binary files /dev/null and b/src/assets/logo-future-eats-invert.png differ
diff --git a/src/assets/logo-future-eats-invert.svg b/src/assets/logo-future-eats-invert.svg
new file mode 100644
index 0000000..1a81ffc
--- /dev/null
+++ b/src/assets/logo-future-eats-invert.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/logo-future-eats.png b/src/assets/logo-future-eats.png
new file mode 100644
index 0000000..ea6bc1f
Binary files /dev/null and b/src/assets/logo-future-eats.png differ
diff --git a/src/assets/logo-future-eats@2x.png b/src/assets/logo-future-eats@2x.png
new file mode 100644
index 0000000..68673c9
Binary files /dev/null and b/src/assets/logo-future-eats@2x.png differ
diff --git a/src/assets/logo-future-eats@3x.png b/src/assets/logo-future-eats@3x.png
new file mode 100644
index 0000000..735db17
Binary files /dev/null and b/src/assets/logo-future-eats@3x.png differ
diff --git a/src/index.css b/src/index.css
index ec2585e..c834afb 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,13 +1,13 @@
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen",
+ "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
monospace;
-}
+}
\ No newline at end of file
diff --git a/src/logo.svg b/src/logo.svg
deleted file mode 100644
index 6b60c10..0000000
--- a/src/logo.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-