diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache new file mode 100644 index 00000000..d9006687 --- /dev/null +++ b/.firebase/hosting.YnVpbGQ.cache @@ -0,0 +1,26 @@ +asset-manifest.json,1683791116857,6eb134c96134da3fbe9eeae52617c3b55635e89fca98c4b96b7185c85b83b0db +index.html,1683791116857,84a002df460ea1b67eed581e15230756274823169e310809d8a341fb15be9ef1 +favicon.ico,1683791080842,41b6bdb6164ca309be0b4f953a0146299823bd70ed0d7dbae9133899e3fa1c43 +manifest.json,1683791080873,8a52b2056a920670efed97e8438c2e2719e781bf7d3d1d3d6fe3f94341877c5f +icons/filter.svg,1683791080856,1152f8b25752467e67885443b0273622b43826c18c5fde4006ecec52350e0157 +icons/location.svg,1683791080857,62d5ce23bbc1c5a5418f919815ebadf64cf54acc39be7839bd865aa7ff99c0e8 +logos/icon-fail.svg,1683791080863,f651279aa076dd93924442062a13b1532db31c2d24d465d64c342ae917e97741 +logos/icon-blue.svg,1683791080862,61c9c5a1f5f1da1f176bc14cdd5253ed950fbe368b2a95f8ddf473cb53d508d1 +logos/icon-white.svg,1683791080865,8cde4aedecd49248dbff0a3326db72a0a2957ae6fddbfc6937fbde005f8f3691 +logos/logo-home.svg,1683791080867,22f34923d22812c008f923a17ede1a78bc80de78b8ff9d29137e47b74f98d190 +logos/logo-black-wide.svg,1683791080866,71513b726d72b6da31da5596d22d0c16c24ddc79c336ec97b92b012c9fefa4c8 +logos/logo-white-wide.svg,1683791080869,eaafb2eb52aec1424575a8f98e43ca676011f13db95e7c580362e86416c85102 +static/css/main.e6b87447.css,1683791116876,450c3435403389a7ed1e5a56b12152937f9c27f156dc7c26e4a30f919fb1d112 +static/js/main.18302841.js.LICENSE.txt,1683791116876,bbda607af6d4fcdfb72c785d7c5c6ff40ec87dff5a23c6c7db76a43d56cd2ead +logos/logo192.png,1683791080870,1d108d2885e7098d4850ecb339f6e3189265feb7fc38aee2127930c9a7822dd9 +static/css/main.e6b87447.css.map,1683791116876,352ae90c4162019e3957f1ccfbf95f6fbedfdb8012e53c02310c231a4184ed26 +logos/logo512.png,1683791080872,8d33f703e8de9a6bc36b5d30543614ad771534073497a76346c80dfb0613be48 +static/media/Satoshi-Bold.a0e6d25529eab537426c.woff2,1683791116877,0322da84a6df2b206c14be485db038e0235c2e3cb8900aeec91e6715370217c9 +static/media/Satoshi-Bold.a875ff682ee232938607.woff,1683791116876,669b77becddb880ad6eea8afaa0284f5cd30205e3774249b4c925b3b4357e33c +static/media/Satoshi-Medium.1ffe968245568e8ba1e7.woff2,1683791116874,1a9856d068e4a9398ebb559091c26b7152d50b77aceef2d192adefd234580577 +static/media/Satoshi-Medium.2419b46c96ed15331ba2.woff,1683791116874,c9f69fbb1b54f1651c08a59d599875751d87462d69bb8a4ea75b781b12f2fb0a +static/media/Satoshi-Bold.137a52d9f47dd71c6247.ttf,1683791116874,193cdc00db3a07259a85711d51aac391ed19600a2fabe5a9ae2fb841c241a5d8 +static/media/Satoshi-Medium.759562088ba19068aef8.ttf,1683791116874,b88be54c30614e53c240020cd528854faf72bdbbcc6d0703e8e1dd8009e1778b +static/media/Oakes-Grotesk-Bold.a6b9f0fbd8198bd97c6d.ttf,1683791116876,027e39f5f236c6df4f3cf2ecef6b2855e217a3640bc15ecf8db800de406d0fcd +static/js/main.18302841.js,1683791116875,6e7717affdeac6e7b2724bcbbbb01c23b6375721c6f569a7c3f56a23cb32e096 +static/js/main.18302841.js.map,1683791116875,c52b7d2d75bf575f5ebadf6a91e41d60769781d495589fd49bbd6354bdc2a4c9 diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 00000000..b34ef3cb --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "markan-where" + } +} diff --git a/.gitignore b/.gitignore index 4d29575d..0ab4e86e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +/src/database diff --git a/README.md b/README.md index e273017e..daed1652 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,9 @@ -# Rocket Academy Coding Bootcamp: Project 1: Frontend App +# Makan Where: Makan Recommendation Generator by @markan.sg! -https://bc.rocketacademy.co/1-frontend/1.p-frontend-app +Not sure what to eat? With this app, you can find curated food recommendations around you by Mark! +You can explore the app here: https://markcwy-ra.github.io/markan-where/ -## Available Scripts +## Current Version Notes -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. - -The page will reload when you make changes.\ -You may also see any lint errors in the console. +Currently has limited number of food places, list will be updated soon! +Images and location takes a while to load, so please be patient! diff --git a/firebase.json b/firebase.json new file mode 100644 index 00000000..340ed5b7 --- /dev/null +++ b/firebase.json @@ -0,0 +1,16 @@ +{ + "hosting": { + "public": "build", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/package-lock.json b/package-lock.json index c205fc57..ad0e9385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,16 @@ "name": "project1-bootcamp", "version": "0.1.0", "dependencies": { + "axios": "^1.3.6", + "framer-motion": "^10.11.2", + "geolib": "^3.3.3", + "gh-pages": "^3.2.3", + "papaparse": "^5.4.1", "react": "^18.1.0", "react-dom": "^18.1.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.10.0", + "react-scripts": "5.0.1", + "react-slider": "^2.0.4" } }, "node_modules/@ampproject/remapping": { @@ -1997,6 +2004,21 @@ "postcss": "^8.3" } }, + "node_modules/@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==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@eslint/eslintrc": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", @@ -2866,6 +2888,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", + "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4121,6 +4151,14 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -4226,6 +4264,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz", + "integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5950,6 +6011,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz", "integrity": "sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw==" }, + "node_modules/email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", @@ -7073,6 +7139,30 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -7171,9 +7261,9 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -7378,6 +7468,29 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.11.2.tgz", + "integrity": "sha512-IrwuC9regNOU99JoM/Z62CAMA3awGV6AcF7e3bcgXk/ZoNlGSt5aVq0J7UAwtLmCkwVlRvBkiMnvv2mZ1GW2pg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -7448,6 +7561,11 @@ "node": ">=6.9.0" } }, + "node_modules/geolib": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/geolib/-/geolib-3.3.3.tgz", + "integrity": "sha512-YO704pzdB/8QQekQuDmFD5uv5RAwAf4rOUPdcMhdEOz+HoPWD0sC7Qqdwb+LAvwIjXVRawx0QgZlocKYh8PFOQ==" + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -7508,6 +7626,87 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gh-pages": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", + "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==", + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/gh-pages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/gh-pages/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -11348,6 +11547,11 @@ "node": ">=6" } }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -11470,6 +11674,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -12815,6 +13046,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -13112,6 +13348,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", + "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "dependencies": { + "@remix-run/router": "1.5.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", + "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "dependencies": { + "@remix-run/router": "1.5.0", + "react-router": "6.10.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -13184,6 +13450,17 @@ } } }, + "node_modules/react-slider": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-slider/-/react-slider-2.0.4.tgz", + "integrity": "sha512-sWwQD01n6v+MbeLCYthJGZPc0kzOyhQHyd0bSo0edg+IAxTVQmj3Oy4SBK65eX6gNwS9meUn6Z5sIBUVmwAd9g==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -14216,6 +14493,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", @@ -14680,6 +14968,17 @@ "node": ">=8" } }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -17187,6 +17486,21 @@ "integrity": "sha512-T5ZyNSw9G0x0UDFiXV40a7VjKw2b+l4G+S0sctKqxhx8cg9QtMUAGwJBVU9mHPDPoZEmwm0tEoukjl4zb9MU7Q==", "requires": {} }, + "@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==", + "optional": true, + "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==", + "optional": true + }, "@eslint/eslintrc": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", @@ -17810,6 +18124,11 @@ "source-map": "^0.7.3" } }, + "@remix-run/router": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", + "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -18750,6 +19069,11 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" + }, "array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -18818,6 +19142,28 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" }, + "axios": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz", + "integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -20080,6 +20426,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz", "integrity": "sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw==" }, + "email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + }, "emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", @@ -20909,6 +21260,21 @@ } } }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" + }, + "filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, "filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -20985,9 +21351,9 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", @@ -21112,6 +21478,15 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, + "framer-motion": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.11.2.tgz", + "integrity": "sha512-IrwuC9regNOU99JoM/Z62CAMA3awGV6AcF7e3bcgXk/ZoNlGSt5aVq0J7UAwtLmCkwVlRvBkiMnvv2mZ1GW2pg==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "tslib": "^2.4.0" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -21163,6 +21538,11 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, + "geolib": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/geolib/-/geolib-3.3.3.tgz", + "integrity": "sha512-YO704pzdB/8QQekQuDmFD5uv5RAwAf4rOUPdcMhdEOz+HoPWD0sC7Qqdwb+LAvwIjXVRawx0QgZlocKYh8PFOQ==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -21202,6 +21582,70 @@ "get-intrinsic": "^1.1.1" } }, + "gh-pages": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", + "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==", + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -23976,6 +24420,11 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -24068,6 +24517,24 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -24908,6 +25375,11 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -25119,6 +25591,23 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, + "react-router": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", + "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "requires": { + "@remix-run/router": "1.5.0" + } + }, + "react-router-dom": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", + "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "requires": { + "@remix-run/router": "1.5.0", + "react-router": "6.10.0" + } + }, "react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -25174,6 +25663,14 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-slider": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-slider/-/react-slider-2.0.4.tgz", + "integrity": "sha512-sWwQD01n6v+MbeLCYthJGZPc0kzOyhQHyd0bSo0edg+IAxTVQmj3Oy4SBK65eX6gNwS9meUn6Z5sIBUVmwAd9g==", + "requires": { + "prop-types": "^15.8.1" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -25940,6 +26437,14 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", @@ -26286,6 +26791,14 @@ "punycode": "^2.1.1" } }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", diff --git a/package.json b/package.json index a100866d..1ebc76f3 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,22 @@ "name": "project1-bootcamp", "version": "0.1.0", "private": true, + "homepage": ".", "dependencies": { + "axios": "^1.3.6", + "framer-motion": "^10.11.2", + "geolib": "^3.3.3", + "gh-pages": "^3.2.3", + "papaparse": "^5.4.1", "react": "^18.1.0", "react-dom": "^18.1.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.10.0", + "react-scripts": "5.0.1", + "react-slider": "^2.0.4" }, "scripts": { + "predeploy": "npm run build", + "deploy": "gh-pages -d build", "start": "react-scripts start", "build": "react-scripts build" }, diff --git a/public/favicon.ico b/public/favicon.ico old mode 100755 new mode 100644 index c17bf23f..0efe5f36 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/icons/filter.svg b/public/icons/filter.svg new file mode 100644 index 00000000..e877afde --- /dev/null +++ b/public/icons/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/location.svg b/public/icons/location.svg new file mode 100644 index 00000000..5907135d --- /dev/null +++ b/public/icons/location.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/index.html b/public/index.html index bd669818..56fd3355 100644 --- a/public/index.html +++ b/public/index.html @@ -7,9 +7,9 @@ - + - Rocket Bootcamp Project + Makan Where? diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100755 index 1dd995bc..00000000 Binary files a/public/logo192.png and /dev/null differ diff --git a/public/logo512.png b/public/logo512.png deleted file mode 100755 index 81efd5f5..00000000 Binary files a/public/logo512.png and /dev/null differ diff --git a/public/logos/icon-blue.svg b/public/logos/icon-blue.svg new file mode 100644 index 00000000..6b6310a6 --- /dev/null +++ b/public/logos/icon-blue.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/logos/icon-fail.svg b/public/logos/icon-fail.svg new file mode 100644 index 00000000..cc1e5b24 --- /dev/null +++ b/public/logos/icon-fail.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/logos/icon-white.svg b/public/logos/icon-white.svg new file mode 100644 index 00000000..f2ad650c --- /dev/null +++ b/public/logos/icon-white.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/logos/logo-black-wide.svg b/public/logos/logo-black-wide.svg new file mode 100644 index 00000000..5f313898 --- /dev/null +++ b/public/logos/logo-black-wide.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/logos/logo-home.svg b/public/logos/logo-home.svg new file mode 100644 index 00000000..3e65b582 --- /dev/null +++ b/public/logos/logo-home.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/logos/logo-white-wide.svg b/public/logos/logo-white-wide.svg new file mode 100644 index 00000000..25b122b5 --- /dev/null +++ b/public/logos/logo-white-wide.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/logos/logo192.png b/public/logos/logo192.png new file mode 100644 index 00000000..22f098ed Binary files /dev/null and b/public/logos/logo192.png differ diff --git a/public/logos/logo512.png b/public/logos/logo512.png new file mode 100644 index 00000000..e9dbf74e Binary files /dev/null and b/public/logos/logo512.png differ diff --git a/public/manifest.json b/public/manifest.json index ffa26a67..8e5f17b5 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "Rocket Project", - "name": "Rocket Bootcamp Project", + "short_name": "Markan Where", + "name": "Makan Where my @markan.sg", "icons": [ { "src": "favicon.ico", @@ -8,12 +8,12 @@ "type": "image/x-icon" }, { - "src": "logo192.png", + "src": "logos/logo192.png", "type": "image/png", "sizes": "192x192" }, { - "src": "logo512.png", + "src": "logos/logo512.png", "type": "image/png", "sizes": "512x512" } diff --git a/src/App.css b/src/App.css index 97b7c578..497566af 100644 --- a/src/App.css +++ b/src/App.css @@ -1,19 +1,283 @@ -.App { +@font-face { + font-family: "Satoshi"; + src: url("./fonts/Satoshi/Satoshi-Medium.woff2") format("woff2"), + url("./fonts/Satoshi/Satoshi-Medium.woff") format("woff"), + url("./fonts/Satoshi/Satoshi-Medium.ttf") format("truetype"); + font-weight: 400; + font-display: swap; + font-style: normal; +} + +@font-face { + font-family: "Satoshi"; + src: url("./fonts/Satoshi/Satoshi-Bold.woff2") format("woff2"), + url("./fonts/Satoshi/Satoshi-Bold.woff") format("woff"), + url("./fonts/Satoshi/Satoshi-Bold.ttf") format("truetype"); + font-weight: 700; + font-display: swap; + font-style: normal; +} + +@font-face { + font-family: "Oakes Grotesk"; + src: url("./fonts/Oakes-Grotesk/Oakes-Grotesk-Bold.ttf") format("truetype"); + font-weight: 700; + font-display: swap; + font-style: normal; +} + +* { + font-family: "Satoshi", sans-serif; + padding: 0; + margin: 0; + box-sizing: border-box; +} + +html, +body, +body #root { + overflow: hidden; + height: 100%; +} + +ul { + list-style-type: none; +} + +/* General Styling */ + +.container, +.screen { + height: 100%; + min-height: 600px; +} + +.screen { text-align: center; + padding: 30px 30px; +} + +#home, +#instructions, +#question, +#final { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 20px; +} + +#instructions, +#question { + background-color: #0078ef; + color: white; } -.App-logo { - height: 40vmin; - pointer-events: none; +h1, +h2, +h3 { + font-family: "Oakes Grotesk", sans-serif; + text-transform: uppercase; } -.App-header { - background-color: #282c34; - min-height: 100vh; +h2 { + font-size: 40px; + letter-spacing: -1px; + line-height: 0.9; +} + +h4, +button, +.food-notes, +#home #settings-nav { + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 700; + font-size: 12px; + line-height: 1.1; +} + +img { + width: 100%; + object-fit: cover; + border-radius: 5px; + min-height: 0; + flex: 1 1 auto; +} + +button { + padding: 15px; + border: none; + background-color: #0078ef; + color: white; + border-radius: 5px; + width: 100%; +} + +.header img { + width: 100%; + border-radius: 0; + min-width: 0; +} + +/* Home Page */ + +#home .header { display: flex; flex-direction: column; align-items: center; + width: 100%; + gap: 20px; +} + +#home .header img { + width: 100%; + min-width: 0; +} + +#home .header #long-logo { + display: none; +} + +#home .hero-image { + position: relative; + width: 100%; + flex: 1 1 auto; + min-height: 0; + display: flex; +} + +#home .hero-image #logo { + position: absolute; + top: -4vw; + left: 6%; + z-index: 5; + height: 18vw; + width: auto; +} + +#home .footer { + width: 100%; + display: flex; + gap: 10px; +} +@media (min-width: 950px) { + #home .hero-image #logo { + display: none; + } + #home .header #long-logo { + display: block; + } + #home .header #stacked-logo { + display: none; + } +} + +/* Settings */ + +#home .footer #settings { + display: flex; justify-content: center; - font-size: calc(10px + 2vmin); + align-items: center; + width: fit-content; + z-index: 11; +} + +#home .footer #settings img { + border-radius: 0; +} + +#home #settings-nav { + display: flex; + flex-direction: column; + position: fixed; + z-index: 10; + padding: 25px; + background-color: #0078ef; color: white; + border-radius: 5px; + bottom: 83px; + right: 30px; + gap: 20px; + transform-origin: bottom right; + text-align: left; +} + +#home #settings-nav h2 { + font-size: 20px; + letter-spacing: 0; +} + +#home #settings-nav h4 { + line-height: 1.4; +} + +#home #settings-nav #settings-checklist { + display: flex; + flex-direction: column; + gap: 10px; + padding-bottom: 20px; + border-bottom: 2px dotted white; +} + +#home #settings-nav .checklist { + display: flex; + gap: 5px; +} + +.slider { + width: 100%; + padding: 10px 0px; +} + +.slider-track { + height: 6px; + border-radius: 3px; + border: 1.5px solid white; + background-color: white; +} + +.slider-track.slider-track-0 { + background-color: #0078ef; +} + +.slider-thumb { + background-color: black; + top: 5px; + width: 16px; + height: 15px; + border-radius: 100%; + /* remove default outline when selected */ + outline: none; +} + +/* Instructions Page */ + +#instructions .header { + display: flex; + width: 100%; + align-items: flex-start; + justify-content: space-between; + padding-bottom: 20px; + border-bottom: 1px solid white; +} + +#instructions #instructions-box { + flex: 1 1 auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + gap: 20px; +} + +#instructions #instructions-box h4 { + font-size: 15px; +} + +#instructions button { + background-color: white; + color: #0078ef; } diff --git a/src/App.js b/src/App.js index 4a6f800f..a08aad1b 100644 --- a/src/App.js +++ b/src/App.js @@ -1,20 +1,118 @@ -import React from "react"; -import logo from "./logo.png"; +import React, { useEffect, useState } from "react"; +import Papa from "papaparse"; +import axios from "axios"; +import HomeScreen from "./Components/HomeScreen"; +import Instructions from "./Components/Instructions"; +import QuestionScreen from "./Components/QuestionScreen/QuestionScreen"; +import FinalScreen from "./Components/FinalScreen/FinalScreen"; import "./App.css"; -class App extends React.Component { - render() { - return ( -
-
- logo -

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

