diff --git a/package-lock.json b/package-lock.json index 56513ed..a935689 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,16 +23,20 @@ "@mui/lab": "^5.0.0-alpha.104", "@mui/material": "^5.10.8", "@mui/styles": "^5.10.10", + "@reach/router": "^1.3.4", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "antd": "^4.23.4", + "bootstrap": "^5.2.3", "material-table": "^2.0.3", "react": "^18.2.0", + "react-bootstrap": "^2.6.0", "react-dom": "^18.2.0", "react-icons": "^4.4.0", "react-router-dom": "^6.4.1", "react-scripts": "5.0.1", + "react-use-cart": "^1.13.0", "recharts": "^2.1.15", "save": "^2.9.0", "web-vitals": "^2.1.4" @@ -4908,6 +4912,32 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@reach/router": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", + "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", + "dependencies": { + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "15.x || 16.x || 16.4.0-alpha.0911da3", + "react-dom": "15.x || 16.x || 16.4.0-alpha.0911da3" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.0.tgz", + "integrity": "sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA==", + "dependencies": { + "@babel/runtime": "^7.6.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.1.tgz", @@ -4916,6 +4946,37 @@ "node": ">=14" } }, + "node_modules/@restart/hooks": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", + "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", + "dependencies": { + "dequal": "^2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.4.1.tgz", + "integrity": "sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@popperjs/core": "^2.11.5", + "@react-aria/ssr": "^3.2.0", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dequal": "^2.0.2", + "dom-helpers": "^5.2.0", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -5856,6 +5917,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "node_modules/@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -7165,6 +7231,24 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.6" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7750,6 +7834,19 @@ "node": ">=10" } }, + "node_modules/create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8411,6 +8508,14 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -10442,6 +10547,11 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "node_modules/gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -10962,6 +11072,14 @@ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -17669,6 +17787,18 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -18446,6 +18576,35 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, + "node_modules/react-bootstrap": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.6.0.tgz", + "integrity": "sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@restart/hooks": "^0.4.6", + "@restart/ui": "^1.4.1", + "@types/react-transition-group": "^4.4.4", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -18801,6 +18960,17 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-use-cart": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/react-use-cart/-/react-use-cart-1.13.0.tgz", + "integrity": "sha512-V3jrNOgBXxTn/RWh1HCEdrQk/jx2xCixdkX1c7Vyl4zxEf9jOuniUnjZSTALO7rQ5226onqmvXxKz1eu0Yz6Iw==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -20680,6 +20850,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -20913,6 +21097,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -25036,11 +25228,54 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, + "@reach/router": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", + "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", + "requires": { + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" + } + }, + "@react-aria/ssr": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.0.tgz", + "integrity": "sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA==", + "requires": { + "@babel/runtime": "^7.6.2" + } + }, "@remix-run/router": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.1.tgz", "integrity": "sha512-eBV5rvW4dRFOU1eajN7FmYxjAIVz/mRHgUE9En9mBn6m3mulK3WTR5C3iQhL9MZ14rWAq+xOlEaCkDiW0/heOg==" }, + "@restart/hooks": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", + "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", + "requires": { + "dequal": "^2.0.2" + } + }, + "@restart/ui": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.4.1.tgz", + "integrity": "sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A==", + "requires": { + "@babel/runtime": "^7.18.3", + "@popperjs/core": "^2.11.5", + "@react-aria/ssr": "^3.2.0", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dequal": "^2.0.2", + "dom-helpers": "^5.2.0", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -25787,6 +26022,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -26758,6 +26998,11 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -27202,6 +27447,15 @@ "yaml": "^1.10.0" } }, + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -27668,6 +27922,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -29178,6 +29437,11 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -29555,6 +29819,14 @@ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -34328,6 +34600,15 @@ "react-is": "^16.13.1" } }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -34873,6 +35154,25 @@ } } }, + "react-bootstrap": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.6.0.tgz", + "integrity": "sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA==", + "requires": { + "@babel/runtime": "^7.17.2", + "@restart/hooks": "^0.4.6", + "@restart/ui": "^1.4.1", + "@types/react-transition-group": "^4.4.4", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -35134,6 +35434,11 @@ "prop-types": "^15.6.2" } }, + "react-use-cart": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/react-use-cart/-/react-use-cart-1.13.0.tgz", + "integrity": "sha512-V3jrNOgBXxTn/RWh1HCEdrQk/jx2xCixdkX1c7Vyl4zxEf9jOuniUnjZSTALO7rQ5226onqmvXxKz1eu0Yz6Iw==" + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -36559,6 +36864,17 @@ "which-boxed-primitive": "^1.0.2" } }, + "uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "requires": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -36728,6 +37044,14 @@ "makeerror": "1.0.12" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/package.json b/package.json index b0614a0..1041428 100644 --- a/package.json +++ b/package.json @@ -18,16 +18,20 @@ "@mui/lab": "^5.0.0-alpha.104", "@mui/material": "^5.10.8", "@mui/styles": "^5.10.10", + "@reach/router": "^1.3.4", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "antd": "^4.23.4", + "bootstrap": "^5.2.3", "material-table": "^2.0.3", "react": "^18.2.0", + "react-bootstrap": "^2.6.0", "react-dom": "^18.2.0", "react-icons": "^4.4.0", "react-router-dom": "^6.4.1", "react-scripts": "5.0.1", + "react-use-cart": "^1.13.0", "recharts": "^2.1.15", "save": "^2.9.0", "web-vitals": "^2.1.4" diff --git a/src/App.js b/src/App.js index 47b009e..f1ef936 100644 --- a/src/App.js +++ b/src/App.js @@ -24,6 +24,10 @@ import Cosmetics from "./component/Cosmetics"; import Lights from "./component/Lights"; import Textiles from "./component/Textiles"; import SignIn from "./component/signIn"; +import Shipping from "./views/Shipping"; +import Cart from './views/Cart' +// import 'bootstrap/dist/css/bootstrap.min.css'; +import { useThemeHook} from './GlobalComponents/ThemeProvider' function App() { return ( @@ -31,7 +35,10 @@ function App() { {/* */} + }/> + }/> }> + } /> } /> } /> diff --git a/src/GlobalComponents/ThemeProvider.js b/src/GlobalComponents/ThemeProvider.js new file mode 100644 index 0000000..2c27863 --- /dev/null +++ b/src/GlobalComponents/ThemeProvider.js @@ -0,0 +1,28 @@ + import React,{ createContext,useState,useEffect, useContext} from "react"; + + const ThemeContext =createContext(); + const ThemeProvider =(props) =>{ + const [theme, setTheme]= useState(JSON.parse(localStorage.getItem('theme')) || false ); + useEffect(()=>{ + localStorage.setItem('theme', JSON.stringify(theme)); + + },[theme]); + const setThemeMode = mode => setTheme(mode); + return( + + {props.children} + + + ) ; + + +}; + +const useThemeHook = () =>{ + const {theme}= useContext(ThemeContext); + return[theme]; +} + +export { +ThemeProvider, ThemeContext, useThemeHook +}; \ No newline at end of file diff --git a/src/assets/image/picture.jpg b/src/assets/image/picture.jpg new file mode 100644 index 0000000..b19cc31 Binary files /dev/null and b/src/assets/image/picture.jpg differ diff --git a/src/component/Description.js b/src/component/Description.js index 37d7e2d..d948f46 100644 --- a/src/component/Description.js +++ b/src/component/Description.js @@ -2,9 +2,11 @@ import React, { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import electronics from '../data/electro'; import allComponents from "../component/styles/allComponents.css"; +import { Button } from "react-bootstrap"; +import { useCart } from 'react-use-cart'; +import Item from 'antd/lib/list/Item'; - -const Description = () => { +const Description = ({item}) => { const params = useParams(); const [elect, setElect] = useState({}); @@ -15,6 +17,7 @@ const Description = () => { } }) }, [elect]) + const { addItem }= useCart(); return ( <> @@ -26,7 +29,7 @@ const Description = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/ElCard.js b/src/component/ElCard.js index 36cee83..6c1eb67 100644 --- a/src/component/ElCard.js +++ b/src/component/ElCard.js @@ -1,9 +1,10 @@ import React from 'react'; import allComponents from "../component/styles/allComponents.css"; - +import { useCart } from 'react-use-cart'; +import { Button } from "react-bootstrap"; const ElCard =({item}) => { const {productName,price,image} =item; - + return ( <>
@@ -14,6 +15,7 @@ const ElCard =({item}) => {
{productName}
{price}
+
diff --git a/src/component/HomeDecorDescription.js b/src/component/HomeDecorDescription.js index a6428d1..9368682 100644 --- a/src/component/HomeDecorDescription.js +++ b/src/component/HomeDecorDescription.js @@ -3,6 +3,9 @@ import { Link, useParams } from 'react-router-dom'; import HomeDecorList from '../data/HomeDecorList'; import allComponents from "../component/styles/allComponents.css"; +import { useCart } from 'react-use-cart'; +import { Button } from "react-bootstrap"; + const HomeDecorDescription = () => { const params = useParams(); @@ -15,6 +18,7 @@ const HomeDecorDescription = () => { } }) }, [elect]) + const { addItem }= useCart(); return ( <> @@ -26,7 +30,7 @@ const HomeDecorDescription = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/HomeLinks.js b/src/component/HomeLinks.js index 466ebd6..555fc32 100644 --- a/src/component/HomeLinks.js +++ b/src/component/HomeLinks.js @@ -13,11 +13,13 @@ const HomeLinks = () => { useEffect(()=> { console.log(window.location.pathname); },[]) + const[cart,setcart]= useState([]) + const [show,setshow] =useState(true); - + const [warning, setwarning]= useState(false); return ( <> -
+
diff --git a/src/component/HomeProductDescription.js b/src/component/HomeProductDescription.js index 7525438..6d25fb3 100644 --- a/src/component/HomeProductDescription.js +++ b/src/component/HomeProductDescription.js @@ -2,6 +2,8 @@ import React, { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import HomeProductList from '../data/HomeProductList'; import allComponents from "../component/styles/allComponents.css"; +import { Button } from "react-bootstrap"; +import { useCart } from 'react-use-cart'; const HomeProductDescription = () => { @@ -15,6 +17,7 @@ const HomeProductDescription = () => { } }) }, [elect]) + const { addItem }= useCart(); return ( <> @@ -26,7 +29,7 @@ const HomeProductDescription = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/SportsDescription.js b/src/component/SportsDescription.js index 8b5b986..9676979 100644 --- a/src/component/SportsDescription.js +++ b/src/component/SportsDescription.js @@ -2,6 +2,9 @@ import React, { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import sportsList from '../data/sportsList'; import allComponents from "../component/styles/allComponents.css"; +import { Button } from "react-bootstrap"; +import { useCart } from 'react-use-cart'; + const SportsDescription = () => { @@ -15,7 +18,7 @@ const SportsDescription = () => { } }) }, [elect]) - + const { addItem }= useCart(); return ( <>
@@ -26,7 +29,7 @@ const SportsDescription = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/ToysDescription.js b/src/component/ToysDescription.js index 8694b17..489c594 100644 --- a/src/component/ToysDescription.js +++ b/src/component/ToysDescription.js @@ -2,6 +2,9 @@ import React, { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import ToysList from '../data/ToysList'; import allComponents from "../component/styles/allComponents.css"; +import { Button } from "react-bootstrap"; +import { useCart } from 'react-use-cart'; + const ToysDescription = () => { @@ -15,7 +18,7 @@ const ToysDescription = () => { } }) }, [elect]) - + const { addItem }= useCart(); return ( <>
@@ -26,7 +29,7 @@ const ToysDescription = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/WomenDescription.js b/src/component/WomenDescription.js index b6bc07b..36cf968 100644 --- a/src/component/WomenDescription.js +++ b/src/component/WomenDescription.js @@ -2,7 +2,9 @@ import React, { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import womenList from '../data/womenList'; import allComponents from "../component/styles/allComponents.css"; +import { Button } from "react-bootstrap"; +import { useCart } from 'react-use-cart'; const WomenDescription = () => { const params = useParams(); @@ -15,7 +17,7 @@ const WomenDescription = () => { } }) }, [elect]) - + const { addItem }= useCart(); return ( <>
@@ -26,7 +28,7 @@ const WomenDescription = () => {

{elect.productName}

{elect.price}

- +
diff --git a/src/component/header.js b/src/component/header.js index f75ad60..a043fb6 100644 --- a/src/component/header.js +++ b/src/component/header.js @@ -13,8 +13,18 @@ import { Link } from "react-router-dom"; import { SidebarData } from "./SidebarData"; import { IconContext } from "react-icons"; import { Icon } from "@mui/material"; +import { useCart } from 'react-use-cart' + +const Header = ({size}) => { +const { + isEmpty, + totalItems, + +}= useCart(); +const [show,setshow] =useState(true); + +const [warning, setwarning]= useState(false); -const Header = () => { const [sidebar, setSidebar] = useState(false); const showSidebar = () => setSidebar(!sidebar); @@ -113,8 +123,9 @@ const Header = () => {

Login

- + + {!isEmpty && {totalItems}}

Cart

{/*

order

*/} diff --git a/src/component/signIn.js b/src/component/signIn.js index 20c7657..852f0be 100644 --- a/src/component/signIn.js +++ b/src/component/signIn.js @@ -1,12 +1,12 @@ import React from "react"; import "./signIn.css"; -import onlineshopping from "../images/cart-image.JPG"; +import picture from'../assets/image/picture.jpg'; function SignIn() { return (
- +
;.
diff --git a/src/index.js b/src/index.js index c39966c..fcd16c7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,17 @@ import React from "react"; import ReactDOM from "react-dom"; - +import { ThemeProvider } from './GlobalComponents/ThemeProvider'; import App from "./App"; +import { CartProvider} from 'react-use-cart' +ReactDOM.render( + + + + + + + + + -ReactDOM.render(,document.querySelector("#root")); +,document.querySelector("#root")); diff --git a/src/routes/index.js b/src/routes/index.js index c05d326..bfc93da 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -5,11 +5,13 @@ import HomeLayout from "../component/Homelayout"; import Dashboard from "../views/Dashbord/Dashboard"; import Dashlayout from "../component/admin/DashLayout"; import Dashbrd from "../Dashbrd/Dashbrd"; +import { ThemeProvider } from './GlobalComponents/ThemeProvider'; const index = () => { return ( <> {/* */} + }/> } /> } /> } /> diff --git a/src/views/Cart.css b/src/views/Cart.css new file mode 100644 index 0000000..3a508ae --- /dev/null +++ b/src/views/Cart.css @@ -0,0 +1,125 @@ +h1{ + text-align: center; + padding-top: 20px; +} +.row{ + justify-content: center; + +} +.table{ + + background-color: white; + margin-bottom: 1px; + width: 100%; + + +} +.image{ + + overflow:hidden; + height: 35rem; + background: white; + + text-align: center; + +} +.image .photo{ + /* padding: 0rem; */ + + +} + +.name{ +margin-top: 80px; +margin-right: 10px; + +} +.productname{ + /* width: 200px; */ + overflow: hidden; + text-overflow: ellipsis; + background:white; + color: black; + font-size: 30px; + margin-right: 20px; + + + +} +.price{ + margin-right: 90px; + width: 14rem; + overflow: hidden; + text-overflow: ellipsis; + background:white; + color: black; + font-size: 20px; +} + +.table2{ + + margin-right: 90px; +display: flex; + +margin-top: 30px; + +} + +.quantity{ + width: 4rem; + overflow: hidden; + text-overflow: ellipsis; + background:white; + color: black; + font-size: 20px; + border-radius: 5px; + border: 0.5px solid; + cursor: pointer; +} +.q1{ + background-color:white; + color: black; + width: 40px; + border-radius: 5px; + border: none; + cursor: pointer; +} +.q2{ + border: none; + background-color:white; + color: black; + width: 15%; + border-radius: 5px; + padding-right: 40px; + cursor: pointer; +} + +.danger{ + background-color: darkgoldenrod; + width: 15%; +border-radius: 5px; +font-size: 15px; +color:white; +border: 1px solid; +cursor: pointer; + +} +.total{ + width: 14rem; + overflow: hidden; + font-size: 25px; + margin-left: 90px; + +} +.cart{ + + cursor: pointer; + font-size: 15px; + margin-left: 90px; + width: 10%; + background-color: darkgoldenrod; + color: white; + border-radius: 5px; + border: 1px solid; + +} \ No newline at end of file diff --git a/src/views/Cart.js b/src/views/Cart.js new file mode 100644 index 0000000..bf6abc5 --- /dev/null +++ b/src/views/Cart.js @@ -0,0 +1,95 @@ +import React, { useState } from "react"; +import { Button , Container, Col ,Row ,Table} from 'react-bootstrap'; +import { useCart} from "react-use-cart"; +import '../views/Cart.css'; + +const Cart=()=>{ +const { +isEmpty, +items, +removeItem, +cartTotal, +updateItemQuantity, +emptyCart, +}= useCart(); + +const[price,setPrice]= useState(0); + + return( + +
+ + +

{ isEmpty? 'The Cart is Empty':"The Cart"}

+
+ + + + + {items.map((item, index)=>{ + return( + + +
+
+ +
+
+ + + +
+ + + + +
+ + + ) + + } + + + + )} + + + +
+ +
+ +
+ {item.productName} + + {item.price} +
+ {!isEmpty && + + +

+Total Price: Rwf .{price} +

+ + + + + +
+ + + } + +
+
+ + ) + +} + +export default Cart; \ No newline at end of file diff --git a/src/views/Shipping.css b/src/views/Shipping.css new file mode 100644 index 0000000..4841b51 --- /dev/null +++ b/src/views/Shipping.css @@ -0,0 +1,68 @@ + + +.form-Shipping h1{ + text-align: center; + font-size:25px; + color:black; +} + + +label{ + margin: 3px; + color: black; + +} + + +.p input{ + width: 60%; + height: 1vh; + border-radius: 6px; + border: none; + margin-left: 40px; + padding: 20px; + +} + +.p select{ + + margin-left: 80px ; +} + +.btn button{ + width:160px; + height: 40px; + border-radius: 10px; + background-color: #CC8032; + color: white; + text-align: center; + border: none; + margin-top: 60px; + margin-left: 170px; + +} +.formone{ + padding-top: 50px; + background-image: url("../assets/image/picture.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: right bottom ; + height: 100vh; + width: 60%; + background-color: rgba(245, 245, 245, 0.685); +} + +.form-Shipping{ + width: 605px; + height:104vh; + border: 0px solid white; + margin: auto; + color:black; + margin-right: 2px; + position: relative; + bottom: 75rem; + border-radius:7px ; +padding: 30px; +background-color:gainsboro +} + \ No newline at end of file diff --git a/src/views/Shipping.js b/src/views/Shipping.js new file mode 100644 index 0000000..2f09125 --- /dev/null +++ b/src/views/Shipping.js @@ -0,0 +1,96 @@ +import React from "react" +import "./Shipping.css"; + + + +const Shipping = () => { + + return ( +
+ + + +
+
+ +
+ +

Shipping Info

+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+ +
+ + + + +
+ + + + +
+ + + + ) + + + +} + + + + +export default Shipping \ No newline at end of file