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 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 ( -
-
- logo -

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

- - Learn React - -
+
+ + + + + +
); } 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} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + : 'Salvar' } + submeter = {submitForm} + /> + +
+ ); +} 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 ( + + +
+ logo +
+ Entrar +
+ + + + + + + {showSenha ? : } + + + ), + }} + /> + + + + Entrar + + + { + goToSignUpPage(history); + }} + > + Não possui cadastro? Clique aqui. + +
+
+
+ ); +}; + +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 ( + + + logo + + + ); +} 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} + + +

{props.name}

+ {renderQuantidade[0] ? : 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 ( + + ) + }) + + + 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

+ + + + +
+
+ ) +} 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 ( + +
+ + + + + + + + + + + + + + : 'Salvar' } + /> + +
+ ) +} \ 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.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 ( +
+
+ + {states.searchInput === "" ?

Busque por nome de Restaurante

+ : (arrayMap[0]? arrayMap :

Não encontramos :(

) } +
+ ) +} 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 } +
+ + + + + + + + + + + + + + + + + {showSenha ? : } + + + ), + }} + /> + + + + + + {showSenha ? : } + + + ), + }} + /> + + + {showAlert && Deve ser a mesma que a anterior} + : 'Criar' } + /> + +
+ ) +} 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 @@ - - - - - - -