-
-
+const dataSource = + "https://docs.google.com/spreadsheets/d/1lr6rakViESEyL92WLERkX7ZY3lRuKr5O8UG5B7LlIq4/export?format=csv"; + +const App = () => { + const [data, setData] = useState(null); + const [stage, setStage] = useState(1); + const [locationAvailable, setLocationAvailable] = useState(false); + const [meal, setMeal] = useState(""); + const [type, setType] = useState(""); + const [area, setArea] = useState(""); + const [settings, setSettings] = useState({ + searchRadius: 1, + firstTime: true, + halal: false, + vegetarian: false, + }); + + useEffect(() => { + getCsvData(); + if ("geolocation" in navigator) { + setLocationAvailable(true); + } + if (localStorage.getItem("settings") !== null) { + setSettings(JSON.parse(localStorage.getItem("settings"))); + } + }, []); + + const getCsvData = () => { + axios.get(dataSource).then((rawOutput) => { + const outputData = Papa.parse(rawOutput.data, { + header: true, + skipEmptyLines: true, + }); + setData(outputData.data); + }); + }; + + const handleNext = () => { + if (settings["firstTime"]) { + setStage((current) => current + 1); + if (stage === 2) { + let settingsCopy = Object.assign({}, settings); + settingsCopy.firstTime = false; + setSettings(settingsCopy); + localStorage.setItem("settings", JSON.stringify(settings)); + } + } else { + setStage((current) => (current === 1 ? current + 2 : current + 1)); + } + }; + + const handleRestart = () => { + setStage(1); + setMeal(""); + setType(""); + setArea(""); + }; + + const handleUpdate = (name, value) => { + if (name === "area") { + setArea(value); + } else if (name === "meal") { + setMeal(value); + } else if (name === "type") { + setType(value); + } else if (name === "settings") { + setSettings(value); + } + }; + + let currentStage; + if (stage === 1) { + currentStage = ( + + ); + } else if (stage === 2) { + currentStage = ; + } else if (stage === 3) { + currentStage = ( + + ); + } else if (stage === 4) { + currentStage = ( + ); } -} + + return
{currentStage}
; +}; export default App; diff --git a/src/Components/DisplayMeal.js b/src/Components/DisplayMeal.js new file mode 100644 index 00000000..a27133fa --- /dev/null +++ b/src/Components/DisplayMeal.js @@ -0,0 +1,56 @@ +const DisplayMeal = (props) => { + let display; + const meal = props.meal; + let mealTags = []; + if (meal) { + if (meal.TAGS) { + const mealTagsArray = meal.TAGS.split(", "); + mealTagsArray.forEach((tag) => { + const tagLower = tag.toLowerCase(); + mealTags.push( +

+ {tag} +

+ ); + }); + } else { + mealTags = ""; + } + + display = ( +
+

+ {meal.NOTES} +

+ {meal.NAME} +
+

{meal.NAME}

+

{meal.ADDRESS}

+
{mealTags}
+
+
+ ); + } else { + display = ( +
+

+ I couldn't +
+ find anything +

+ logo +

+ that fits +
+ your criteria +

+
+ ); + } + return display; +}; + +export default DisplayMeal; diff --git a/src/Components/Fade.js b/src/Components/Fade.js new file mode 100644 index 00000000..cca74993 --- /dev/null +++ b/src/Components/Fade.js @@ -0,0 +1,17 @@ +import { motion } from "framer-motion"; + +const Fade = (props) => { + return ( + + {props.children} + + ); +}; + +export default Fade; diff --git a/src/Components/FinalScreen/FinalScreen.css b/src/Components/FinalScreen/FinalScreen.css new file mode 100644 index 00000000..1c8b6b95 --- /dev/null +++ b/src/Components/FinalScreen/FinalScreen.css @@ -0,0 +1,100 @@ +#final .header { + width: 100%; +} + +#final .food-links { + display: flex; + width: 100%; + gap: 8px; +} + +#final .food-display { + flex: 1 1 auto; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; + width: 100%; + min-height: 0; + position: relative; +} + +#final .food-notes { + position: absolute; + top: 20px; + left: -10px; + background-color: #0078ef; + color: white; + padding: 10px 15px; + width: fit-content; + text-align: left; + border-radius: 5px; +} + +#final #food-hearsay { + background-color: #ff4a31; +} + +#final .meal-tags { + display: flex; + justify-content: center; + gap: 5px; + margin-top: 10px; +} + +#final .meal-tags h4 { + color: white; + padding: 6px 10px; + width: fit-content; + height: 25px; + border-radius: 15px; +} + +#final .meal-tags #veg { + background-color: #0fc771; +} + +#final .meal-tags #halal { + background-color: #fd8156; +} + +#final #logo-failed { + flex: 0 1 auto; + width: 50vw; + height: auto; +} + +@media (min-width: 950px) { + #final #logo-failed { + width: 20vw; + min-width: 20vw; + height: 20vw; + } +} + +#final .footer { + width: 100%; + display: flex; + flex-direction: column; + gap: 8px; +} + +@media (min-width: 950px) { + #final .food-display { + flex-direction: row; + gap: 20px; + width: 100%; + min-height: 0; + } + + #final .food-display #food-details { + flex: 1; + } + + #final .food-display img { + height: 100%; + min-width: 0; + flex: 3; + } +} diff --git a/src/Components/FinalScreen/FinalScreen.js b/src/Components/FinalScreen/FinalScreen.js new file mode 100644 index 00000000..ce832937 --- /dev/null +++ b/src/Components/FinalScreen/FinalScreen.js @@ -0,0 +1,100 @@ +import React, { useState } from "react"; +import DisplayMeal from "../DisplayMeal"; +import Fade from "../Fade"; +import { getDistance } from "geolib"; +import { randomNumber } from "../../utils"; +import "./FinalScreen.css"; + +const FinalScreen = (props) => { + const getCoords = (obj) => { + const cords = obj.COORDS.split(", "); + return { + latitude: Number(cords[0]), + longitude: Number(cords[1]), + }; + }; + + const getApplicableList = (arr, meal, type, area, settings) => { + const halal = settings["halal"] ? "H" : ""; + const veg = settings["vegetarian"] ? "V" : ""; + let applicableList = []; + const regex = new RegExp("^[A-Z]{2}$"); + for (let i = 0; i < arr.length; i++) { + if ( + arr[i].MEAL.includes(meal) && + arr[i].TYPE.includes(type) && + arr[i].TAGS.includes(halal) && + arr[i].TAGS.includes(veg) + ) { + if (regex.test(area) || area === "") { + if (arr[i].AREA.includes(area)) { + applicableList.push(arr[i]); + } + } else { + const distance = getDistance(props.area, getCoords(arr[i])); + if (distance < props.settings["searchRadius"] * 1000) { + applicableList.push(arr[i]); + } + } + } + } + + return applicableList; + }; + + const resultArray = getApplicableList( + props.data, + props.meal, + props.type, + props.area, + props.settings + ); + + const [select, setSelect] = useState(randomNumber(resultArray.length)); + + const result = resultArray[select]; + return ( + +
+ logo +
+ + +
+ {resultArray.length !== 0 && ( +
+ + {resultArray.length !== 1 && ( + + )} +
+ )} + +
+
+ ); +}; + +export default FinalScreen; diff --git a/src/Components/HomeScreen.js b/src/Components/HomeScreen.js new file mode 100644 index 00000000..05bfba81 --- /dev/null +++ b/src/Components/HomeScreen.js @@ -0,0 +1,59 @@ +import { useEffect, useState } from "react"; +import Settings from "./Settings"; +import Fade from "./Fade"; +import { randomNumber } from "../utils"; + +const imageList = [ + "https://i.imgur.com/GFU4Rck.jpg", + "https://i.imgur.com/7JX5nqm.jpg", + "https://i.imgur.com/CzmORKO.jpg", + "https://i.imgur.com/P4dTYzY.jpg", + "https://i.imgur.com/ciSqZkv.jpg", + "https://i.imgur.com/YzyslzF.jpg", + "https://i.imgur.com/hwu8nZ3.jpg", +]; + +const HomeScreen = (props) => { + const [select, setSelect] = useState(null); + const [navShow, setNavShow] = useState(false); + + useEffect(() => { + setSelect(randomNumber(imageList.length)); + }, []); + + const getRandomImage = (number) => { + return imageList[number]; + }; + + const handleClick = () => { + setNavShow((state) => !state); + }; + + const randomImage = getRandomImage(select); + return ( + +
+ + +

By @markan.sg

+
+
+ Food pic from @markan.sg! + +
+
+ + +
+ +
+ ); +}; + +export default HomeScreen; diff --git a/src/Components/Instructions.js b/src/Components/Instructions.js new file mode 100644 index 00000000..fcbc1581 --- /dev/null +++ b/src/Components/Instructions.js @@ -0,0 +1,27 @@ +import Fade from "./Fade"; + +const Instructions = (props) => { + return ( + +
+ logo +
+
+

+ Don't know +
+ what to eat? +

+

1. Answer 3 questions

+

2. I’ll randomly recommend you something!

+
+

+ (Enable location sharing in settings to get location based + recommendations!) +

+ +
+ ); +}; + +export default Instructions; diff --git a/src/Components/QuestionScreen/Question.css b/src/Components/QuestionScreen/Question.css new file mode 100644 index 00000000..775bf3ee --- /dev/null +++ b/src/Components/QuestionScreen/Question.css @@ -0,0 +1,110 @@ +#question .header { + display: flex; + width: 100%; + align-items: flex-start; + justify-content: space-between; + padding-bottom: 20px; + border-bottom: 1px solid white; +} + +#question .question-box { + flex: 1 1 auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + gap: 20px; +} + +.question-options { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 0px 10px; +} + +.question-even { + gap: 10px; +} + +#question button { + background-color: white; + color: #0078ef; + height: 92px; + width: 92px; + border-radius: 60px; + display: flex; + justify-content: center; + align-items: center; + font-size: 11px; +} + +#question #get-location { + width: fit-content; + height: auto; + background-color: #0078ef; + color: white; + border: 1px solid white; + display: flex; + margin: 5px; + gap: 5px; +} + +#question #get-location img { + height: 12px; + width: auto; +} + +#question #logo-button { + padding: 0; + width: 40vw; + height: 40vw; + border-radius: 20vw; + margin-bottom: 10px; +} + +#question .footer { + display: flex; + justify-content: space-between; + width: 100%; +} + +#question .footer button, +#question #skip { + background-color: transparent; + color: white; + height: fit-content; + width: fit-content; + padding: 0px 0px 2px 0px; + border-radius: 0; + border-bottom: 1px solid white; + margin-bottom: 0px; +} + +@media (min-width: 950px) { + #question .header { + padding-bottom: 30px; + } + + #question .question-box { + gap: 30px; + } + + .question-options { + gap: 0px 20px; + } + + #question button { + height: 150px; + width: 150px; + border-radius: 100px; + font-size: 15px; + } + + #question #logo-button { + width: 20vw; + height: 20vw; + border-radius: 10vw; + } +} diff --git a/src/Components/QuestionScreen/QuestionDisplay.js b/src/Components/QuestionScreen/QuestionDisplay.js new file mode 100644 index 00000000..e2a15352 --- /dev/null +++ b/src/Components/QuestionScreen/QuestionDisplay.js @@ -0,0 +1,43 @@ +import { motion } from "framer-motion"; +import { isOdd } from "../../utils"; +import "./Question.css"; + +const QuestionDisplay = (props) => { + const { question } = props; + let questionList = question.value.map((option, i) => ( + + + + )); + return ( +
+

