diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..aef866d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#083512", + "titleBar.activeBackground": "#0B4B19", + "titleBar.activeForeground": "#F0FDF3" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1d94f2e..acb3a6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,13 @@ "@testing-library/user-event": "^13.5.0", "axios": "^0.27.2", "fontawesome": "^5.6.3", + "framer-motion": "^7.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-parallax-mouse": "^1.7.3", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", + "react-toastify": "^9.0.8", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -2127,6 +2129,21 @@ "postcss-selector-parser": "^6.0.10" } }, + "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.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -2946,6 +2963,64 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@motionone/animation": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz", + "integrity": "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==", + "dependencies": { + "@motionone/easing": "^10.14.0", + "@motionone/types": "^10.14.0", + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.13.1.tgz", + "integrity": "sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ==", + "dependencies": { + "@motionone/animation": "^10.13.1", + "@motionone/generators": "^10.13.1", + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz", + "integrity": "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==", + "dependencies": { + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz", + "integrity": "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==", + "dependencies": { + "@motionone/types": "^10.14.0", + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz", + "integrity": "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" + }, + "node_modules/@motionone/utils": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz", + "integrity": "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==", + "dependencies": { + "@motionone/types": "^10.14.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5509,6 +5584,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -8099,6 +8182,34 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.2.1.tgz", + "integrity": "sha512-bt2ZqqGpPsW6UojYUa5poWQJu3sDr4Dp3IZsdVBYdKUJ8p+9PxOk1fYRAT8lTGGmaC5HFoKrbDXQeKWGAKZz9g==", + "dependencies": { + "@motionone/dom": "10.13.1", + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "popmotion": "11.0.5", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "dependencies": { + "tslib": "2.4.0" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -8448,6 +8559,11 @@ "he": "bin/he" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -12378,6 +12494,17 @@ "node": ">=4" } }, + "node_modules/popmotion": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz", + "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==", + "dependencies": { + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + } + }, "node_modules/postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -14068,6 +14195,18 @@ } } }, + "node_modules/react-toastify": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.8.tgz", + "integrity": "sha512-EwM+teWt49HSHx+67qI08yLAW1zAsBxCXLCsUfxHYv1W7/R3ZLhrqKalh7j+kjgPna1h5LQMSMwns4tB4ww2yQ==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -15147,6 +15286,15 @@ "webpack": "^5.0.0" } }, + "node_modules/style-value-types": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz", + "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + } + }, "node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -18155,6 +18303,21 @@ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", "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.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -18765,6 +18928,64 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "@motionone/animation": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz", + "integrity": "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==", + "requires": { + "@motionone/easing": "^10.14.0", + "@motionone/types": "^10.14.0", + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "@motionone/dom": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.13.1.tgz", + "integrity": "sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ==", + "requires": { + "@motionone/animation": "^10.13.1", + "@motionone/generators": "^10.13.1", + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "@motionone/easing": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz", + "integrity": "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==", + "requires": { + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "@motionone/generators": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz", + "integrity": "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==", + "requires": { + "@motionone/types": "^10.14.0", + "@motionone/utils": "^10.14.0", + "tslib": "^2.3.1" + } + }, + "@motionone/types": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz", + "integrity": "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" + }, + "@motionone/utils": { + "version": "10.14.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz", + "integrity": "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==", + "requires": { + "@motionone/types": "^10.14.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -20660,6 +20881,11 @@ "wrap-ansi": "^7.0.0" } }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -22530,6 +22756,28 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, + "framer-motion": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.2.1.tgz", + "integrity": "sha512-bt2ZqqGpPsW6UojYUa5poWQJu3sDr4Dp3IZsdVBYdKUJ8p+9PxOk1fYRAT8lTGGmaC5HFoKrbDXQeKWGAKZz9g==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "@motionone/dom": "10.13.1", + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "popmotion": "11.0.5", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + } + }, + "framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "requires": { + "tslib": "2.4.0" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -22775,6 +23023,11 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -25617,6 +25870,17 @@ } } }, + "popmotion": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz", + "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==", + "requires": { + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + } + }, "postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -26660,6 +26924,14 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-toastify": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.8.tgz", + "integrity": "sha512-EwM+teWt49HSHx+67qI08yLAW1zAsBxCXLCsUfxHYv1W7/R3ZLhrqKalh7j+kjgPna1h5LQMSMwns4tB4ww2yQ==", + "requires": { + "clsx": "^1.1.1" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -27457,6 +27729,15 @@ "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "requires": {} }, + "style-value-types": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz", + "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==", + "requires": { + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + } + }, "stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", diff --git a/package.json b/package.json index afe6029..825ebfb 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,13 @@ "@testing-library/user-event": "^13.5.0", "axios": "^0.27.2", "fontawesome": "^5.6.3", + "framer-motion": "^7.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-parallax-mouse": "^1.7.3", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", + "react-toastify": "^9.0.8", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/App.js b/src/App.js index a2c4800..5585e27 100644 --- a/src/App.js +++ b/src/App.js @@ -13,6 +13,7 @@ import Your11 from "./pages/your11/your11"; import Leaderboard from "./pages/leaderboard/leaderboard"; import Webteam from "./pages/webteam"; import RatingChanges from "./pages/ratingchanges/ratingchanges"; +import toast, { ToastUtils } from "./utils/toastContainer"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import "./App.css"; import Logout from "./pages/logout/logout"; @@ -30,7 +31,7 @@ function App() { {/* */} } loader={} /> - } />} /> + } toast={{ container: , toast }} />} /> } @@ -41,8 +42,8 @@ function App() { element={} loader={} /> - } loader={} /> - } loader={} /> + } loader={} toast={{ container: , toast }} /> + } loader={} toast={{ container: , toast }} /> } diff --git a/src/components/loader.css b/src/components/loader.css index f63ff34..05c0cab 100644 --- a/src/components/loader.css +++ b/src/components/loader.css @@ -1,178 +1,168 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto+Mono"); -/* -body, html { - height: 100%; - margin: 0; - padding: 0 -} */ - -/* body { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - perspective: 400px; - background: black -} */ - -/* div { - height: 50px; - width: 50px; - box-sizing: border-box; -} */ - -#cube { - height: 50px; - width: 50px; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: center; -} - -/* p { - font-family: "sherrif", monospace; - font-size: 20px; - color: #2ecc71; - margin: 0; -} */ - -#cube { - height: 100px; - width: 100px; - transform-style: preserve-3d; - transform-origin: center center; - transform: rotateY(-20deg) rotateX(50deg) rotatez(0deg); - animation-iteration-count: infinite; - animation-duration: 3s; - animation-timing-function: linear; -} - -#cube { - position: absolute; - border: 5px solid #2ecc71; -} - -#back { - transform-origin: top; - transform: rotateX(90deg); - background: black; - animation: back 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; +.loader-container { + position: fixed; + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; + width: 100vw; + z-index: 9999; + background: rgba(0, 0, 0, 0.9); } -#right { - transform-origin: right; - transform: rotateY(90deg) rotateX(0deg); - background: linear-gradient(-135deg, #000000 0%, #292d2b 100%); - animation: right 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; +.loader-container .loader { + height: 100px; + width: 100px; + transform-style: preserve-3d; + perspective: 2000px; + transform: rotateX(-30deg) rotateY(-45deg) scale(1.2); +} + +.loader-container .loader .holder { + transform-style: preserve-3d; + transform: translate3d(0em, 3em, 1.5em); +} + +.loader-container .loader .holder:last-child { + transform: rotateY(-90deg) rotateX(90deg) translate3d(0, 3em, 1.5em); +} + +.loader-container .loader .holder:first-child { + transform: rotateZ(-90deg) rotateX(-90deg) translate3d(0, 3em, 1.5em); +} + +.loader-container .loader .holder:nth-child(1) .box { + background-color: #1fbcd3; +} +.loader-container .loader .holder:nth-child(1) .box:before { + background-color: #126d7a; +} +.loader-container .loader .holder:nth-child(1) .box:after { + background-color: #1894a7; +} +.loader-container .loader .holder:nth-child(2) .box { + background-color: #cbe2b4; +} +.loader-container .loader .holder:nth-child(2) .box:before { + background-color: #98c66a; +} +.loader-container .loader .holder:nth-child(2) .box:after { + background-color: #b2d48f; +} +.loader-container .loader .holder:nth-child(3) .box { + background-color: #f6b6ca; +} +.loader-container .loader .holder:nth-child(3) .box:before { + background-color: #eb5b88; +} +.loader-container .loader .holder:nth-child(3) .box:after { + background-color: #f089a9; +} + +.holder .box { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + transform-style: preserve-3d; + animation: ani-box 6s infinite; + width: 3em; + height: 3em; +} + +.holder .box:before, +.holder .box:after { + position: absolute; + width: 100%; + height: 100%; + content: ""; +} + +.holder .box:before { + left: 100%; + bottom: 0; + transform: rotateY(90deg); + transform-origin: 0 50%; +} + +.holder .box:after { + left: 0; + bottom: 100%; + transform: rotateX(90deg); + transform-origin: 0 100%; +} + +@keyframes ani-box { + 8.33% { + transform: translate3d(-50%, -50%, 0) scaleZ(2); + } + 16.7% { + transform: translate3d(-50%, -50%, -3em) scaleZ(1); + } + 25% { + transform: translate3d(-50%, -100%, -3em) scaleY(2); + } + 33.3% { + transform: translate3d(-50%, -150%, -3em) scaleY(1); + } + 41.7% { + transform: translate3d(-100%, -150%, -3em) scaleX(2); + } + 50% { + transform: translate3d(-150%, -150%, -3em) scaleX(1); + } + 58.3% { + transform: translate3d(-150%, -150%, 0) scaleZ(2); + } + 66.7% { + transform: translate3d(-150%, -150%, 0) scaleZ(1); + } + 75% { + transform: translate3d(-150%, -100%, 0) scaleY(2); + } + 83.3% { + transform: translate3d(-150%, -50%, 0) scaleY(1); + } + 91.7% { + transform: translate3d(-100%, -50%, 0) scaleX(2); + } + 100% { + transform: translate3d(-50%, -50%, 0) scaleX(1); + } +} + +.loader-line .loader__anim { + display: block; + width: 195px; + height: 4.5px; + border-radius: 5px; + background: linear-gradient( + to right, + #861a54, + #08a3dc, + #b1c200, + #e7c001, + #ee9a16, + #de1317, + #861a54, + #08a3dc, + #b1c200, + #e7c001, + #ee9a16, + #de1317, + #861a54 + ); + background-size: 200%; + background-position: 0 0; + animation: 1s linear infinite normal both rainbow; +} + +@keyframes rainbow { + 0% { + background-position: 0 0; + } + 100% { + background-position: 100% 0; + } } - -#left { - background: black; - transform-origin: left; - transform: rotateY(-90deg); - animation: left 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; -} - -#top { - transform: translatez(50px); - background: linear-gradient(135deg, #000000 0%, #292d2b 100%); - animation: top 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; -} - -#bottom { - background: black; - transform-origin: top; - transform: translatez(0px) rotateY(0deg) rotateX(0deg); - animation: bottom 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; -} - -#front { - transform-origin: bottom; - transform: translatez(00px) rotatex(-90deg); - background: linear-gradient(-135deg, #292d2b 0%, #000000 100%); - animation: front 1.5s cubic-bezier(0.8, 0.2, 0.2, 0.8) infinite alternate; -} - -/* span{ - animation-name: dots; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-timing-function: linear; -} */ - -#d1 { - animation-delay: 0.2s; - animation-name: dots; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-timing-function: linear; -} - -#d2 { - animation-delay: 0.4s; - animation-name: dots; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-timing-function: linear; -} - -#d3 { - animation-delay: 0.6s; - animation-name: dots; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-timing-function: linear; -} - -@keyframes top { - 100% { - border: 0px solid black; - transform: translatez(80px); - } -} - -@keyframes front { - 100% { - border: 0px solid black; - transform: translatey(30px) rotatex(-90deg); - } -} - -@keyframes right { - 100% { - border: 0px solid black; - transform: rotateY(90deg) translatez(30px); - } -} - -@keyframes back { - 100% { - border: 0px solid black; - transform: rotateX(90deg) translateZ(30px); - } -} - -@keyframes left { - 100% { - border: 0px solid transparent; - transform: rotateY(-90deg) translatez(30px); - } -} - -@keyframes bottom { - 100% { - border: 5px solid black; - transform: translatez(-30px); - } -} - -@keyframes dots { - 50% { - color: transparent; - } - - 100% { - color: transparent; - } -} \ No newline at end of file diff --git a/src/components/loader.js b/src/components/loader.js index 3c0a677..ae7e758 100644 --- a/src/components/loader.js +++ b/src/components/loader.js @@ -1,26 +1,42 @@ -import React, { Component } from "react"; import "./loader.css"; +import React from "react"; +import { AnimatePresence, motion } from "framer-motion"; -export class Loader extends Component { - render() { - return ( - <> -
-
-
-
-
-
- +function Loader() { + return ( + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
-

- XENIA'22. - . - . -

- - ); - } +
+
+ ); } -export default Loader; +export default Loader; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 770ee7d..b9746d9 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ import ReactDOM from "react-dom/client"; import "./index.css"; import App from "./App"; import reportWebVitals from "./reportWebVitals"; +import "react-toastify/dist/ReactToastify.css"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( diff --git a/src/pages/home/home.js b/src/pages/home/home.js index cd6c3b0..55d0508 100644 --- a/src/pages/home/home.js +++ b/src/pages/home/home.js @@ -8,48 +8,49 @@ import xeniadark from "../../assets/images/Xeniadark.png"; import bgcricwars3 from "../../assets/images/cricwarshomepage3.png"; import bgcricwars1 from "../../assets/images/cricwarshomepage1.png"; import bgcricwars2 from "../../assets/images/cricwarshomepage2.png"; -const Home = () => { +const Home = (props) => { + const [loading, setLoading] = useState(false) const [canRate, setCanRate] = useState(false); const [username, setUsername] = useState(null); const [canView, setCanView] = useState(false); const [canCreate, setCanCreate] = useState(false); const [isLoggedIn, setIsLoggedIn] = useState(false) - const fetchData = () => { - console.log(localStorage.getItem("auth-token")); - fetch("https://cricwars.herokuapp.com/users/me",{ + const fetchData = async () => { + + setLoading(true) + await fetch("https://cricwars.herokuapp.com/users/me", { method: "GET", - headers: { "content-type": "application/json", "Authorization":`Token ${localStorage.getItem("auth-token")}` }, + headers: { "content-type": "application/json", "Authorization": `Token ${localStorage.getItem("auth-token")}` }, }) .then(response => { return response.json() }) - .then(data => { - console.log(data) + .then(async data => { setCanRate(data.canRatePlayers); setCanView(data.canAccessFinalRatings); setCanCreate(data.canSelectTeam); + setLoading(false) // setPlayerArray(data) }) + setLoading(false) } - const checkAuth = () => { - if(localStorage.getItem("auth-token") !== null) setIsLoggedIn(true); + const checkAuth = async () => { + if (localStorage.getItem("auth-token") !== null) setIsLoggedIn(true); else setIsLoggedIn(false); - console.log(localStorage.getItem("auth-token"),"hehehhehe") - console.log(isLoggedIn) } useEffect(() => { - + setLoading(true) fetchData(); checkAuth(); - console.log(localStorage.getItem("auth-token"),"thishkjbj") + setLoading(false) }, []) - return ( + return (loading ? props.loader :
@@ -117,6 +118,3 @@ const Home = () => { }; export default Home; - - - diff --git a/src/pages/login/login.css b/src/pages/login/login.css index f374fb1..9dbe3e5 100644 --- a/src/pages/login/login.css +++ b/src/pages/login/login.css @@ -10,17 +10,16 @@ } */ .container { - - font-family: 'Open Sans', sans-serif; - color: var(--font-color); - box-sizing: border-box; - font-size: 16px; - height: fit-content; - display: flex; - align-items: center; - --font-color: #DCCAE9; - justify-content: center; - /* background: linear-gradient(90deg, rgba(44, 27, 71, 1) 0%, rgba(114, 76, 157, 1) 100%); */ + font-family: "Open Sans", sans-serif; + color: var(--font-color); + box-sizing: border-box; + font-size: 16px; + height: fit-content; + display: flex; + align-items: center; + --font-color: #dccae9; + justify-content: center; + /* background: linear-gradient(90deg, rgba(44, 27, 71, 1) 0%, rgba(114, 76, 157, 1) 100%); */ } /* body { @@ -32,64 +31,65 @@ } */ .form { - display: flex; - flex-direction: column; - /* background: rgba(0, 0, 0, .5); */ - box-sizing: border-box; - /* box-shadow: 0 15px 25px rgba(0, 0, 0, .6); */ - border-radius: 1em; - border: 1px solid var(--font-color); - padding: 1em 2em; + display: flex; + flex-direction: column; + /* background: rgba(0, 0, 0, .5); */ + box-sizing: border-box; + /* box-shadow: 0 15px 25px rgba(0, 0, 0, .6); */ + border-radius: 1em; + border: 1px solid var(--font-color); + padding: 1em 2em; } .header { - text-transform: uppercase; - font-weight: normal; - margin: 0 auto; - font-size: 1.5em; + text-transform: uppercase; + font-weight: normal; + margin: 0 auto; + font-size: 1.5em; } .form__div { - position: relative; - padding: 2em; + position: relative; + padding: 2em; } input { - width: 100%; - background: transparent; - color: var(--font-color); - font-size: 18px; - border: none; - border-bottom: 2px solid var(--font-color); - padding: 0.7em; + width: 100%; + background: transparent; + color: var(--font-color); + font-size: 18px; + border: none; + border-bottom: 2px solid var(--font-color); + padding: 0.7em; } .form__label { - position: absolute; - left: 2em; - /* top: ; */ - transition: all 300ms ease; + position: absolute; + left: 2em; + /* top: ; */ + z-index: -1; + transition: all 300ms ease; } -input:focus~.form__label, -input:valid~.form__label { - font-size: 14px; - color: rgba(114, 76, 157, 1); - top: 1em; +input:focus ~ .form__label, +input:valid ~ .form__label { + font-size: 14px; + color: rgba(114, 76, 157, 1); + top: 1em; } input:focus { - outline: none; + outline: none; } .submite { - width: 100%; - color: #DCCAE9; - border: 1px solid var(--font-color); - border-radius: 5px; - cursor: pointer; + width: 100%; + color: #dccae9; + border: 1px solid var(--font-color); + border-radius: 5px; + cursor: pointer; } .submite:hover { - background: rgba(114, 76, 157, 1); -} \ No newline at end of file + background: rgba(114, 76, 157, 1); +} diff --git a/src/pages/login/login.js b/src/pages/login/login.js index 4734cff..2fc47ee 100644 --- a/src/pages/login/login.js +++ b/src/pages/login/login.js @@ -3,81 +3,93 @@ import "./login.css"; import { useNavigate } from 'react-router-dom'; import { useState } from 'react'; -const Login = () => { +const Login = (props) => { - const navigate = useNavigate() + const [loading, setLoading] = useState(false) const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [fetchError, setFetchError] = useState(null); + const navigate = useNavigate() const authRedirect = () => { - if(localStorage.getItem("auth-token") !== null){ + if (localStorage.getItem("auth-token") !== null) { navigate("/ratings") } } useEffect(() => { // authRedirect(); - + }, [] ) const handleSubmit = (e) => { e.preventDefault(); - // setIsPending(true); - const data = {username,password} + setLoading(true); + const data = { username, password } fetch("https://cricwars.herokuapp.com/auth/token/login", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(data), }).then((res) => { - if(!res.ok){ - console.log(res) - setFetchError("Invalid Credentials!!!") - throw Error("Could not fetch the data."); - } - return res.json(); + if (!res.ok) { + props.toast.toast.error("Error: Invalid Credentials!") + setFetchError("Invalid Credentials!!!") + setLoading(false); + throw Error("Could not fetch the data."); + } + setLoading(false); + return res.json(); }).then((data) => { - localStorage.setItem("auth-token",data.auth_token) - localStorage.setItem("username",username) + localStorage.setItem("auth-token", data.auth_token) + localStorage.setItem("username", username) setFetchError(null) - navigate("/"); + props.toast.toast.success("Logged in successfully!") + setTimeout(() => { + setLoading(false); + }, 1600) + setTimeout(() => { + navigate("/"); + }, 1800) }); - }; - - return ( -
-
-

Login

-
- { - setUsername(e.target.value); - }} - /> - -
-
- { - setPassword(e.target.value); - }} - /> - -
-
- + }; + + return (loading ? props.loader : + <> + {props.toast.container} +
+ +

Login

+
+ { + setUsername(e.target.value); + }} + /> + +
+
+ { + setPassword(e.target.value); + }} + /> + +
+
+ +
+ {/* {fetchError &&

{fetchError}

} */} +
- {fetchError &&

{fetchError}

} - -
- ) + + ) } diff --git a/src/pages/ratings/ratings.js b/src/pages/ratings/ratings.js index f5810e9..99ad041 100644 --- a/src/pages/ratings/ratings.js +++ b/src/pages/ratings/ratings.js @@ -3,34 +3,45 @@ import React from "react"; import { useNavigate } from "react-router-dom"; import { useState, useEffect } from "react"; -import useFetch from "../useFetch"; - -const Ratings = () => { +const Ratings = (props) => { let totalPoints = 200; + + const [loading, setLoading] = useState(false) const [playerArray, setPlayerArray] = useState([]); const [pointsLeft, setPointsLeft] = useState(totalPoints); const [errorMessage, setErrorMessage] = useState(null); // const [isPending, setIsPending] = useState(false); const navigate = useNavigate(); - const fetchData = () => { - fetch("https://cricwars.herokuapp.com/players/", { + const fetchData = async () => { + setLoading(true); + await fetch("https://cricwars.herokuapp.com/players/", { headers: { "content-type": "application/json", Authorization: `Token ${localStorage.getItem("auth-token")}`, }, }) .then((response) => { + setLoading(false); return response.json(); }) .then((data) => { console.log(data); + setLoading(false); setPlayerArray(data); + }) + .catch((err) => { + setLoading(false); + props.toast.toast.error("Error: " + err?.message + ". Couldn't fetch player data!") }); }; + const authRedirect = () => { if (localStorage.getItem("auth-token") === null) { - navigate("/login"); + props.toast.toast.warn("Error: Log in required!"); + setTimeout(() => { + navigate("/login"); + }, 1000) } }; @@ -41,6 +52,7 @@ const Ratings = () => { sum += parseInt(player.rating); }); if (sum > totalPoints) { + props.toast.toast.error("Not Enough Points! (Remaining points < 0)") setErrorMessage("Not Enough Points!!"); } else { setErrorMessage(null); @@ -53,21 +65,23 @@ const Ratings = () => { authRedirect(); }, []); - const handleSubmit = (e) => { + const handleSubmit = async (e) => { e.preventDefault(); // setIsPending(true); + setLoading(true); const inst = { playerArray: playerArray, username: localStorage.getItem("username"), }; - console.log(JSON.stringify(inst)); if (pointsLeft < 0) { setErrorMessage("Not Enough Points!"); + setLoading(false) + props.toast.toast.error("Not Enough Points! (Remaining points < 0)") return; } - fetch("https://cricwars.herokuapp.com/players/", { + await fetch("https://cricwars.herokuapp.com/players/", { method: "POST", headers: { "content-type": "application/json", @@ -79,21 +93,32 @@ const Ratings = () => { // localStorage.removeItem("auth-token") // localStorage.removeItem("username") // setIsPending(false); - navigate("/"); - }); + props.toast.toast.success("Ratings Submitted Successfully!") + setTimeout(() => { + setLoading(false); + }, 1600) + setTimeout(() => { + navigate("/"); + }, 1800) + }) + .catch(err => { + setLoading(false); + props.toast.toast.error("Error: " + err?.message) + }) }; - return ( + return (loading ? props.loader : + {props.toast.container}

Rate the following players: {pointsLeft}

- {errorMessage && ( + {/* {errorMessage && (

{errorMessage}

- )} + )} */}
diff --git a/src/pages/teamformation/teamformation.js b/src/pages/teamformation/teamformation.js index eab9188..3f4c8fd 100644 --- a/src/pages/teamformation/teamformation.js +++ b/src/pages/teamformation/teamformation.js @@ -3,26 +3,34 @@ import "../../pages/pages.css"; import { useNavigate } from 'react-router-dom'; import { useState, useEffect } from "react"; -const Ratings = () => { +const Ratings = (props) => { const total_budget = 15; + const [loading, setLoading] = useState(false) const [playerArray, setPlayerArray] = useState([]); const [selectedPlayers, setSelectedPlayers] = useState(new Set([])); const [canSubmit, setCanSubmit] = useState(false); - const [budget,setBudget] = useState(total_budget); - const [playerCount,setPlayerCount] = useState(0); + const [budget, setBudget] = useState(total_budget); + const [playerCount, setPlayerCount] = useState(0); const navigate = useNavigate(); const fetchData = () => { - fetch("https://cricwars.herokuapp.com/players/",{ - headers: { "content-type": "application/json", "Authorization":`Token ${localStorage.getItem("auth-token")}` } + setLoading(true) + fetch("https://cricwars.herokuapp.com/players/", { + headers: { "content-type": "application/json", "Authorization": `Token ${localStorage.getItem("auth-token")}` } }) // Change URL .then((response) => { + setLoading(false) return response.json(); }) .then((data) => { console.log(data); setPlayerArray(data); - }); + setLoading(false) + }) + .catch((err) => { + setLoading(false); + props.toast.toast.error("Error: " + err?.message + ". Couldn't fetch players data!") + }) }; useEffect(() => { @@ -31,46 +39,55 @@ const Ratings = () => { const lakhCrore = (x) => { x = parseFloat(x); - if(x < 1) return `${x*100} Lakh`; + if (x < 1) return `${x * 100} Lakh`; return `${x} Cr`; } - const updateBudgetPlayers = (e,member) => { - if(e.target.checked){ - setBudget(Math.round((budget-parseFloat(member.price)) * 100) / 100); + const updateBudgetPlayers = (e, member) => { + if (e.target.checked) { + setBudget(Math.round((budget - parseFloat(member.price)) * 100) / 100); setPlayerCount(playerCount + 1); } else { - setBudget(Math.round((budget+parseFloat(member.price)) * 100) / 100); + setBudget(Math.round((budget + parseFloat(member.price)) * 100) / 100); setPlayerCount(playerCount - 1); } // setBudget(Math.round(budget * 100) / 100) console.log(playerCount + "Player count") - + } const handleSubmit = (e) => { e.preventDefault(); - let inst = {'selectedPlayers': [...selectedPlayers]}; + setLoading(true) + let inst = { 'selectedPlayers': [...selectedPlayers] }; - if(budget < 0 || playerCount !== 11) return; + if (budget < 0 || playerCount !== 11) return; - fetch("https://cricwars.herokuapp.com/create-team/", { - method: "POST", - headers: { "content-type": "application/json", "Authorization":`Token ${localStorage.getItem("auth-token")}` }, - body: JSON.stringify(inst), - }).then((res) => { - console.log(res); - return res.json(); - - }).then((data) => { - console.log(data); + fetch("https://cricwars.herokuapp.com/create-team/", { + method: "POST", + headers: { "content-type": "application/json", "Authorization": `Token ${localStorage.getItem("auth-token")}` }, + body: JSON.stringify(inst), + }).then((res) => { + setLoading(false) + return res.json(); + + }).then((data) => { + setLoading(false) + props.toast.toast.success("Successfully submitted team!") + setTimeout(() => { navigate("/selected-11"); - }); + }, 1000); + }) + .catch(err => { + setLoading(false); + props.toast.toast.error("Error: " + err?.message) + }) }; - return ( + return (loading ? props.loader : + {props.toast.container}

Select the Best Possible 11 @@ -132,7 +149,7 @@ const Ratings = () => { > Submit - +

diff --git a/src/utils/toastContainer.js b/src/utils/toastContainer.js new file mode 100644 index 0000000..b370b64 --- /dev/null +++ b/src/utils/toastContainer.js @@ -0,0 +1,20 @@ +import { ToastContainer, toast } from "react-toastify"; + +export const ToastUtils = () => { + return ( + <> + + + ) +} + +export default toast; \ No newline at end of file