{question.q}

+
    + {questionList} +
+ {props.questionNo === 3 && props.locationButton && ( + + )} + +
+ ); +}; + +export default QuestionDisplay; diff --git a/src/Components/QuestionScreen/QuestionScreen.js b/src/Components/QuestionScreen/QuestionScreen.js new file mode 100644 index 00000000..b412e68b --- /dev/null +++ b/src/Components/QuestionScreen/QuestionScreen.js @@ -0,0 +1,119 @@ +import React, { useState } from "react"; +import Fade from "../Fade"; +import QuestionDisplay from "./QuestionDisplay"; +import "./Question.css"; + +const questions = [ + { + q: "Which?", + name: "meal", + value: ["Breakfast", "Brunch", "Lunch", "Dinner", "Dessert"], + display: ["Breakfast", "Brunch", "Lunch", "Dinner", "Dessert"], + }, + { + q: "What?", + name: "type", + value: ["H", "C", "R", "T"], + display: ["Hawker", "Casual Dining", "$$$ Dining", "Takeaway Only"], + }, + { + q: "Where?", + name: "area", + value: ["NT", "NE", "CN", "WT", "ET"], + display: ["North", "Northeast", "Central", "West", "East"], + }, +]; + +const QuestionScreen = (props) => { + const [questionNo, setQuestionNo] = useState(1); + const [locationButton, setLocationButton] = useState(props.locationAvailable); + const [buttonText, setButtonText] = useState("Use Current Location"); + + const handleClick = (e) => { + const { name, value } = e.target; + props.handleUpdate(name, value); + if (questionNo < 4) { + setQuestionNo((current) => current + 1); + } else { + props.handleNext(); + } + }; + + const handleSkip = () => { + setQuestionNo((current) => current + 1); + }; + + const handleBack = () => { + setQuestionNo((current) => current - 1); + }; + + const handleLocation = async () => { + await setButtonText("Getting location..."); + await navigator.geolocation.getCurrentPosition( + (position) => { + props.handleUpdate("area", { + latitude: position.coords.latitude, + longitude: position.coords.longitude, + }); + setQuestionNo((current) => current + 1); + }, + (error) => { + if (error.code === error.PERMISSION_DENIED) { + alert( + "Can't find your location! Enable location services for your browser in settings." + ); + setLocationButton(false); + } + }, + { + enableHighAccuracy: false, + timeout: 5000, + maximumAge: Infinity, + } + ); + }; + + let currentQuestion = questions[questionNo - 1]; + let displayQuestion; + if (questionNo < 4) { + displayQuestion = ( + + ); + } else if (questionNo === 4) { + displayQuestion = ( + +

Tap here

+ +

+ to get +
+ your rec! +

+
+ ); + } + return ( + +
+ logo +
+ {displayQuestion} +
+ + {questionNo !== 1 && } +
+
+ ); +}; + +export default QuestionScreen; diff --git a/src/Components/Settings.js b/src/Components/Settings.js new file mode 100644 index 00000000..c0b61da7 --- /dev/null +++ b/src/Components/Settings.js @@ -0,0 +1,65 @@ +import React from "react"; +import { AnimatePresence } from "framer-motion"; +import ReactSlider from "react-slider"; +import Fade from "./Fade"; + +const settingOptions = ["halal", "vegetarian"]; + +const Settings = (props) => { + const handleClick = (e) => { + const settings = Object.assign({}, props.settings); + let value = e.target.value; + settings[value] = !settings[value]; + localStorage.setItem("settings", JSON.stringify(settings)); + props.handleUpdate("settings", settings); + }; + + const handleChange = (value) => { + const settings = Object.assign({}, props.settings); + settings["searchRadius"] = value; + localStorage.setItem("settings", JSON.stringify(settings)); + props.handleUpdate("settings", settings); + }; + + return ( + + {props.navShow && ( + +

Filters

+
+ {settingOptions.map((option) => ( +
+ + {option} +
+ ))} +
+ +
+ )} +
+ ); +}; + +export default Settings; diff --git a/src/fonts/Oakes-Grotesk/Oakes-Grotesk-Bold.ttf b/src/fonts/Oakes-Grotesk/Oakes-Grotesk-Bold.ttf new file mode 100644 index 00000000..2bf97980 Binary files /dev/null and b/src/fonts/Oakes-Grotesk/Oakes-Grotesk-Bold.ttf differ diff --git a/src/fonts/Satoshi/Satoshi-Bold.ttf b/src/fonts/Satoshi/Satoshi-Bold.ttf new file mode 100644 index 00000000..00bc985b Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Bold.ttf differ diff --git a/src/fonts/Satoshi/Satoshi-Bold.woff b/src/fonts/Satoshi/Satoshi-Bold.woff new file mode 100644 index 00000000..bba8257f Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Bold.woff differ diff --git a/src/fonts/Satoshi/Satoshi-Bold.woff2 b/src/fonts/Satoshi/Satoshi-Bold.woff2 new file mode 100644 index 00000000..0a8db7a4 Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Bold.woff2 differ diff --git a/src/fonts/Satoshi/Satoshi-Medium.ttf b/src/fonts/Satoshi/Satoshi-Medium.ttf new file mode 100644 index 00000000..ab149b71 Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Medium.ttf differ diff --git a/src/fonts/Satoshi/Satoshi-Medium.woff b/src/fonts/Satoshi/Satoshi-Medium.woff new file mode 100644 index 00000000..cef3226e Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Medium.woff differ diff --git a/src/fonts/Satoshi/Satoshi-Medium.woff2 b/src/fonts/Satoshi/Satoshi-Medium.woff2 new file mode 100644 index 00000000..ffd0ac96 Binary files /dev/null and b/src/fonts/Satoshi/Satoshi-Medium.woff2 differ diff --git a/src/index.js b/src/index.js index 31508db1..04d8d115 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import App from "./App"; +// import { BrowserRouter } from "react-router-dom"; const root = ReactDOM.createRoot(document.getElementById("root")); -root.render( - - - -); +root.render(); diff --git a/src/logo.png b/src/logo.png index a7e08590..630b6102 100755 Binary files a/src/logo.png and b/src/logo.png differ diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 00000000..2a40a754 --- /dev/null +++ b/src/utils.js @@ -0,0 +1,9 @@ +const randomNumber = (limit) => { + return Math.floor(Math.random() * limit); +}; + +const isOdd = (number) => { + return number % 2 ? true : false; +}; + +export { randomNumber, isOdd };